Skip to content

36.6. pgtypes 库#

36.6.1. 字符串
36.6.2. numeric 类型
36.6.3. date 类型
36.6.4. timestamp 类型
36.6.5. interval 类型
36.6.6. 十进制类型
36.6.7. pgtypeslib 的 errno 值
36.6.8. pgtypeslib 的特殊常量

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);

36.6.1. 字符字符串#

某些函数(如PGTYPESnumeric_to_asc)返回指向新分配的字符字符串的指针。这些结果应使用PGTYPESchar_free而非free释放。(这仅在 Windows 上很重要,在 Windows 上有时需要由同一库进行内存分配和释放。)

36.6.2. numeric 类型#

numeric 类型提供使用任意精度进行计算的功能。有关PostgreSQL服务器中的等效类型,请参见第 8.1 节。由于精度任意,此变量需要能够动态扩展和收缩。这就是为什么只能通过PGTYPESnumeric_newPGTYPESnumeric_free函数在堆上创建 numeric 变量的原因。decimal 类型与 numeric 类似,但精度有限,可以在堆栈和堆上创建。

可以使用以下函数处理 numeric 类型

PGTYPESnumeric_new #

请求指向新分配的 numeric 变量的指针。

numeric *PGTYPESnumeric_new(void);
PGTYPESnumeric_free #

释放 numeric 类型,释放其所有内存。

void PGTYPESnumeric_free(numeric *var);
PGTYPESnumeric_from_asc #

从其字符串表示形式解析 numeric 类型。

numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);

有效格式例如:-2.794+3.44592.49E07-32.84e-4。如果可以成功解析该值,则返回一个有效指针,否则返回 NULL 指针。目前,ECPG 始终解析完整字符串,因此目前不支持将第一个无效字符的地址存储在 *endptr 中。您可以安全地将 endptr 设置为 NULL。

PGTYPESnumeric_to_asc #

返回由 malloc 分配的字符串的指针,其中包含 numeric 类型 num 的字符串表示形式。

char *PGTYPESnumeric_to_asc(numeric *num, int dscale);

将打印 numeric 值,小数位数为 dscale,必要时应用舍入。结果必须使用 PGTYPESchar_free() 释放。

PGTYPESnumeric_add #

将两个 numeric 变量添加到第三个变量中。

int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);

该函数将变量 var1var2 添加到结果变量 result 中。该函数在成功时返回 0,在出错时返回 -1。

PGTYPESnumeric_sub #

减去两个数字变量,并将结果返回到第三个变量中。

int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);

该函数从变量 var1 中减去变量 var2。操作结果存储在变量 result 中。该函数在成功时返回 0,在出错时返回 -1。

PGTYPESnumeric_mul #

将两个数字变量相乘,并将结果返回到第三个变量中。

int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);

该函数将变量 var1var2 相乘。操作结果存储在变量 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,如果 var1var2 相等

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 #

将类型为数字的变量转换为 double。

int PGTYPESnumeric_to_double(numeric *nv, double *dp)

此函数将 nv 指向的变量中的数字值转换为 dp 指向的 double 变量。成功时返回 0,如果发生错误则返回 -1,包括溢出。溢出时,全局变量 errno 将另外设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_int #

将类型为数字的变量转换为 int。

int PGTYPESnumeric_to_int(numeric *nv, int *ip);

此函数将 nv 指向的变量中的数字值转换为 ip 指向的整数变量。成功时返回 0,如果发生错误则返回 -1,包括溢出。溢出时,全局变量 errno 将另外设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_long #

将类型为数字的变量转换为 long。

int PGTYPESnumeric_to_long(numeric *nv, long *lp);

此函数将 nv 指向的变量中的数字值转换为 lp 指向的长整数变量。成功时返回 0,如果发生错误则返回 -1,包括溢出。溢出时,全局变量 errno 将另外设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_decimal #

将类型为数字的变量转换为 decimal。

int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);

该函数将 src 指向的变量中的数字值转换为 dst 指向的十进制变量。如果成功,则返回 0,如果出现错误(包括溢出),则返回 -1。如果溢出,则全局变量 errno 还将设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_from_decimal #

将 decimal 类型的变量转换为 numeric。

int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);

该函数将 src 指向的变量中的十进制值转换为 dst 指向的数字变量。如果成功,则返回 0,如果出现错误,则返回 -1。由于 decimal 类型是 numeric 类型的受限版本,因此此转换不会发生溢出。

36.6.3. 日期类型#

C 中的日期类型使您的程序能够处理 SQL 类型 date 的数据。有关PostgreSQL服务器中同等类型的详细信息,请参见第 8.5 节

可以使用以下函数处理日期类型

PGTYPESdate_from_timestamp #

从时间戳中提取日期部分。

date PGTYPESdate_from_timestamp(timestamp dt);

该函数接收时间戳作为其唯一参数,并从该时间戳中返回提取的日期部分。

PGTYPESdate_from_asc #

从其文本表示形式解析日期。

date PGTYPESdate_from_asc(char *str, char **endptr);

该函数接收 C char* 字符串 str 和指向 C char* 字符串 endptr 的指针。目前,ECPG 始终解析完整字符串,因此当前不支持将第一个无效字符的地址存储在 *endptr 中。您可以安全地将 endptr 设置为 NULL。

请注意,该函数始终假定 MDY 格式的日期,并且 ECPG 中当前没有变量可以更改此格式。

表 36.2 显示了允许的输入格式。

表 36.2. PGTYPESdate_from_asc 的有效输入格式

输入结果
1999 年 1 月 8 日1999 年 1 月 8 日
1999-01-081999 年 1 月 8 日
1/8/19991999 年 1 月 8 日
1/18/19991999 年 1 月 18 日
01/02/032003 年 2 月 1 日
1999-01-081999 年 1 月 8 日
08-01-19991999 年 1 月 8 日
08-01-19991999 年 1 月 8 日
99-01-081999 年 1 月 8 日
08-01-991999 年 1 月 8 日
08-01-062006 年 1 月 8 日
08-01-991999 年 1 月 8 日
19990108ISO 8601;1999 年 1 月 8 日
990108ISO 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 #

从日期类型变量中提取天、月和年的值。

void PGTYPESdate_julmdy(date d, int *mdy);

该函数接收日期 d 和指向 3 个整数值数组 mdy 的指针。变量名表示顺序:mdy[0] 将被设置为包含月份数,mdy[1] 将被设置为天的值,mdy[2] 将包含年。

PGTYPESdate_mdyjul #

根据指定日期的天、月和年的 3 个整数数组创建一个日期值。

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 复制到输出字符串。

表 36.3 指示了一些可能的格式。这将让你了解如何使用此函数。所有输出行都基于同一天:1959 年 11 月 23 日。

表 36.3。PGTYPESdate_fmt_asc 的有效输入格式

格式结果
mmddyy112359
ddmmyy231159
yymmdd591123
yy/mm/dd59/11/23
yy mm dd59 11 23
yy.mm.dd59.11.23
.mm.yyyy.dd..11.1959.23.
mmm. dd, yyyyNov. 23, 1959
mmm dd yyyyNov 23 1959
yyyy dd mm1959 23 11
ddd, mmm. dd, yyyyMon, Nov. 23, 1959
(ddd) mmm. dd, yyyy(Mon) Nov. 23, 1959

PGTYPESdate_defmt_asc #

使用格式掩码将 C char* 字符串转换为类型为日期的值。

int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);

该函数接收一个指针,指向应保存操作结果的日期值 (d)、用于解析日期的格式掩码 (fmt) 和包含日期文本表示形式的 C char* 字符串 (str)。文本表示形式应与格式掩码匹配。但是,您不需要字符串与格式掩码之间进行 1:1 映射。该函数仅分析顺序,并查找指示年份位置的文字 yyyyyy、指示月份位置的 mm 和指示日期位置的 dd

表 36.4 指示了一些可能的格式。这将让您了解如何使用此函数。

表 36.4。rdefmtdate 的有效输入格式

格式字符串结果
ddmmyy21-2-541954-02-21
ddmmyy2-12-541954-12-02
ddmmyy201119541954-11-20
ddmmyy1304641964-04-13
mmm.dd.yyyyMAR-12-19671967-03-12
yy/mm/dd1954, February 3rd1954-02-03
mmm.dd.yyyy0412691969-04-12
yy/mm/ddIn the year 2525, in the month of July, mankind will be alive on the 28th day2525-07-28
dd-mm-yyI said on the 28th of July in the year 25252525-07-28
mmm.dd.yyyy9/14/581958-09-14
yy/mm/dd47/03/291947-03-29
mmm.dd.yyyyoct 28 19751975-10-28
mmddyyNov 14th, 19851985-11-14

36.6.4。时间戳类型#

C 中的时间戳类型使您的程序能够处理 SQL 类型时间戳的数据。有关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 服务器所做的。时区说明符将被静默丢弃。

表 36.5 包含一些输入字符串的示例。

表 36.5. PGTYPEStimestamp_from_asc 的有效输入格式

输入结果
1999-01-08 04:05:061999-01-08 04:05:06
1999 年 1 月 8 日 04:05:06 PST1999-01-08 04:05:06
1999-01-08 04:05:06.789-81999-01-08 04:05:06.789(忽略时区说明符)
J2451187 04:05-08:001999-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,如果发生错误,则返回负值。

你可以对格式掩码使用以下格式说明符。格式说明符与 libcstrftime 函数中使用的格式说明符相同。任何非格式说明符都将复制到输出缓冲区中。

  • %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);

该函数将 ts2 指向的时间戳变量从 ts1 指向的时间戳变量中减去,并将结果存储在 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,如果发生错误,则返回负值。

36.6.5. interval 类型#

C 中的 interval 类型使您的程序能够处理 SQL 类型 interval 的数据。有关PostgreSQL服务器中的等效类型,请参见第 8.5 节

可以使用以下函数来处理间隔类型

PGTYPESinterval_new #

返回指向新分配的间隔变量的指针。

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 #

将类型为间隔的变量转换为其文本表示。

char *PGTYPESinterval_to_asc(interval *span);

该函数将 span 指向的间隔变量转换为 C char*。输出类似于此示例: @ 1 day 12 hours 59 mins 10 secs。结果必须使用 PGTYPESchar_free() 释放。

PGTYPESinterval_copy #

复制类型为间隔的变量。

int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);

该函数将 intvlsrc 指向的间隔变量复制到 intvldest 指向的变量中。请注意,您需要在之前为目标变量分配内存。

36.6.6. 十进制类型#

十进制类型与数字类型类似。但是,它的有效数字的最大精度限制为 30 位。与只能在堆上创建的数字类型不同,十进制类型可以在堆上或栈上创建(通过函数PGTYPESdecimal_newPGTYPESdecimal_free)。在第 36.15 节中描述的Informix兼容模式中,还有许多其他函数处理十进制类型。

可以使用以下函数处理十进制类型,它们不仅包含在libcompat库中。

PGTYPESdecimal_new #

请求指向新分配的十进制变量的指针。

decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free #

释放十进制类型,释放其所有内存。

void PGTYPESdecimal_free(decimal *var);

36.6.7. pgtypeslib 的 errno 值#

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 #

在无法处理无限时间戳值的上下文中遇到无限时间戳值。

36.6.8. pgtypeslib 的特殊常量#

PGTYPESInvalidTimestamp #

类型为时间戳的值,表示无效的时间戳。这是在解析错误时由函数 PGTYPEStimestamp_from_asc 返回的。请注意,由于 timestamp 数据类型的内部表示,PGTYPESInvalidTimestamp 同时也是一个有效的时间戳。它设置为 1899-12-31 23:59:59。为了检测错误,请确保您的应用程序不仅测试 PGTYPESInvalidTimestamp,还测试 errno != 0,每次调用 PGTYPEStimestamp_from_asc 之后。