pgtypes 库将 PostgreSQL 数据库类型映射到可用于 C 程序中相应的 C 类型。它还提供了一些函数,以帮助在 C 中对这些类型进行基本计算,即无需借助于 PostgreSQL 服务器。请参阅以下示例
EXEC SQL BEGIN DECLARE SECTION; date date1; timestamp ts1, tsout; interval iv1; char *out; EXEC SQL END DECLARE SECTION; PGTYPESdate_today(&date1); EXEC SQL SELECT started, duration INTO :ts1, :iv1 FROM datetbl WHERE d=:date1; PGTYPEStimestamp_add_interval(&ts1, &iv1, &tsout); out = PGTYPEStimestamp_to_asc(&tsout); printf("Started + duration: %s\n", out); PGTYPESchar_free(out);
某些函数,如 PGTYPESnumeric_to_asc
返回一个指向新分配的字符串的指针。这些结果应使用 PGTYPESchar_free
释放,而不是 free
。(这仅在 Windows 中很重要,这是因为内存分配和释放有时需要由同一库执行。)
数字类型如果要进行任意精度的计算。有关 PostgreSQL 服务器中的等效类型,请参见 第 8.1 节。由于任意精度,此变量需要能够动态扩展和收缩。这就是为什么只能通过 PGTYPESnumeric_new
和 PGTYPESnumeric_free
函数在堆上创建数字变量的原因。小数类型与此类似,但精度有限,可以在堆栈和堆上创建。
以下函数可用于处理数字类型
PGTYPESnumeric_new
#请求指向新分配的数字变量的指针。
numeric *PGTYPESnumeric_new(void);
PGTYPESnumeric_free
#释放数字类型,释放其所有内存。
void PGTYPESnumeric_free(numeric *var);
PGTYPESnumeric_from_asc
#从其字符串表示解析数字类型。
numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);
有效格式例如:-2
、.794
、+3.44
、592.49E07
或 -32.84e-4
。如果能够成功解析该值,则返回一个有效指针,否则返回空指针。目前,ECPG 始终解析整个字符串,因此它目前不支持将第一个无效字符的地址存储在 *endptr
中。您可以将 endptr
安全地设置为 NULL。
PGTYPESnumeric_to_asc
#返回一个由 malloc
分配的字符串指针,其中包含数字类型 num
的字符串表示。
char *PGTYPESnumeric_to_asc(numeric *num, int dscale);
数字值将使用 dscale
小数位打印,必要时进行舍入。该结果必须使用 PGTYPESchar_free()
释放。
PGTYPESnumeric_add
#将两个数字变量添加到第三个变量中。
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
该函数将变量 var1
和 var2
添加到结果变量 result
中。该函数在成功时返回 0,在出错时返回 -1。
PGTYPESnumeric_sub
#减掉两个数字变量并在第三个中返回结果。
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
该函数将变量 var2
从变量 var1
中减去。运算结果存储在变量 result
中。该函数在成功时返回 0,在出错时返回 -1。
PGTYPESnumeric_mul
#将两个数字变量相乘并在第三个中返回结果。
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
该函数将变量 var1
和 var2
相乘。运算结果存储在变量 result
中。该函数在成功时返回 0,在出错时返回 -1。
PGTYPESnumeric_div
#将两个数字变量相除并在第三个中返回结果。
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
该函数将变量 var1
除以 var2
。运算结果存储在变量 result
中。该函数在成功时返回 0,在出错时返回 -1。
PGTYPESnumeric_cmp
#对两个数字变量进行比较。
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
此函数将两个数字变量进行比较。如果出错,则返回 INT_MAX
。在成功时,该函数会返回三个可能的结果之一
1、如果 var1
大于 var2
-1、如果 var1
小于 var2
0、如果 var1
和 var2
相等
PGTYPESnumeric_from_int
#将一个 int 变量转换为数字变量。
int PGTYPESnumeric_from_int(signed int int_val, numeric *var);
此函数接受一个有符号 int 类型变量并将其存储在数字变量 var
中。成功后,返回 0;失败时,返回 -1。
PGTYPESnumeric_from_long
#将一个 long int 变量转换为数字变量。
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
此函数接受一个有符号 long int 类型变量并将其存储在数字变量 var
中。成功后,返回 0;失败时,返回 -1。
PGTYPESnumeric_copy
#将一个数字变量复制到另一个数字变量中。
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
此函数将 src
指向的变量的值复制到 dst
指向的变量中。成功时,它返回 0;如果出错,则返回 -1。
PGTYPESnumeric_from_double
#将一个 double 类型变量转换为数字变量。
int PGTYPESnumeric_from_double(double d, numeric *dst);
此函数接受一个 double 类型的变量并将结果存储在 dst
指向的变量中。成功时返回 0,发生错误时返回 -1。
PGTYPESnumeric_to_double
#将 numeric 类型的变量转换为 double。
int PGTYPESnumeric_to_double(numeric *nv, double *dp)
此函数将 nv
指向的变量中的 numeric 值转换为 dp
指向的 double 变量中。成功时返回 0,发生错误(包括溢出)时返回 -1。溢出时,全局变量 errno
也将设置为 PGTYPES_NUM_OVERFLOW
。
PGTYPESnumeric_to_int
#将 numeric 类型的变量转换为 int。
int PGTYPESnumeric_to_int(numeric *nv, int *ip);
此函数将 nv
指向的变量中的 numeric 值转换为 ip
指向的整数变量中。成功时返回 0,发生错误(包括溢出)时返回 -1。溢出时,全局变量 errno
也将设置为 PGTYPES_NUM_OVERFLOW
。
PGTYPESnumeric_to_long
#将 numeric 类型的变量转换为 long。
int PGTYPESnumeric_to_long(numeric *nv, long *lp);
此函数将 nv
指向的变量中的 numeric 值转换为 lp
指向的 long 整数变量中。成功时返回 0,发生错误(包括溢出和下溢)时返回 -1。溢出时,全局变量 errno
将被设置为 PGTYPES_NUM_OVERFLOW
,下溢时 errno
将被设置为 PGTYPES_NUM_UNDERFLOW
。
PGTYPESnumeric_to_decimal
#将 numeric 类型的变量转换为 decimal。
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);
此函数将 src
指向的变量中的 numeric 值转换为 dst
指向的 decimal 变量中。成功时返回 0,发生错误(包括溢出)时返回 -1。溢出时,全局变量 errno
也将设置为 PGTYPES_NUM_OVERFLOW
。
PGTYPESnumeric_from_decimal
#将 decimal 类型的变量转换为 numeric。
int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);
此函数将 src
指向的变量中的 decimal 值转换为 dst
指向的 numeric 变量中。成功时返回 0,发生错误时返回 -1。由于 decimal 类型被实现为 numeric 类型的精简版,因此在此转换中不会发生溢出。
C 中的 date 类型让程序可以处理 SQL 类型为 date 的数据。参阅 第 8.5 节,了解 PostgreSQL 服务器中相等类型的说明。
以下函数可用于处理 date 类型
PGTYPESdate_from_timestamp
#从 timestamp 中提取日期部分。
date PGTYPESdate_from_timestamp(timestamp dt);
该函数仅接收一个 timestamp 作为参数,并从该 timestamp 中提取日期部分。
PGTYPESdate_from_asc
#根据文本内容解析日期。
date PGTYPESdate_from_asc(char *str, char **endptr);
该函数接收 C char* 字符串 str
和指向 C char* 字符串 endptr
的指针。当前,ECPG 始终解析完整字符串,因此它不支持将第一个无效字符的地址存储到 *endptr
中。可以将 endptr
安全地设为 NULL。
请注意,该函数始终假定为 MDY 格式的日期,当前也没有变量可以在 ECPG 中更改该格式。
表 34.2 展示了允许的输入格式。
表 34.2。 PGTYPESdate_from_asc
的有效输入格式
输入 | 结果 |
---|---|
1999 年 1 月 8 日 |
1999 年 1 月 8 日 |
1999-01-08 |
1999 年 1 月 8 日 |
1/8/1999 |
1999 年 1 月 8 日 |
1/18/1999 |
1999 年 1 月 18 日 |
01/02/03 |
2003 年 2 月 1 日 |
1999-Jan-08 |
1999 年 1 月 8 日 |
Jan-08-1999 |
1999 年 1 月 8 日 |
08-Jan-1999 |
1999 年 1 月 8 日 |
99-Jan-08 |
1999 年 1 月 8 日 |
08-Jan-99 |
1999 年 1 月 8 日 |
08-Jan-06 |
2006 年 1 月 8 日 |
Jan-08-99 |
1999 年 1 月 8 日 |
19990108 |
ISO 8601;1999 年 1 月 8 日 |
990108 |
ISO 8601;1999 年 1 月 8 日 |
1999.008 |
一年中的年份和日期 |
J2451187 |
儒略日 |
公元前 99 年 1 月 8 日 |
公元前 99 年 |
PGTYPESdate_to_asc
#返回日期变量的文本内容。
char *PGTYPESdate_to_asc(date dDate);
该函数仅接收日期变量 dDate
作为参数。它会输出格式为 1999-01-18
的日期,即以 YYYY-MM-DD
格式输出日期。必须通过 PGTYPESchar_free()
释放该结果。
PGTYPESdate_julmdy
#从 date 类型的变量中提取日期、月份和年份的值。
void PGTYPESdate_julmdy(date d, int *mdy);
此函数接受日期 d
和指向包含 3 个整数值的数组 mdy
的指针。变量名表示顺序:mdy[0]
将被设置为包含月份编号,mdy[1]
将被设置为日期值,mdy[2]
将包含年份。
PGTYPESdate_mdyjul
#根据指定日期的日期、月份和年份创建日期值。
void PGTYPESdate_mdyjul(int *mdy, date *jdate);
该函数接收第一个参数中的 3 个整数的数组 (mdy
),接收第二个参数中的指向应保存操作结果的日期变量类型。
PGTYPESdate_dayofweek
#返回值表示日期的星期数。
int PGTYPESdate_dayofweek(date d);
该函数接收日期变量 d
作为其唯一参数,并返回一个整数,表示该日期的星期数。
0 - 星期日
1 - 星期一
2 - 星期二
3 - 星期三
4 - 星期四
5 - 星期五
6 - 星期六
PGTYPESdate_today
#获取当前日期。
void PGTYPESdate_today(date *d);
该函数接收日期变量 (d
) 的指针,将其设置为当前日期。
PGTYPESdate_fmt_asc
#使用格式掩码将日期变量转换为文本表示形式。
int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);
该函数接收要转换的日期 (dDate
)、格式掩码 (fmtstring
) 和将保存日期文本表示形式的字符串 (outbuf
)。
成功时,返回 0;发生错误时,返回负值。
以下文字是可用的字段说明符
dd
- 月份的天数。
mm
- 年份的月份。
yy
- 年份,以两位数表示。
yyyy
- 年份,以四位数表示。
ddd
- 星期名称(缩写)。
mmm
- 月份名称(缩写)。
所有其它字符以 1:1 复制到输出字符串。
表 34.3 指示了几种可能的格式。这将向你展示如何使用此功能。所有输出行都是基于同一天期:1959 年 11 月 23 日。
表 34.3.PGTYPESdate_fmt_asc
的有效输入格式
格式 | 结果 |
---|---|
mmddyy |
112359 |
ddmmyy |
231159 |
yymmdd |
591123 |
yy/mm/dd |
59/11/23 |
yy mm dd |
59 11 23 |
yy.mm.dd |
59.11.23 |
.mm.yyyy.dd. |
.11.1959.23. |
mmm. dd, yyyy |
Nov. 23, 1959 |
mmm dd yyyy |
Nov 23 1959 |
yyyy dd mm |
1959 23 11 |
ddd, mmm. dd, yyyy |
Mon, Nov. 23, 1959 |
(ddd) mmm. dd, yyyy |
(Mon) Nov. 23, 1959 |
PGTYPESdate_defmt_asc
#使用格式掩码将 C char*
字符串转换成类型为 date 的值。
int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
此功能接收应该保存此操作结果的 date 值的指针(d
)、用于解析日期的格式掩码(fmt
)以及包含日期文本表示形式的 C char* 字符串(str
)。文本表示形式应该与格式掩码匹配。但是你不必对字符串和格式掩码进行 1:1 的映射。此功能只分析顺序,并寻找指示年份位置的文本 yy
或 yyyy
、指示月份位置的 mm
和指示日期位置的 dd
。
表 34.4 指示了几种可能的格式。这将向你展示如何使用此功能。
表 34.4.rdefmtdate
的有效输入格式
格式 | 字符串 | 结果 |
---|---|---|
ddmmyy |
21-2-54 |
1954-02-21 |
ddmmyy |
2-12-54 |
1954-12-02 |
ddmmyy |
20111954 |
1954-11-20 |
ddmmyy |
130464 |
1964-04-13 |
mmm.dd.yyyy |
MAR-12-1967 |
1967-03-12 |
yy/mm/dd |
1954, February 3rd |
1954-02-03 |
mmm.dd.yyyy |
041269 |
1969-04-12 |
yy/mm/dd |
In the year 2525, in the month of July, mankind will be alive on the 28th day |
2525-07-28 |
dd-mm-yy |
I said on the 28th of July in the year 2525 |
2525-07-28 |
mmm.dd.yyyy |
9/14/58 |
1958-09-14 |
yy/mm/dd |
47/03/29 |
1947-03-29 |
mmm.dd.yyyy |
oct 28 1975 |
1975-10-28 |
mmddyy |
Nov 14th, 1985 |
1985-11-14 |
C 中的时间戳类型让你的程序能够处理 SQL 类型 timestamp 的数据。有关 PostgreSQL 服务器中的同等类型,请参见 第 8.5 节。
可以使用以下函数处理时间戳类型
PGTYPEStimestamp_from_asc
#将时间戳从其文本表示形式解析至一个时间戳变量。
timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);
此函数接收待解析的字符串(str
)以及一个 C char* 指针(endptr
)。目前 ECPG 始终解析完整的字符串,因此当前不支持将第一个无效字符的地址存储在 *endptr
中。您可以将 endptr
安全地设置为 NULL。
此函数在成功时返回解析的时间戳。发生错误时,将返回 PGTYPESInvalidTimestamp
,并将 errno
设置为 PGTYPES_TS_BAD_TIMESTAMP
。有关此值的重要说明,请参见 PGTYPESInvalidTimestamp
。
一般来说,输入字符串可以包含允许的日期规范、空白字符和允许的时间规范的任意组合。请注意,ECPG 不支持时区。它可以解析它们,但不执行任何计算,例如 PostgreSQL 服务器执行的计算。时区说明符将被静默丢弃。
表 34.5 包含几个输入字符串示例。
表 34.5。PGTYPEStimestamp_from_asc
的有效输入格式
输入 | 结果 |
---|---|
1999-01-08 04:05:06 |
1999-01-08 04:05:06 |
1999 年 1 月 8 日 04:05:06 PST |
1999-01-08 04:05:06 |
1999-01-08 04:05:06.789-8 |
1999-01-08 04:05:06.789(忽略时区说明符) |
J2451187 04:05-08:00 |
1999-01-08 04:05:00(忽略时区说明符) |
PGTYPEStimestamp_to_asc
#将日期转换为 C char* 字符串。
char *PGTYPEStimestamp_to_asc(timestamp tstamp);
此函数接收时间戳 tstamp
作为其唯一的参数,并返回一个已分配的字符串,其中包含时间戳的文本表示形式。结果必须使用 PGTYPESchar_free()
释放。
PGTYPEStimestamp_current
#检索当前时间戳。
void PGTYPEStimestamp_current(timestamp *ts);
此函数检索当前时间戳,并将其保存到时间戳变量 ts
所指向的位置。
PGTYPEStimestamp_fmt_asc
#使用格式掩码将时间戳变量转换为 C char*。
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);
此函数接收要转换的时间戳的指针作为其第一个参数(ts
)、输出缓冲区的指针(output
)、已为输出缓冲区分配的最大长度(str_len
)以及用于转换的格式掩码 (fmtstr
)。
成功时,此函数返回 0,如果发生错误,则返回负值。
您可以对格式掩码使用以下格式说明符。格式说明符与 libc 中 strftime
函数中使用的格式说明符相同。任何非格式说明符都将复制到输出缓冲区。
%A
- 由完全星期名称的国家表示形式替代。
%a
- 被缩写的星期名国家表示形式替换。
%B
- 被完整月份名国家表示形式替换。
%b
- 被缩写的月份名国家表示形式替换。
%C
- 被 (年份 / 100) 替换,作为十进制数;个位数前加零。
%c
- 被时间和日期国家表示形式替换。
%D
- 等同于 %m/%d/%y
。
%d
- 被月份的日期替换,作为十进制数 (01–31)。
%E*
%O*
- POSIX 区域扩展。以下序列 %Ec
%EC
%Ex
%EX
%Ey
%EY
%Od
%Oe
%OH
%OI
%Om
%OM
%OS
%Ou
%OU
%OV
%Ow
%OW
%Oy
预计提供备用表示。
此外 %OB
实现在表示备用月份名称(独立使用,不提日期)。
%e
- 被月份的日期替换,作为十进制数 (1–31);个位数前加空格。
%F
- 等同于 %Y-%m-%d
。
%G
- 被包含世纪的十进制年代数替换。此年为包含星期大部日期的年份(星期一为星期中的第一天)。
%g
- 被与 %G
中相同的年代替换,但作为没有世纪的十进制数 (00–99)。
%H
- 被 24 小时制时间替换,作为十进制数 (00–23)。
%h
- 与 %b
相同。
%I
- 被 12 小时制时间替换,作为十进制数 (01–12)。
%j
- 被年份中的日期替换,作为十进制数 (001–366)。
%k
- 被 24 小时制时间替换,作为十进制数 (0–23);个位数前加空格。
%l
- 被 12 小时制时间替换,作为十进制数 (1–12);个位数前加空格。
%M
- 被分钟数替换,作为十进制数 (00–59)。
%m
- 被月份替换,作为十进制数 (01–12)。
%n
- 被换行符替换。
%O*
- 与 %E*
相同。
%p
- 使用适当的国家/地区格式替换为 “上午” 或 “下午”。
%R
- 与 %H:%M
相同。
%r
- 与 %I:%M:%S %p
相同。
%S
- 用小数(00-60)替换为秒。
%s
- 用自 UTC 历元以来的秒数替换。
%T
- 与 %H:%M:%S
相同
%t
- 用制表符替换。
%U
- 用一小数(00-53)替换为一年中的周数(周日为一周的第一天)。
%u
- 用一小数(1-7)替换为星期几(周一为一周的第一天)。
%V
- 用一小数(01-53)替换为一年中的周数(周一为一周的第一天)。如果包含 1 月 1 日的一周在新的一年中包含至少四天,则它为第 1 周;否则,它为上一年的最后一周,而下一周为第 1 周。
%v
- 与 %e-%b-%Y
相同。
%W
- 用一小数(00-53)替换为一年中的周数(周一为一周的第一天)。
%w
- 用一小数(0-6)替换为星期几(周日为一周的第一天)。
%X
- 用时间的国家/地区格式替换。
%x
- 用日期的国家/地区格式替换。
%Y
- 用一个小数替换为带有世纪的年份。
%y
- 用一个小数(00-99)替换为没有世纪的年份。
%Z
- 用时区名称替换。
%z
- 用与 UTC 的时差替换;前导加号表示 UTC 以东,减号表示 UTC 以西,小时和分钟分别用两位数字表示,其间没有分隔符(RFC 822 日期标题的常见形式)。
%+
- 用日期和时间的国家/地区格式替换。
%-*
- GNU libc 的扩展。执行数字输出时不执行任何填充。
$_* - GNU libc 的扩展。明确指定填充空间。
%0*
- GNU libc 扩展。显式指定零作为填充。
%%
- 被替换为 %
。
PGTYPEStimestamp_sub
#从另一个时间戳减去一个时间戳,并将结果保存到 interval 类型的变量中。
int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);
该函数会从 ts1
指向的时间戳变量中减去 ts2
指向的时间戳变量,并将结果存储到 iv
指向的 interval 变量中。
成功时,此函数返回 0,如果发生错误,则返回负值。
PGTYPEStimestamp_defmt_asc
#使用格式化掩码从文本表示中解析时间戳值。
int PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d);
该函数在变量 str
中接收时间戳的文本表示以及在变量 fmt
中使用的格式化掩码。结果将存储到 d
指向的变量中。
如果格式化掩码 fmt
为 NULL,函数将回退到默认的格式化掩码,即 %Y-%m-%d %H:%M:%S
。
这是 PGTYPEStimestamp_fmt_asc
的反向函数。请参阅其中的文档以了解可能的格式化掩码条目。
PGTYPEStimestamp_add_interval
#将 interval 变量添加到时间戳变量中。
int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
该函数接收一个指向时间戳变量 tin
的指针和一个指向 interval 变量 span
的指针。它将 interval 添加到时间戳,并将结果时间戳保存到 tout
指向的变量中。
成功时,此函数返回 0,如果发生错误,则返回负值。
PGTYPEStimestamp_sub_interval
#从时间戳变量中减去一个 interval 变量。
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
该函数从 tin
指向的时间戳变量中减去 span
指向的 interval 变量,并将结果保存到 tout
指向的变量中。
成功时,此函数返回 0,如果发生错误,则返回负值。
C 中的 interval 类型使你的程序能够处理 SQL 类型 interval 的数据。请参阅 第 8.5 节 以了解 PostgreSQL 服务器中的等效类型。
可以使用以下函数处理 interval 类型
PGTYPESinterval_new
#返回一个新分配的 interval 变量的指针。
interval *PGTYPESinterval_new(void);
PGTYPESinterval_free
#释放先前分配的间隔变量的内存。
void PGTYPESinterval_free(interval *intvl);
PGTYPESinterval_from_asc
#从其文本表示形式分析间隔。
interval *PGTYPESinterval_from_asc(char *str, char **endptr);
此函数分析输入字符串 str
并且返回对已分配的间隔变量的指针。目前 ECPG 总会分析完整的字符串,因此当前不支持将第一个无效字符的地址存储在 *endptr
中。您可以安全地将 endptr
设置为 NULL。
PGTYPESinterval_to_asc
#将 `interval` 类型的变量转换为其文本表示形式。
char *PGTYPESinterval_to_asc(interval *span);
函数转换 span
指向的间隔变量到 C char*。输出像以下示例一样:@ 1 day 12 hours 59 mins 10 secs
。结果必须用 PGTYPESchar_free()
释放。
PGTYPESinterval_copy
#复制 `interval` 类型的变量。
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);
该函数将 intvlsrc
指向的间隔变量复制到 intvldest
指向的变量。注意,你需要事先为目标变量分配内存。
十进制类型类似于数字类型。不过,它的最大精度限制为 30 个有效数字。不同于只能在堆上创建的数字类型,十进制类型既可以在堆上创建,也可以在栈上创建(通过函数 PGTYPESdecimal_new
和 PGTYPESdecimal_free
)。还有许多其他在 Informix 兼容模式中处理十进制类型的函数,如 第 34.15 节 所述。
下列函数可用于处理十进制类型,并且不只包含在 libcompat
库中。
PGTYPES_NUM_BAD_NUMERIC
#一个参数应该包含一个数字变量(或指向一个数字变量),但实际上它的内存表示是无效的。
PGTYPES_NUM_OVERFLOW
#发生了溢出。因为数字类型几乎可以处理任意精度,所以将数字变量转换为其他类型可能会导致溢出。
PGTYPES_NUM_UNDERFLOW
#发生了下溢。因为数字类型几乎可以处理任意精度,所以将数字变量转换为其他类型可能会导致下溢。
PGTYPES_NUM_DIVIDE_ZERO
#已尝试除以零。
PGTYPES_DATE_BAD_DATE
#将一个无效的日期字符串传递给了 PGTYPESdate_from_asc
函数。
PGTYPES_DATE_ERR_EARGS
#将无效的参数传递给了 PGTYPESdate_defmt_asc
函数。
PGTYPES_DATE_ERR_ENOSHORTDATE
#PGTYPESdate_defmt_asc
函数在输入字符串中找到了一个无效的标记。
PGTYPES_INTVL_BAD_INTERVAL
#将一个无效的间隔字符串传递给了 PGTYPESinterval_from_asc
函数,或者将一个无效的间隔值传递给了 PGTYPESinterval_to_asc
函数。
PGTYPES_DATE_ERR_ENOTDMY
#PGTYPESdate_defmt_asc
函数中,在日/月/年的分配中存在不匹配的情况。
PGTYPES_DATE_BAD_DAY
#PGTYPESdate_defmt_asc
函数找到了一个无效的月份天数的值。
PGTYPES_DATE_BAD_MONTH
#PGTYPESdate_defmt_asc
函数找到了一个无效的月份的值。
PGTYPES_TS_BAD_TIMESTAMP
#将一个无效的时间戳字符串传递给了 PGTYPEStimestamp_from_asc
函数,或者将一个无效的时间戳值传递给了 PGTYPEStimestamp_to_asc
函数。
PGTYPES_TS_ERR_EINFTIME
#在无法处理它的上下文中遇到了一个无限的时间戳值。
PGTYPESInvalidTimestamp
#一个表示无效时间戳的 timestamp 类型的值。这是由 PGTYPEStimestamp_from_asc
函数在解析错误时返回的。请注意,由于 timestamp
数据类型的内部表示,PGTYPESInvalidTimestamp
同时也是一个有效时间戳。它被设置为 1899-12-31 23:59:59
。为了检测错误,请确保您的应用程序不仅针对 PGTYPESInvalidTimestamp
进行测试,而且在每次调用 PGTYPEStimestamp_from_asc
后针对 errno != 0
进行测试。