pgtypes 库把 PostgreSQL 数据库类型 映射为可以在 C 程序中使用的 C 等价类型。 它还提供了在 C 中对这些类型进行基本计算的函数, 也就是说,无需 PostgreSQL 服务器的帮助即可完成。
某些函数(例如 PGTYPESnumeric_to_asc)
会返回一个指向新分配的字符串的指针。
这些结果应当用 PGTYPESchar_free 而不是
free 来释放。
(这一点很重要,因为在 Windows 上,
只有当可执行文件和库都使用相同的内存分配函数
来分配和释放内存时,它才能工作。)
numeric 类型支持任意精度的计算。
服务器中与之等价的类型见
Section 8.1。
由于精度是任意的,这个变量需要分配的内存大小是可变的。
因此只能在堆上创建 numeric 类型的变量。
变量 numeric 类型的变量是用
PGTYPESnumeric_new 和
PGTYPESnumeric_free 函数创建和释放的。
以下函数可用于操作 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 #把两个 numeric 变量相减,结果存入第三个变量。
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
该函数从变量 var1
中减去变量 var2。操作结果存储在变量
result 中。
该函数成功时返回 0,出错时返回 -1。
PGTYPESnumeric_mul #把两个 numeric 变量相乘,结果存入第三个变量。
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
该函数把变量 var1 和
var2 相乘。操作结果存储在变量
result 中。
该函数成功时返回 0,出错时返回 -1。
PGTYPESnumeric_div #把两个 numeric 变量相除,结果存入第三个变量。
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
该函数用变量 var2 除变量
var1。操作结果存储在变量
result 中。
该函数成功时返回 0,出错时返回 -1。
PGTYPESnumeric_cmp #比较两个 numeric 变量。
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
该函数比较两个 numeric 变量。出错时返回
INT_MAX。成功时,该函数返回以下三种可能
结果之一:
1,如果 var1 大于
var2
-1,如果 var1 小于
var2
0,如果 var1 与
var2 相等
PGTYPESnumeric_from_int #把一个 int 变量转换为一个 numeric 变量。
int PGTYPESnumeric_from_int(signed int int_val, numeric *var);
该函数接受一个 signed int 类型的变量,并把它存储在 numeric
变量 var 中。成功时返回 0,
失败时返回 -1。
PGTYPESnumeric_from_long #把一个 long int 变量转换为一个 numeric 变量。
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
该函数接受一个 signed long int 类型的变量,并把它存储在
numeric 变量 var 中。成功时返回 0,
失败时返回 -1。
PGTYPESnumeric_copy #把一个 numeric 变量的值复制到另一个变量中。
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
该函数把 src 所指向变量的值复制到
dst 所指向的变量中。成功时返回 0,
发生错误时返回 -1。
PGTYPESnumeric_from_double #把一个 double 类型的变量转换为一个 numeric。
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
所指向的长整数变量。成功时返回 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 的数据。服务器中与之等价的类型见 Section 8.5。
以下函数可用于操作 date 类型:
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 中没有可以改变这一行为的变量。
Table 34.2 展示了允许的输入格式。
Table 34.2. Valid Input Formats for PGTYPESdate_from_asc
| Input | Result |
|---|---|
January 8, 1999 | January 8, 1999 |
1999-01-08 | January 8, 1999 |
1/8/1999 | January 8, 1999 |
1/18/1999 | January 18, 1999 |
01/02/03 | February 1, 2003 |
1999-Jan-08 | January 8, 1999 |
Jan-08-1999 | January 8, 1999 |
08-Jan-1999 | January 8, 1999 |
99-Jan-08 | January 8, 1999 |
08-Jan-99 | January 8, 1999 |
08-Jan-06 | January 8, 2006 |
Jan-08-99 | January 8, 1999 |
19990108 | ISO 8601; January 8, 1999 |
990108 | ISO 8601; January 8, 1999 |
1999.008 | year and day of year |
J2451187 | Julian day |
January 8, 99 BC | year 99 before the Common Era |
PGTYPESdate_to_asc #返回一个 date 变量的文本表示。
char *PGTYPESdate_to_asc(date dDate);
该函数以 date 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 #用一个指定日期的日、月、年的 3 个整数的数组 创建一个 date 值。
void PGTYPESdate_mdyjul(int *mdy, date *jdate);
该函数以 3 个整数组成的数组(mdy)
作为第一个参数,并以一个指向 date 类型变量的指针
作为第二个参数,该变量将保存这一操作的结果。
PGTYPESdate_dayofweek #返回一个表示 date 值是星期几的数字。
int PGTYPESdate_dayofweek(date d);
该函数以 date 变量 d 作为其唯一参数,
并返回一个指出该日期是星期几的整数。
0 - 星期日
1 - Monday
2 - Tuesday
3 - Wednesday
4 - Thursday
5 - Friday
6 - Saturday
PGTYPESdate_today #获取当前日期。
void PGTYPESdate_today(date *d);
该函数接收一个指向 date 变量(d)的指针,
并把它设置为当前日期。
PGTYPESdate_fmt_asc #使用一个格式掩码把一个 date 类型的变量 转换为它的文本表示。
int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);
该函数接收要转换的日期(dDate)、
格式掩码(fmtstring)
以及将保存该日期文本表示的字符串(out
buf)。
成功时返回 0,发生错误时返回一个负值。
以下字面值是你可用的字段说明符:
dd - 月份中日的编号。
mm - 一年中月份的编号。
yy - 两位数字表示的年份。
yyyy - 四位数字表示的年份。
ddd - 星期几的名称(缩写)。
mmm - 月份的名称(缩写)。
All other characters are copied 1:1 to the output string.
Table 34.3 给出了几种可能的格式。 这能让你了解如何使用这个函数。 所有输出行都基于同一个日期:1959 年 11 月 23 日。
Table 34.3. Valid Input Formats for PGTYPESdate_fmt_asc
| Format | Result |
|---|---|
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)以及要解析的日期字符串
(str)。
Table 34.4 给出了几种可能的格式。 这能让你了解如何使用这个函数。
Table 34.4. Valid Input Formats for rdefmtdate
| Format | String | Result |
|---|---|---|
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 中的 timestamp 类型使你的程序能够处理 SQL 类型 timestamp 的数据。服务器中与之等价的类型见 Section 8.5。
以下函数可用于操作 timestamp 类型:
PGTYPEStimestamp_from_asc #把一个时间戳从其文本表示解析到一个时间戳变量中。
timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);
该函数在成功时返回解析出的时间戳。出错时,
会返回 PGTYPESInvalidTimestamp,
并把 errno 设置为
PGTYPES_TS_BAD_TIMESTAMP。
关于该值的重要说明见
PGTYPESInvalidTimestamp。
总的来说,输入字符串可以包含一个允许的日期规定、 一个空白字符和一个允许的时间规定的任意组合。 注意,ECPG 不支持时区。它可以解析时区, 但不会像 PostgreSQL 服务器那样 做任何计算。时区说明符会被静默丢弃。
Table 34.5 包含一些输入字符串的示例。
Table 34.5. Valid Input Formats for PGTYPEStimestamp_from_asc
| Input | Result |
|---|---|
1999-01-08 04:05:06 | 1999-01-08 04:05:06 |
January 8 04:05:06 1999 PST | 1999-01-08 04:05:06 |
1999-Jan-08 04:05:06.789-8 | 1999-01-08 04:05:06.789 (time zone specifier ignored) |
J2451187 04:05-08:00 | 1999-01-08 04:05:00 (time zone specifier ignored) |
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 #使用格式掩码把一个 timestamp 变量转换为 C char* 字符串。
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);
该函数的第一个参数(ts)是指向要转换的
timestamp 的指针,此外还接收指向输出缓冲区的指针
(output)、为输出缓冲区分配的最大长度
(str_len),以及用于转换的格式掩码
(fmtstr)。
成功时该函数返回 0,发生错误时返回一个负值。
你可以在格式掩码中使用以下格式说明符。这些格式说明符与
libc 中 strftime
函数所使用的相同。任何非格式说明符的字符都会被复制到输出缓冲区中。
%A - 星期几的全名(区域设置相关)。
%a - 星期几的缩写(区域设置相关)。
%B - 月份的全名(区域设置相关)。
%b - 月份名称的缩写(区域设置相关)。
%C - 以十进制数表示的世纪(年份除以 100,截断为整数)。
%c - 日期与时间的表示(区域设置相关)。
%D - is equivalent to
%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 - is equivalent to %Y-%m-%d.
%G - 以带世纪的十进制数表示的年份。该年份是包含该周较大部分的那一年(以星期一作为一周的第一天)。
%g - 以十进制数表示的年份的后两位,与 %G 使用的年份一致。
%H - 以十进制数表示的小时(24 小时制)(00–23)。
%h - the same as %b.
%I - 以十进制数表示的小时(12 小时制)(01–12)。
%j - 以十进制数表示的一年中的日(001–366)。
%k - 以十进制数表示的小时(24 小时制)(0–23);单个数字前会加一个空格。
%l - 以十进制数表示的小时(12 小时制)(1–12);单个数字前会加一个空格。
%M - 以十进制数表示的分钟。
%m - 以十进制数表示的月份(01–12)。
%n - 一个换行符。
%O* - the same as %E*.
%p - 根据给定的时间值表示 AM 或 PM(区域设置相关)。
%R - is equivalent to %H:%M.
%r - is equivalent to %I:%M:%S
%p.
%S - 以十进制数表示的秒。
%s - 自纪元(Epoch,UTC)以来的秒数。
%T - is equivalent to %H:%M:%S
%t - 一个制表符。
%U - 以十进制数表示的一年中的周数(以星期日作为一周的第一天)(00–53)。
%u - 以十进制数表示的星期几(星期一为一周的第一天)(1–7)。
%V - 以十进制数表示的当前年份的周数(星期一作为一周的第一天)(01–53)。
%v - is equivalent to
%e-%b-%Y.
%W - 以十进制数表示的一年中的周数(以星期一作为一周的第一天)(00–53)。
%w - 以十进制数表示的星期几(0–6,星期日为 0)。
%X - 时间的表示(区域设置相关)。
%x - 日期的表示(区域设置相关)。
%Y - 以带世纪的十进制数表示的年份。
%y - 以十进制数表示的不带世纪的年份(00–99)。
%Z - 时区名称或缩写。
%z - 相对 UTC 的时区偏移;前导加号表示 UTC 以东,减号表示 UTC 以西,
后面的小时和分钟各占两位数字,中间没有分隔符
(RFC 3339 第 5.6 节中
Internet 日期/时间格式的一种常见形式)。
%+ - 被替换为日期与时间的国家表示。
%-* - 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)以及一个指向
timestamp 类型变量的指针(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);
该函数接收一个指向 timestamp 变量 tin 的指针、
一个指向 interval 变量 span 的指针,
以及一个指向 timestamp 类型变量 tout 的指针,
它将把 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 的数据。服务器中与之等价的类型见 Section 8.5。
以下函数可用于操作 interval 类型:
PGTYPESinterval_new #返回一个指向新分配的 interval 变量的指针。
PGTYPESinterval_free #释放之前分配的 interval 变量的内存。
void PGTYPESinterval_free(interval *intvl);
PGTYPESinterval_from_asc #从文本表示解析一个 interval。
interval *PGTYPESinterval_from_asc(char *str, char **endptr);
该函数解析输入字符串 str 并返回一个指向
已分配的 interval 变量的指针。出错时会返回 NULL,
并把 errno 设置为
PGTYPES_INTVL_BAD_INTERVAL。
PGTYPESinterval_to_asc #把一个 interval 类型的变量转换为它的文本表示。
char *PGTYPESinterval_to_asc(interval *span);
该函数把 span 所指向的 interval 变量
转换为 C char* 字符串,例如
@ 1 day 12 hours @。
结果必须用 PGTYPESchar_free() 释放。
PGTYPESinterval_copy #复制一个 interval 类型的变量。
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);
该函数把 intvlsrc 所指向的 interval 变量
复制到 intvldest 所指向的变量中。
如果出错则返回一个非零值。
decimal 类型与 numeric 类型相似。但它被限制为
最多 30 位有效数字的精度。与只能在堆上创建的 numeric 类型不同,
decimal 类型可以在栈上或堆上创建
(通过 PGTYPESdecimal_new 和
PGTYPESdecimal_free 函数)。
以下函数可用于操作 decimal 类型,
它们不仅包含在 libcompat 库中。
PGTYPES_NUM_BAD_NUMERIC #一个参数应当包含一个 numeric 变量(或指向它的指针), 但它的数据类型是无效的。
PGTYPES_NUM_OVERFLOW #发生了溢出。由于 numeric 类型可以处理几乎任意的精度, 把一个 numeric 变量转换为其他类型时可能会导致溢出。
PGTYPES_NUM_UNDERFLOW #发生了下溢。由于 numeric 类型可以处理几乎任意的精度, 把一个 numeric 变量转换为其他类型时可能会导致下溢。
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 函数的
interval 字符串无效,或者传给
PGTYPESinterval_to_asc 函数的
interval 值无效。
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。