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上很重要,因为Windows上的内存分配和释放有时候需要由同一个库完成)。
numeric类型用来完成对任意精度的计算。PostgreSQL服务器中等效的类型请见Section 8.1。因为要用于任意精度,这种变量需要能够动态地扩展和收缩。这也是为什么你只能用PGTYPESnumeric_new和PGTYPESnumeric_free函数在堆上创建numeric变量。decimal类型与numeric类型相似但是在精度上有限制,decimal类型可以在堆上创建也可以在栈上创建。
可以使用以下函数处理 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变量相加放到第三个numeric变量中。
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
该函数把变量var1和var2相加放到结果变量result中。成功时该函数返回 0,出错时返回 -1。
PGTYPESnumeric_sub把两个numeric变量相减并且把结果返回到第三个numeric变量。
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
该函数把变量var2从变量var1中减除。该操作的结果被存储在变量result中。成功时该函数返回 0,出错时返回 -1。
PGTYPESnumeric_mul把两个numeric变量相乘并且把结果返回到第三个numeric变量。
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
该函数把变量var1和var2相乘。该操作的结果被存储在变量result中。成功时该函数返回 0,出错时返回 -1。
PGTYPESnumeric_div把两个numeric变量相除并且把结果返回到第三个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。成功时,该函数返回三种可能结果之一:
var1大于var2则返回 1
如果var1小于var2则返回 -1
如果var1和var2相等则返回 0
PGTYPESnumeric_from_int把一个整数变量转换成一个numeric变量。
int PGTYPESnumeric_from_int(signed int int_val, numeric *var);
这个函数接受一个有符号整型变量并且把它存储在numeric变量var中。成功时返回 0,失败时返回 -1。
PGTYPESnumeric_from_long把一个长整型变量转换成一个numeric变量。
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
这个函数接受一个有符号长整型变量并且把它存储在numeric变量var中。成功时返回 0,失败时返回 -1。
PGTYPESnumeric_copy把一个numeric变量复制到另一个中。
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
这个函数把src指向的变量的值复制到dst指向的变量中。成功时该函数返回 0,出错时返回 -1。
PGTYPESnumeric_from_double把一个双精度类型的变量转换成一个numeric变量。
int PGTYPESnumeric_from_double(double d, numeric *dst);
这个函数接受一个双精度类型的变量并且把结果存储在dst指向的变量中。成功时该函数返回 0,出错时返回 -1。
PGTYPESnumeric_to_double将 numeric 类型的变量转换为 double。
int PGTYPESnumeric_to_double(numeric *nv, double *dp)
该函数将 nv 所指变量中的 numeric 值转换为 double,并存入 dp 所指的变量。成功时返回 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 值转换为 long,并存入 lp 所指的变量。成功时返回 0,发生错误(包括溢出)时返回 -1。发生溢出时,还会将全局变量 errno 设为 PGTYPES_NUM_OVERFLOW。
PGTYPESnumeric_to_decimal将 numeric 类型的变量转换为 decimal。
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);
该函数将 src 所指变量中的 numeric 值转换为 decimal,并存入 dst 所指的变量。成功时返回 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 中的日期类型允许你的程序处理 SQL 日期类型的数据。PostgreSQL服务器的等效类型可见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 的字符串str以及一个指向 C 字符串的指针endptr。当前 ECPG 总是解析完整的字符串并且因此当前不支持将第一个非法字符的地址存储在*endptr中。你可以安全地把endptr设置为 NULL。
注意该函数总是假定格式按照 MDY 格式化并且当前在 ECPG 中没有变体可以改变这种格式。
Table 36.2展示了所有允许的输入格式。
Table 36.2. PGTYPESdate_from_asc的合法输入格式
| 输入 | 结果 |
|---|---|
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 #返回一个日期变量的文本表示。
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 个整数构成的数组创建一个日期值,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 - 月份的名称(简写)。
所有其他字符会被原封不动地复制到输出字符串中。
Table 36.3指出了一些可能的格式。这将给你一些线索如何使用这个函数。所有输出都是基于同一个日期:1959年11月23日。
Table 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* 字符串转换为 date 类型的值。
int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
该函数接受以下参数:指向用于保存操作结果的 date 值的指针(d)、解析日期所用的格式掩码(fmt),以及包含日期文本表示的 C char* 字符串(str)。文本表示应与格式掩码匹配,但字符串与格式掩码不必一一对应(1:1)。该函数只分析先后顺序,并查找表示年份位置的字面值 yy 或 yyyy、表示月份位置的 mm,以及表示日位置的 dd。
Table 36.4给出了一些可能的格式。这将给你一些线索如何使用这个函数。
Table 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 |
C 中的时间戳类型允许你的程序处理 SQL 时间戳类型的数据。PostgreSQL服务器的等效类型可见Section 8.5。
可以使用以下函数处理 timestamp 类型:
PGTYPEStimestamp_from_asc #将时间戳的文本表示解析为 timestamp 变量。
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服务器那样应用任何计算。时区标识符会被静默丢弃。
Table 36.5包含了一些输入字符串的示例。
Table 36.5. PGTYPEStimestamp_from_asc的合法输入格式
| 输入 | 结果 |
|---|---|
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 #将时间戳变量转换为C char*,使用格式掩码。
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);
该函数接收一个指向要转换的时间戳的指针作为第一个参数(ts), 一个指向输出缓冲区的指针(output),已为输出缓冲区分配的最大长度 (str_len),以及用于转换的格式掩码(fmtstr)。
成功时返回 0,发生错误时返回负值。
格式掩码可以使用以下格式说明符。它们与函数 strftime 所用的格式说明符相同,该函数属于 libc。不是格式说明符的内容都会被复制到输出缓冲区。
%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 - 被替换为自纪元时以来的秒数,协调世界时。
%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的指针和一个指向间隔变量span的指针。 它将间隔添加到时间戳中,并将结果时间戳保存在tout指向的变量中。
成功时返回 0,发生错误时返回负值。
PGTYPEStimestamp_sub_interval #从时间戳变量中减去一个 interval 变量。
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
该函数从span指向的时间间隔变量中减去tin指向的时间戳变量,并将结果保存到tout指向的变量中。
成功时返回 0,发生错误时返回负值。
C 中的 interval 类型允许程序处理 SQL interval 类型的数据。PostgreSQL服务器中的等效类型见Section 8.5。
可以使用以下函数处理 interval 类型:
PGTYPESinterval_new #返回一个指向新分配 interval 变量的指针。
interval *PGTYPESinterval_new(void);
PGTYPESinterval_free #释放先前分配的 interval 变量所占用的内存。
void PGTYPESinterval_free(interval *intvl);
PGTYPESinterval_from_asc #从文本表示解析一个区间。
interval *PGTYPESinterval_from_asc(char *str, char **endptr);
该函数解析输入字符串str,并返回一个已分配 interval 变量的指针。目前 ECPG 总是解析整个字符串,因此暂不支持把第一个非法字符的地址存储在*endptr中。可以安全地把endptr设为 NULL。
PGTYPESinterval_to_asc #将 interval 类型的变量转换为文本表示。
char *PGTYPESinterval_to_asc(interval *span);
该函数将 span 所指的 interval 变量转换为 C char*。输出类似于以下示例:@ 1 day 12 hours 59 mins 10 secs。要释放结果,必须调用 PGTYPESchar_free()。
PGTYPESinterval_copy #复制一个 interval 类型变量。
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);
该函数把intvlsrc指向的 interval 变量复制到intvldest指向的 interval 变量中。注意,需要事先为目标变量分配好内存。
decimal类型和numeric类型相似。不过,它被限制为最大精度是 30 个有效位。与numeric类型只能在堆上创建相反,decimal类型既可以在栈上也可以在堆上创建(使用函数PGTYPESdecimal_new 和PGTYPESdecimal_free)。在Section 36.15中描述的Informix兼容模式中有很多其它函数可以处理decimal类型。
以下函数可用于处理 decimal 类型,它们并非只包含在 libcompat 库中。
PGTYPESdecimal_new要求一个指向新分配的decimal变量的指针。
decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free释放一个decimal类型,释放它的所有内存。
void PGTYPESdecimal_free(decimal *var);
PGTYPES_NUM_BAD_NUMERIC一个参数应该包含一个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_ENOSHORTDATEPGTYPESdate_defmt_asc函数在输入字符串中发现了一个非法词元。
PGTYPES_INTVL_BAD_INTERVAL一个非法的区间字符串被传给了PGTYPESinterval_from_asc函数,或者一个非法的区间值被传给了PGTYPESinterval_to_asc函数。
PGTYPES_DATE_ERR_ENOTDMY在PGTYPESdate_defmt_asc函数中有日/月/年不匹配的赋值。
PGTYPES_DATE_BAD_DAYPGTYPESdate_defmt_asc函数发现了月中的一个非法日值。
PGTYPES_DATE_BAD_MONTHPGTYPESdate_defmt_asc函数发现了一个非法的月值。
PGTYPES_TS_BAD_TIMESTAMP一个非法的时间戳字符串被传给了PGTYPEStimestamp_from_asc函数,或者一个非法的时间戳值被传给了PGTYPEStimestamp_to_asc函数。
PGTYPES_TS_ERR_EINFTIME在一个无法处理无限时间戳值的环境中遇到了这样一个值。