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_new
和PGTYPESnumeric_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.44
、592.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);
该函数将变量
var1
和var2
添加到结果变量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);
该函数将变量
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
#将类型为数字的变量转换为 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-08
1999 年 1 月 8 日
1/8/1999
1999 年 1 月 8 日
1/18/1999
1999 年 1 月 18 日
01/02/03
2003 年 2 月 1 日
1999-01-08
1999 年 1 月 8 日
08-01-1999
1999 年 1 月 8 日
08-01-1999
1999 年 1 月 8 日
99-01-08
1999 年 1 月 8 日
08-01-99
1999 年 1 月 8 日
08-01-06
2006 年 1 月 8 日
08-01-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
#从日期类型变量中提取天、月和年的值。
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
的有效输入格式格式 结果 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*
字符串转换为类型为日期的值。int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
该函数接收一个指针,指向应保存操作结果的日期值 (
d
)、用于解析日期的格式掩码 (fmt
) 和包含日期文本表示形式的 C char* 字符串 (str
)。文本表示形式应与格式掩码匹配。但是,您不需要字符串与格式掩码之间进行 1:1 映射。该函数仅分析顺序,并查找指示年份位置的文字yy
或yyyy
、指示月份位置的mm
和指示日期位置的dd
。表 36.4 指示了一些可能的格式。这将让您了解如何使用此函数。
表 36.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
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: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);
该函数将
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_new
和PGTYPESdecimal_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
之后。