15 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
16 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
23 {
"acsst",
DTZ, 37800},
24 {
"acst",
DTZ, -14400},
28 {
"aesst",
DTZ, 39600},
32 {
"akdt",
DTZ, -28800},
33 {
"akst",
DTZ, -32400},
40 {
"amst",
DTZ, -10800},
43 {
"anast",
DTZ, 46800},
62 {
"awsst",
DTZ, 32400},
101 {
"cetdst",
DTZ, 7200},
102 {
"chadt",
DTZ, 49500},
103 {
"chast",
TZ, 45900},
108 {
"clst",
DTZ, -10800},
124 {
"december",
MONTH, 12},
130 {
"dusst",
DTZ, 21600},
132 {
"easst",
DTZ, -18000},
133 {
"east",
TZ, -21600},
136 {
"east",
DTZ, 14400},
141 {
"edt",
DTZ, -14400},
142 {
"eest",
DTZ, 10800},
144 {
"eetdst",
DTZ, 10800},
153 {
"february",
MONTH, 2},
154 {
"fjst",
DTZ, -46800},
156 {
"fkst",
DTZ, -10800},
166 {
"galt",
TZ, -21600},
167 {
"gamt",
TZ, -32400},
168 {
"gest",
DTZ, 18000},
183 {
"hdt",
DTZ, -32400},
199 {
"idlw",
TZ, -43200},
205 {
"irkst",
DTZ, 32400},
216 {
"january",
MONTH, 1},
228 {
"kgst",
DTZ, 21600},
231 {
"krast",
DTZ, 25200},
234 {
"lhdt",
DTZ, 39600},
240 {
"magst",
DTZ, 43200},
244 {
"mart",
TZ, -34200},
247 {
"mdt",
DTZ, -21600},
250 {
"metdst",
DTZ, 7200},
277 {
"november",
MONTH, 11},
278 {
"novst",
DTZ, 25200},
285 {
"nzdt",
DTZ, 46800},
289 {
"october",
MONTH, 10},
290 {
"omsst",
DTZ, 25200},
293 {
"pdt",
DTZ, -25200},
298 {
"petst",
DTZ, 46800},
308 {
"pmdt",
DTZ, -7200},
315 {
"pyst",
DTZ, -10800},
319 {
"sadt",
DTZ, 37800},
326 {
"saturday",
DOW, 6},
333 {
"september",
MONTH, 9},
347 {
"that",
TZ, -36000},
351 {
"thursday",
DOW, 4},
372 {
"ulast",
DTZ, 32400},
376 {
"uyst",
DTZ, -7200},
378 {
"uzst",
DTZ, 21600},
381 {
"vlast",
DTZ, 39600},
387 {
"wadt",
DTZ, 28800},
396 {
"wednesday",
DOW, 3},
400 {
"wetdst",
DTZ, 3600},
402 {
"wgst",
DTZ, -7200},
406 {
"yakst",
DTZ, 36000},
409 {
"ydt",
DTZ, -28800},
410 {
"yekst",
DTZ, 21600},
493 char *
months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec", NULL};
495 char *
days[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday", NULL};
499 char *
pgtypes_date_months[] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December", NULL};
506 const datetkn *last = base + nel - 1,
512 position = base + ((last - base) >> 1);
514 result = (int)
key[0] - (
int) position->token[0];
598 julian =
y * 365 - 32167;
599 julian +=
y / 4 - century + century / 4;
600 julian += 7834 * m / 256 + d;
606 j2date(
int jd,
int *year,
int *month,
int *day)
615 quad = julian / 146097;
616 extra = (julian - quad * 146097) * 4 + 3;
617 julian += 60 + quad * 3 + extra / 146097;
618 quad = julian / 1461;
619 julian -= quad * 1461;
620 y = julian * 4 / 1461;
621 julian = ((
y != 0) ? (julian + 305) % 365 : (julian + 306) % 366) + 123;
624 quad = julian * 2141 / 65536;
625 *day = julian - 7834 * quad / 256;
626 *month = (quad + 10) % 12 + 1;
727 while (*(
str +
len - 1) ==
'0' && *(
str +
len - 3) !=
'.')
898 strcpy(
str + 3,
" ");
974 time_t time = (time_t) _time;
979 tx = localtime((time_t *) &time);
981 tx = gmtime((time_t *) &time);
997 #if defined(HAVE_STRUCT_TM_TM_ZONE)
1025 #elif defined(HAVE_INT_TIMEZONE)
1088 int *tmask,
struct tm *
tm,
fsec_t *fsec,
bool *is2digits)
1096 if ((cp = strchr(
str,
'.')) != NULL)
1111 for (
i = 0;
i < 6;
i++)
1112 fstr[
i] = *cp !=
'\0' ? *cp++ :
'0';
1198 int *tmask,
struct tm *
tm,
fsec_t *fsec,
bool *is2digits,
bool EuroDates)
1217 tmask,
tm, fsec, is2digits);
1219 *fsec = strtod(cp, &cp);
1223 else if (*cp !=
'\0')
1265 else if ((EuroDates || (fmask &
DTK_M(
MONTH))) &&
1287 else if (!(fmask &
DTK_M(
YEAR)) && (flen >= 4 || flen == 2))
1293 *is2digits = (flen == 2);
1314 bool is2digits =
false;
1324 while (!isalnum((
unsigned char) *
str))
1328 if (isdigit((
unsigned char) *
str))
1330 while (isdigit((
unsigned char) *
str))
1333 else if (isalpha((
unsigned char) *
str))
1335 while (isalpha((
unsigned char) *
str))
1354 for (
i = 0;
i < nf;
i++)
1356 if (isalpha((
unsigned char) *field[
i]))
1388 for (
i = 0;
i < nf;
i++)
1390 if (field[
i] == NULL)
1393 if ((
len = strlen(field[
i])) <= 0)
1396 if (
DecodeNumber(
len, field[
i], fmask, &dmask,
tm, &fsec, &is2digits, EuroDates) != 0)
1451 else if (*cp !=
':')
1459 else if (*cp ==
'.')
1474 for (
i = 0;
i < 6;
i++)
1475 fstr[
i] = *cp !=
'\0' ? *cp++ :
'0';
1515 else if (*cp ==
'\0' && (
len = strlen(
str)) > 3)
1518 if (min < 0 || min >= 60)
1523 if (hr < 0 || hr > 13)
1554 while (*cp !=
'\0' && isalpha((
unsigned char) *cp))
1599 char **field,
int *ftype,
int *numfields,
char **endstr)
1606 while (*(*endstr) !=
'\0')
1614 if (isdigit((
unsigned char) *(*endstr)))
1616 *lp++ = *(*endstr)++;
1617 while (isdigit((
unsigned char) *(*endstr)))
1618 *lp++ = *(*endstr)++;
1621 if (*(*endstr) ==
':')
1624 *lp++ = *(*endstr)++;
1625 while (isdigit((
unsigned char) *(*endstr)) ||
1626 (*(*endstr) ==
':') || (*(*endstr) ==
'.'))
1627 *lp++ = *(*endstr)++;
1630 else if (*(*endstr) ==
'-' || *(*endstr) ==
'/' || *(*endstr) ==
'.')
1633 char *dp = (*endstr);
1635 *lp++ = *(*endstr)++;
1637 if (isdigit((
unsigned char) *(*endstr)))
1640 while (isdigit((
unsigned char) *(*endstr)))
1641 *lp++ = *(*endstr)++;
1647 if (*(*endstr) == *dp)
1650 *lp++ = *(*endstr)++;
1651 while (isdigit((
unsigned char) *(*endstr)) || (*(*endstr) == *dp))
1652 *lp++ = *(*endstr)++;
1658 while (isalnum((
unsigned char) *(*endstr)) || (*(*endstr) == *dp))
1659 *lp++ =
pg_tolower((
unsigned char) *(*endstr)++);
1671 else if (*(*endstr) ==
'.')
1673 *lp++ = *(*endstr)++;
1674 while (isdigit((
unsigned char) *(*endstr)))
1675 *lp++ = *(*endstr)++;
1683 else if (isalpha((
unsigned char) *(*endstr)))
1686 *lp++ =
pg_tolower((
unsigned char) *(*endstr)++);
1687 while (isalpha((
unsigned char) *(*endstr)))
1688 *lp++ =
pg_tolower((
unsigned char) *(*endstr)++);
1694 if (*(*endstr) ==
'-' || *(*endstr) ==
'/' || *(*endstr) ==
'.')
1696 char *dp = (*endstr);
1699 *lp++ = *(*endstr)++;
1700 while (isdigit((
unsigned char) *(*endstr)) || *(*endstr) == *dp)
1701 *lp++ = *(*endstr)++;
1705 else if (isspace((
unsigned char) *(*endstr)))
1711 else if (*(*endstr) ==
'+' || *(*endstr) ==
'-')
1713 *lp++ = *(*endstr)++;
1715 while (isspace((
unsigned char) *(*endstr)))
1718 if (isdigit((
unsigned char) *(*endstr)))
1721 *lp++ = *(*endstr)++;
1722 while (isdigit((
unsigned char) *(*endstr)) ||
1723 (*(*endstr) ==
':') || (*(*endstr) ==
'.'))
1724 *lp++ = *(*endstr)++;
1727 else if (isalpha((
unsigned char) *(*endstr)))
1730 *lp++ =
pg_tolower((
unsigned char) *(*endstr)++);
1731 while (isalpha((
unsigned char) *(*endstr)))
1732 *lp++ =
pg_tolower((
unsigned char) *(*endstr)++);
1739 else if (ispunct((
unsigned char) *(*endstr)))
1781 int *dtype,
struct tm *
tm,
fsec_t *fsec,
bool EuroDates)
1790 bool haveTextMonth =
false;
1791 bool is2digits =
false;
1810 for (
i = 0;
i < nf;
i++)
1854 if (isdigit((
unsigned char) *field[
i]) || ptype != 0)
1874 if ((cp = strchr(field[
i],
'-')) == NULL)
1887 &tmask,
tm, fsec, &is2digits)) < 0)
1905 else if (
DecodeDate(field[
i], fmask, &tmask,
tm, EuroDates) != 0)
1937 if (
i > 0 && (fmask &
DTK_M(
TZ)) != 0 &&
1939 isalpha((
unsigned char) *field[
i - 1]))
1980 else if (*cp !=
'\0')
2031 frac = strtod(cp, &cp);
2034 *fsec = frac * 1000000;
2055 time = strtod(cp, &cp);
2067 &tmask,
tm, fsec, &is2digits)) < 0)
2087 flen = strlen(field[
i]);
2088 cp = strchr(field[
i],
'.');
2093 if (
DecodeDate(field[
i], fmask, &tmask,
tm, EuroDates) != 0)
2097 else if (cp != NULL && flen - strlen(cp) > 2)
2105 &tmask,
tm, fsec, &is2digits)) < 0)
2111 &tmask,
tm, fsec, &is2digits)) < 0)
2116 &tmask,
tm, fsec, &is2digits, EuroDates) != 0)
2192 if ((fmask &
DTK_M(
MONTH)) && !haveTextMonth &&
2198 haveTextMonth =
true;
2369 char *end_position = NULL;
2371 *subst_location = NULL;
2372 int scan_offset = 0;
2379 return end_position;
2383 while (
fmt[scan_offset] ==
'%' &&
fmt[scan_offset + 1])
2393 next_percent = strchr(
fmt + scan_offset,
'%');
2403 subst_location = next_percent;
2404 while (*(subst_location - 1) ==
' ' && subst_location - 1 >
fmt + scan_offset)
2406 last_char = *subst_location;
2407 *subst_location =
'\0';
2423 end_position = strstr(
str,
fmt + scan_offset);
2424 *subst_location = last_char;
2432 end_position =
str + strlen(
str);
2450 if ((
fmt + scan_offset)[0] ==
' ' &&
fmt + scan_offset + 1 == subst_location)
2451 end_position =
str + strlen(
str);
2453 return end_position;
2467 char *strtol_end = NULL;
2469 while (**pstr ==
' ')
2477 last_char = *pstr_end;
2488 while (**pstr ==
' ')
2491 scan_val->
uint_val = (
unsigned int) strtol(*pstr, &strtol_end, 10);
2496 while (**pstr ==
' ')
2499 scan_val->
luint_val = (
unsigned long int) strtol(*pstr, &strtol_end, 10);
2505 if (scan_val->
str_val == NULL)
2509 if (strtol_end && *strtol_end)
2513 *pstr_end = last_char;
2520 int *year,
int *month,
int *day,
2521 int *hour,
int *minute,
int *second,
2540 while (*pfmt ==
' ')
2542 while (*pstr ==
' ')
2592 if (strncmp(
days[
j], pstr, strlen(
days[
j])) == 0)
2596 pstr += strlen(
days[
j]);
2662 strcpy(tmp,
"%m/%d/%y");
2731 if (strncmp(pstr,
"am", 2) == 0)
2737 if (strncmp(pstr,
"a.m.", 4) == 0)
2743 if (strncmp(pstr,
"pm", 2) == 0)
2749 if (strncmp(pstr,
"p.m.", 4) == 0)
2759 if (strncmp(pstr,
"AM", 2) == 0)
2765 if (strncmp(pstr,
"A.M.", 4) == 0)
2771 if (strncmp(pstr,
"PM", 2) == 0)
2777 if (strncmp(pstr,
"P.M.", 4) == 0)
2786 tmp =
pgtypes_alloc(strlen(
"%I:%M:%S %p") + strlen(pstr) + 1);
2787 strcpy(tmp,
"%I:%M:%S %p");
2795 strcpy(tmp,
"%H:%M");
2807 time_t et = (time_t) scan_val.
luint_val;
2813 *year = tms->tm_year + 1900;
2814 *month = tms->tm_mon + 1;
2815 *day = tms->tm_mday;
2816 *hour = tms->tm_hour;
2817 *minute = tms->tm_min;
2818 *second = tms->tm_sec;
2840 strcpy(tmp,
"%H:%M:%S");
2974 (*hour == 24 && (*minute > 0 || *second > 0)))
int tm2timestamp(struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result)
void EncodeDateOnly(struct tm *tm, int style, char *str, bool EuroDates)
int GetEpochTime(struct tm *tm)
int PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp *d, int *year, int *month, int *day, int *hour, int *minute, int *second, int *tz)
void EncodeDateTime(struct tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str, bool EuroDates)
void TrimTrailingZeros(char *str)
void GetCurrentDateTime(struct tm *tm)
static int DecodeTimezone(char *str, int *tzp)
static const datetkn datetktbl[]
static const unsigned int szdatetktbl
static int DecodePosixTimezone(char *str, int *tzp)
static char * find_end_token(char *str, char *fmt)
static const datetkn * deltacache[MAXDATEFIELDS]
static void abstime2tm(AbsoluteTime _time, int *tzp, struct tm *tm, char **tzn)
static const datetkn * datecache[MAXDATEFIELDS]
int DecodeTime(char *str, int *tmask, struct tm *tm, fsec_t *fsec)
int date2j(int y, int m, int d)
static int DecodeNumber(int flen, char *str, int fmask, int *tmask, struct tm *tm, fsec_t *fsec, bool *is2digits, bool EuroDates)
int ParseDateTime(char *timestr, char *lowstr, char **field, int *ftype, int *numfields, char **endstr)
static int DecodeSpecial(int field, char *lowtoken, int *val)
void j2date(int jd, int *year, int *month, int *day)
int DecodeDateTime(char **field, int *ftype, int nf, int *dtype, struct tm *tm, fsec_t *fsec, bool EuroDates)
static int DecodeNumberField(int len, char *str, int fmask, int *tmask, struct tm *tm, fsec_t *fsec, bool *is2digits)
char * pgtypes_date_months[]
char * pgtypes_date_weekdays_short[]
void dt2time(double jd, int *hour, int *min, int *sec, fsec_t *fsec)
int DecodeUnits(int field, char *lowtoken, int *val)
static const unsigned int szdeltatktbl
static const datetkn deltatktbl[]
static int DecodeDate(char *str, int fmask, int *tmask, struct tm *tm, bool EuroDates)
static const datetkn * datebsearch(const char *key, const datetkn *base, unsigned int nel)
static int pgtypes_defmt_scan(union un_fmt_comb *scan_val, int scan_type, char **pstr, char *pfmt)
void err(int eval, const char *fmt,...)
char * pgtypes_strdup(const char *str)
char * pgtypes_alloc(long size)
static void const char * fmt
Assert(fmt[strlen(fmt) - 1] !='\n')
#define USE_POSTGRES_DATES
#define PGTYPES_TS_BAD_TIMESTAMP
#define PGTYPES_TYPE_UINT
#define PGTYPES_TYPE_STRING_MALLOCED
#define PGTYPES_TYPE_UINT_LONG
int pg_strcasecmp(const char *s1, const char *s2)
unsigned char pg_tolower(unsigned char ch)
size_t strlcpy(char *dst, const char *src, size_t siz)
int strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
unsigned long int luint_val
static const unsigned __int64 epoch