34 static int DecodeNumber(
int flen,
char *field,
bool haveTextMonth,
35 int fmask,
int *tmask,
38 int fmask,
int *tmask,
43 static int DecodeDate(
char *
str,
int fmask,
int *tmask,
bool *is2digits,
46 int precision,
bool fillzeros);
54 const char *abbr,
pg_tz *tzp,
55 int *offset,
int *isdst);
61 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
62 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}
65 const char *
const months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
66 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec", NULL};
68 const char *
const days[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
69 "Thursday",
"Friday",
"Saturday", NULL};
103 {
"december",
MONTH, 12},
109 {
"february",
MONTH, 2},
118 {
"january",
MONTH, 1},
119 {
"jd",
UNITS, DTK_JULIAN},
121 {
"julian",
UNITS, DTK_JULIAN},
133 {
"november",
MONTH, 11},
136 {
"october",
MONTH, 10},
141 {
"saturday",
DOW, 6},
144 {
"september",
MONTH, 9},
151 {
"thursday",
DOW, 4},
158 {
"wednesday",
DOW, 3},
164 static const int szdatetktbl =
sizeof datetktbl /
sizeof datetktbl[0];
175 {
"cent",
UNITS, DTK_CENTURY},
176 {
"centuries",
UNITS, DTK_CENTURY},
180 {
"days",
UNITS, DTK_DAY},
183 {
"decades",
UNITS, DTK_DECADE},
184 {
"decs",
UNITS, DTK_DECADE},
187 {
"hours",
UNITS, DTK_HOUR},
188 {
"hr",
UNITS, DTK_HOUR},
189 {
"hrs",
UNITS, DTK_HOUR},
193 {
"millennia",
UNITS, DTK_MILLENNIUM},
196 {
"mils",
UNITS, DTK_MILLENNIUM},
197 {
"min",
UNITS, DTK_MINUTE},
198 {
"mins",
UNITS, DTK_MINUTE},
200 {
"minutes",
UNITS, DTK_MINUTE},
202 {
"mons",
UNITS, DTK_MONTH},
204 {
"months",
UNITS, DTK_MONTH},
205 {
"ms",
UNITS, DTK_MILLISEC},
206 {
"msec",
UNITS, DTK_MILLISEC},
208 {
"mseconds",
UNITS, DTK_MILLISEC},
209 {
"msecs",
UNITS, DTK_MILLISEC},
213 {
"sec",
UNITS, DTK_SECOND},
215 {
"seconds",
UNITS, DTK_SECOND},
216 {
"secs",
UNITS, DTK_SECOND},
220 {
"us",
UNITS, DTK_MICROSEC},
221 {
"usec",
UNITS, DTK_MICROSEC},
223 {
"useconds",
UNITS, DTK_MICROSEC},
224 {
"usecs",
UNITS, DTK_MICROSEC},
227 {
"weeks",
UNITS, DTK_WEEK},
230 {
"years",
UNITS, DTK_YEAR},
231 {
"yr",
UNITS, DTK_YEAR},
232 {
"yrs",
UNITS, DTK_YEAR}
235 static const int szdeltatktbl =
sizeof deltatktbl /
sizeof deltatktbl[0];
286 julian = y * 365 - 32167;
287 julian += y / 4 - century + century / 4;
288 julian += 7834 * m / 256 + d;
294 j2date(
int jd,
int *year,
int *month,
int *day)
303 quad = julian / 146097;
304 extra = (julian - quad * 146097) * 4 + 3;
305 julian += 60 + quad * 3 + extra / 146097;
306 quad = julian / 1461;
307 julian -= quad * 1461;
308 y = julian * 4 / 1461;
309 julian = ((y != 0) ? ((julian + 305) % 365) : ((julian + 306) % 366))
313 quad = julian * 2141 / 65536;
314 *day = julian - 7834 * quad / 256;
383 static pg_tz *cache_timezone = NULL;
384 static struct pg_tm cache_tm;
394 cache_timezone = NULL;
401 if (
timestamp2tm(cur_ts, &cache_tz, &cache_tm, &cache_fsec,
404 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
405 errmsg(
"timestamp out of range")));
444 char *end = &cp[precision + 1];
445 bool gotnonzero =
false;
460 remainder = oldval - value * 10;
467 cp[precision] =
'0' + remainder;
469 end = &cp[precision];
514 *fsec += rint(frac * 1000000);
526 extra_days = (int) frac;
541 frac = strtod(cp, &cp);
543 if (*cp !=
'\0' || errno != 0)
545 *fsec = rint(frac * 1000000);
583 char **field,
int *ftype,
int maxfields,
int *numfields)
586 const char *cp = timestr;
587 char *bufp = workbuf;
588 const char *bufend = workbuf + buflen;
596 #define APPEND_CHAR(bufptr, end, newchar) \ 599 if (((bufptr) + 1) >= (end)) \ 600 return DTERR_BAD_FORMAT; \ 601 *(bufptr)++ = newchar; \ 608 if (isspace((
unsigned char) *cp))
620 if (isdigit((
unsigned char) *cp))
623 while (isdigit((
unsigned char) *cp))
631 while (isdigit((
unsigned char) *cp) ||
632 (*cp ==
':') || (*cp ==
'.'))
636 else if (*cp ==
'-' || *cp ==
'/' || *cp ==
'.')
643 if (isdigit((
unsigned char) *cp))
646 while (isdigit((
unsigned char) *cp))
657 while (isdigit((
unsigned char) *cp) || *cp == delim)
664 while (isalnum((
unsigned char) *cp) || *cp == delim)
680 while (isdigit((
unsigned char) *cp))
689 else if (isalpha((
unsigned char) *cp))
695 while (isalpha((
unsigned char) *cp))
707 if (*cp ==
'-' || *cp ==
'/' || *cp ==
'.')
709 else if (*cp ==
'+' || isdigit((
unsigned char) *cp))
722 }
while (*cp ==
'+' || *cp ==
'-' ||
723 *cp ==
'/' || *cp ==
'_' ||
724 *cp ==
'.' || *cp ==
':' ||
725 isalnum((
unsigned char) *cp));
729 else if (*cp ==
'+' || *cp ==
'-')
733 while (isspace((
unsigned char) *cp))
737 if (isdigit((
unsigned char) *cp))
741 while (isdigit((
unsigned char) *cp) ||
742 *cp ==
':' || *cp ==
'.' || *cp ==
'-')
746 else if (isalpha((
unsigned char) *cp))
750 while (isalpha((
unsigned char) *cp))
758 else if (ispunct((
unsigned char) *cp))
814 bool haveTextMonth =
false;
815 bool isjulian =
false;
816 bool is2digits =
false;
818 pg_tz *namedTz = NULL;
819 pg_tz *abbrevTz = NULL;
838 for (i = 0; i < nf; i++)
859 if (errno == ERANGE || val < 0)
885 else if (ptype != 0 ||
893 if (isdigit((
unsigned char) *field[i]) || ptype != 0)
913 if ((cp = strchr(field[i],
'-')) == NULL)
950 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
951 errmsg(
"time zone \"%s\" not recognized",
961 &tmask, &is2digits, tm);
1018 if (errno == ERANGE)
1036 else if (*cp !=
'\0')
1113 time = strtod(cp, &cp);
1114 if (*cp !=
'\0' || errno != 0)
1149 flen = strlen(field[i]);
1150 cp = strchr(field[i],
'.');
1156 &tmask, &is2digits, tm);
1161 else if (cp != NULL && flen - strlen(cp) > 2)
1184 else if (flen >= 6 && (!(fmask & DTK_DATE_M) ||
1197 haveTextMonth, fmask,
1215 tmask =
DTK_M(type);
1274 if ((fmask &
DTK_M(
MONTH)) && !haveTextMonth &&
1281 haveTextMonth =
true;
1399 dterr =
ValidateDate(fmask, isjulian, is2digits, bc, tm);
1425 if (namedTz != NULL)
1438 if (abbrevTz != NULL)
1448 if (tzp != NULL && !(fmask &
DTK_M(
TZ)))
1510 long int before_gmtoff,
1532 if (mytime < 0 && day > 0)
1542 if (mytime < 0 && prevtime > 0)
1546 &before_gmtoff, &before_isdst,
1548 &after_gmtoff, &after_isdst,
1557 *tp = mytime - before_gmtoff;
1558 return -(int) before_gmtoff;
1564 beforetime = mytime - before_gmtoff;
1565 if ((before_gmtoff > 0 &&
1566 mytime < 0 && beforetime > 0) ||
1567 (before_gmtoff <= 0 &&
1568 mytime > 0 && beforetime < 0))
1570 aftertime = mytime - after_gmtoff;
1571 if ((after_gmtoff > 0 &&
1572 mytime < 0 && aftertime > 0) ||
1573 (after_gmtoff <= 0 &&
1574 mytime > 0 && aftertime < 0))
1582 if (beforetime < boundary && aftertime < boundary)
1586 return -(int) before_gmtoff;
1588 if (beforetime > boundary && aftertime >= boundary)
1592 return -(int) after_gmtoff;
1606 if (beforetime > aftertime)
1610 return -(int) before_gmtoff;
1614 return -(int) after_gmtoff;
1656 &abbr_offset, &abbr_isdst))
1678 pg_tz *tzp,
int *isdst)
1691 &abbr_offset, isdst))
1699 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
1700 errmsg(
"timestamp out of range")));
1715 int *offset,
int *isdst)
1722 strlcpy(upabbr, abbr,
sizeof(upabbr));
1723 for (p = (
unsigned char *) upabbr; *p; p++)
1734 *offset = (int) -gmtoff;
1764 bool isjulian =
false;
1765 bool is2digits =
false;
1768 pg_tz *namedTz = NULL;
1769 pg_tz *abbrevTz = NULL;
1770 char *abbrev = NULL;
1784 for (i = 0; i < nf; i++)
1798 if (i == 0 && nf >= 2 &&
1802 &tmask, &is2digits, tm);
1809 if (isdigit((
unsigned char) *field[i]))
1823 if ((cp = strchr(field[i],
'-')) == NULL)
1857 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1858 errmsg(
"time zone \"%s\" not recognized",
1917 if (errno == ERANGE)
1935 else if (*cp !=
'\0')
2011 time = strtod(cp, &cp);
2012 if (*cp !=
'\0' || errno != 0)
2049 flen = strlen(field[i]);
2050 cp = strchr(field[i],
'.');
2059 if (i == 0 && nf >= 2 && ftype[nf - 1] ==
DTK_DATE)
2062 &tmask, &is2digits, tm);
2067 else if (flen - strlen(cp) > 2)
2118 tmask =
DTK_M(type);
2249 dterr =
ValidateDate(fmask, isjulian, is2digits, bc, tm);
2272 if (namedTz != NULL)
2283 *tzp = -(int) gmtoff;
2297 if (abbrevTz != NULL)
2313 if ((fmask & DTK_DATE_M) != DTK_DATE_M)
2327 if (tzp != NULL && !(fmask &
DTK_M(
TZ)))
2343 if ((fmask & DTK_DATE_M) != DTK_DATE_M)
2378 bool haveTextMonth =
false;
2390 while (*str !=
'\0' && !isalnum((
unsigned char) *str))
2397 if (isdigit((
unsigned char) *str))
2399 while (isdigit((
unsigned char) *str))
2402 else if (isalpha((
unsigned char) *str))
2404 while (isalpha((
unsigned char) *str))
2415 for (i = 0; i < nf; i++)
2417 if (isalpha((
unsigned char) *field[i]))
2423 dmask =
DTK_M(type);
2428 haveTextMonth =
true;
2446 for (i = 0; i < nf; i++)
2448 if (field[i] == NULL)
2451 if ((len = strlen(field[i])) <= 0)
2454 dterr =
DecodeNumber(len, field[i], haveTextMonth, fmask,
2569 if (errno == ERANGE)
2575 if (errno == ERANGE)
2589 else if (*cp ==
'.')
2599 else if (*cp ==
':')
2603 if (errno == ERANGE)
2607 else if (*cp ==
'.')
2622 *fsec < INT64CONST(0) ||
2636 int *tmask,
struct pg_tm *
tm,
fsec_t *fsec,
bool *is2digits)
2646 if (errno == ERANGE)
2672 else if (*cp !=
'\0')
2686 switch (fmask & DTK_DATE_M)
2753 if (flen >= 3 && *is2digits)
2806 *is2digits = (flen <= 2);
2821 int *tmask,
struct pg_tm *
tm,
fsec_t *fsec,
bool *is2digits)
2829 if ((cp = strchr(str,
'.')) != NULL)
2838 frac = strtod(cp, NULL);
2841 *fsec = rint(frac * 1000000);
2857 tm->
tm_mday = atoi(str + (len - 2));
2858 *(str + (len - 2)) =
'\0';
2859 tm->
tm_mon = atoi(str + (len - 4));
2860 *(str + (len - 4)) =
'\0';
2876 tm->
tm_sec = atoi(str + 4);
2878 tm->
tm_min = atoi(str + 2);
2889 tm->
tm_min = atoi(str + 2);
2916 if (*str !=
'+' && *str !=
'-')
2921 if (errno == ERANGE)
2929 if (errno == ERANGE)
2935 if (errno == ERANGE)
2940 else if (*cp ==
'\0' && strlen(str) > 3)
2986 int *offset,
pg_tz **tz)
2991 tp = abbrevcache[field];
3009 abbrevcache[field] = tp;
3018 *offset = tp->
value;
3045 tp = datecache[field];
3058 datecache[field] = tp;
3099 bool is_before =
false;
3114 for (i = nf - 1; i >= 0; i--)
3133 Assert(*field[i] ==
'-' || *field[i] ==
'+');
3139 if (strchr(field[i] + 1,
':') != NULL &&
3141 &tmask, tm, fsec) == 0)
3143 if (*field[i] ==
'-')
3208 if (errno == ERANGE)
3222 if (*field[i] ==
'-')
3230 else if (*cp ==
'.')
3233 fval = strtod(cp, &cp);
3234 if (*cp !=
'\0' || errno != 0)
3237 if (*field[i] ==
'-')
3240 else if (*cp ==
'\0')
3250 *fsec += rint(val + fval);
3256 tm->
tm_sec += val / 1000;
3257 val -= (val / 1000) * 1000;
3258 *fsec += rint((val + fval) * 1000);
3264 *fsec += rint(fval * 1000000);
3317 tm->
tm_mon += fval * MONTHS_PER_YEAR * 10;
3324 tm->
tm_mon += fval * MONTHS_PER_YEAR * 100;
3331 tm->
tm_mon += fval * MONTHS_PER_YEAR * 1000;
3410 bool more_signs =
false;
3412 for (i = 1; i < nf; i++)
3414 if (*field[i] ==
'-' || *field[i] ==
'+')
3471 if (!(isdigit((
unsigned char) *str) || *str ==
'-' || *str ==
'.'))
3474 val = strtod(str, endptr);
3476 if (*endptr == str || errno != 0)
3479 if (val < INT_MIN || val > INT_MAX)
3483 *ipart = (int) floor(val);
3485 *ipart = (int) -floor(-val);
3486 *fpart = val - *ipart;
3498 if (*fieldstart ==
'-')
3500 return strspn(fieldstart,
"0123456789");
3525 bool datepart =
true;
3526 bool havefield =
false;
3531 if (strlen(str) < 2 || str[0] !=
'P')
3587 tm->
tm_mon += (val / 100) % 100;
3670 tm->
tm_min += (val / 100) % 100;
3736 tp = deltacache[field];
3749 deltacache[field] = tp;
3774 (
errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
3775 errmsg(
"date/time field value out of range: \"%s\"",
3781 (
errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
3782 errmsg(
"date/time field value out of range: \"%s\"",
3784 errhint(
"Perhaps you need a different \"datestyle\" setting.")));
3788 (
errcode(ERRCODE_INTERVAL_FIELD_OVERFLOW),
3789 errmsg(
"interval field value out of range: \"%s\"",
3794 (
errcode(ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE),
3795 errmsg(
"time zone displacement out of range: \"%s\"",
3801 (
errcode(ERRCODE_INVALID_DATETIME_FORMAT),
3802 errmsg(
"invalid input syntax for type %s: \"%s\"",
3817 const datetkn *last = base + nel - 1,
3821 while (last >= base)
3823 position = base + ((last - base) >> 1);
3825 result = (int) key[0] - (
int) position->token[0];
3829 result = strncmp(key, position->token,
TOKMAXLEN);
3834 last = position - 1;
3836 base = position + 1;
3862 *str++ = (tz <= 0 ?
'+' :
'-');
3956 memcpy(str,
" BC", 3);
4160 memcpy(str,
" BC", 3);
4177 sprintf(cp,
"%d%c", value, units);
4178 return cp + strlen(cp);
4184 bool *is_zero,
bool *is_before)
4189 (!*is_zero) ?
" " :
"",
4190 (*is_before && value > 0) ?
"+" :
"",
4193 (value != 1) ?
"s" :
"");
4199 *is_before = (value < 0);
4201 return cp + strlen(cp);
4207 bool *is_zero,
bool *is_before)
4214 *is_before = (value < 0);
4217 else if (*is_before)
4219 sprintf(cp,
" %d %s%s", value, units, (value == 1) ?
"" :
"s");
4221 return cp + strlen(cp);
4254 bool is_before =
false;
4255 bool is_zero =
true;
4268 bool has_negative = year < 0 || mon < 0 ||
4269 mday < 0 || hour < 0 ||
4270 min < 0 || sec < 0 || fsec < 0;
4271 bool has_positive = year > 0 || mon > 0 ||
4272 mday > 0 || hour > 0 ||
4273 min > 0 || sec > 0 || fsec > 0;
4274 bool has_year_month = year != 0 || mon != 0;
4275 bool has_day_time = mday != 0 || hour != 0 ||
4276 min != 0 || sec != 0 || fsec != 0;
4277 bool has_day = mday != 0;
4278 bool sql_standard_value = !(has_negative && has_positive) &&
4279 !(has_year_month && has_day_time);
4285 if (has_negative && sql_standard_value)
4297 if (!has_negative && !has_positive)
4301 else if (!sql_standard_value)
4308 char year_sign = (year < 0 || mon < 0) ?
'-' :
'+';
4309 char day_sign = (mday < 0) ?
'-' :
'+';
4310 char sec_sign = (hour < 0 || min < 0 ||
4311 sec < 0 || fsec < 0) ?
'-' :
'+';
4313 sprintf(cp,
"%c%d-%d %c%d %c%d:%02d:",
4314 year_sign, abs(year), abs(mon),
4315 day_sign, abs(mday),
4316 sec_sign, abs(hour), abs(min));
4321 else if (has_year_month)
4323 sprintf(cp,
"%d-%d", year, mon);
4327 sprintf(cp,
"%d %d:%02d:", mday, hour, min);
4334 sprintf(cp,
"%d:%02d:", hour, min);
4345 if (year == 0 && mon == 0 && mday == 0 &&
4346 hour == 0 && min == 0 && sec == 0 && fsec == 0)
4355 if (hour != 0 || min != 0 || sec != 0 || fsec != 0)
4359 if (sec != 0 || fsec != 0)
4361 if (sec < 0 || fsec < 0)
4380 if (is_zero || hour != 0 || min != 0 || sec != 0 || fsec != 0)
4382 bool minus = (hour < 0 || min < 0 || sec < 0 || fsec < 0);
4386 (minus ?
"-" : (is_before ?
"+" :
"")),
4387 abs(hour), abs(min));
4404 if (sec != 0 || fsec != 0)
4407 if (sec < 0 || (sec == 0 && fsec < 0))
4411 else if (!is_before)
4418 (abs(sec) != 1 || fsec != 0) ?
"s" :
"");
4441 for (i = 0; i < nel; i++)
4447 elog(
LOG,
"token too long in %s table: \"%.*s\"",
4455 strcmp(base[i - 1].token, base[i].token) >= 0)
4457 elog(
LOG,
"ordering error in %s table: \"%s\" >= \"%s\"",
4513 if (new_precis < 0 || new_precis == max_precis ||
4514 (old_precis >= 0 && new_precis >= old_precis))
4541 for (i = 0; i < n; i++)
4543 struct tzEntry *abbr = abbrevs +
i;
4545 if (abbr->
zone != NULL)
4550 strlen(abbr->
zone) + 1;
4567 for (i = 0; i < n; i++)
4569 struct tzEntry *abbr = abbrevs +
i;
4574 if (abbr->
zone != NULL)
4589 strlen(abbr->
zone) + 1;
4616 zoneabbrevtbl = tbl;
4618 memset(abbrevcache, 0,
sizeof(abbrevcache));
4636 if (dtza->
tz == NULL)
4644 if (dtza->
tz == NULL)
4646 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
4647 errmsg(
"time zone \"%s\" not recognized",
4649 errdetail(
"This time zone name appears in the configuration file for time zone abbreviation \"%s\".",
4692 pindex = (
int *)
palloc(
sizeof(
int));
4704 INTERVALOID, -1, 0);
4716 if (zoneabbrevtbl == NULL ||
4720 tp = zoneabbrevtbl->
abbrevs + *pindex;
4725 gmtoffset = tp->
value;
4729 gmtoffset = tp->
value;
4745 is_dst = (
bool) isdst;
4749 elog(
ERROR,
"unrecognized timezone type %d", (
int) tp->
type);
4755 MemSet(nulls, 0,
sizeof(nulls));
4762 for (p = (
unsigned char *) buffer; *p; p++)
4810 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4811 errmsg(
"set-valued function called in context that cannot accept a set")));
4814 (
errcode(ERRCODE_SYNTAX_ERROR),
4815 errmsg(
"materialize mode required, but it is not allowed in this context")));
4821 elog(
ERROR,
"return type must be a row type");
4843 &tzoff, &
tm, &fsec, &tzn, tz) != 0)
4855 if (tzn && strlen(tzn) > 31)
4858 MemSet(nulls, 0,
sizeof(nulls));
4864 itm.tm_sec = -tzoff;
void EncodeDateOnly(struct pg_tm *tm, int style, char *str)
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, Datum *values, bool *isnull)
#define INTSTYLE_POSTGRES_VERBOSE
void GetCurrentDateTime(struct pg_tm *tm)
#define IsA(nodeptr, _type_)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
int errhint(const char *fmt,...)
void DateTimeParseError(int dterr, const char *str, const char *datatype)
#define APPEND_CHAR(bufptr, end, newchar)
int pg_next_dst_boundary(const pg_time_t *timep, long int *before_gmtoff, int *before_isdst, pg_time_t *boundary, long int *after_gmtoff, int *after_isdst, const pg_tz *tz)
PGDLLIMPORT pg_tz * session_timezone
static const datetkn * deltacache[MAXDATEFIELDS]
TupleDesc CreateTemplateTupleDesc(int natts)
#define castNode(_type_, nodeptr)
void InstallTimeZoneAbbrevs(TimeZoneAbbrevTable *tbl)
int32 exprTypmod(const Node *expr)
#define SRF_IS_FIRSTCALL()
static const datetkn datetktbl[]
Datum pg_timezone_abbrevs(PG_FUNCTION_ARGS)
static char * EncodeTimezone(char *str, int tz, int style)
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
static pg_tz * FetchDynamicTimeZone(TimeZoneAbbrevTable *tbl, const datetkn *tp)
static int DetermineTimeZoneOffsetInternal(struct pg_tm *tm, pg_tz *tzp, pg_time_t *tp)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
char * pg_ultostr_zeropad(char *str, uint32 value, int32 minwidth)
bool CheckDateTokenTables(void)
void EncodeTimeOnly(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, int style, char *str)
unsigned char pg_tolower(unsigned char ch)
void pg_tzenumerate_end(pg_tzenum *dir)
int errcode(int sqlerrcode)
#define MemSet(start, val, len)
static int DecodeNumberField(int len, char *str, int fmask, int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits)
int DecodeUnits(int field, char *lowtoken, int *val)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
char * pg_ultostr(char *str, uint32 value)
#define INTERVAL_FULL_RANGE
#define SRF_PERCALL_SETUP()
static void AdjustFractSeconds(double frac, struct pg_tm *tm, fsec_t *fsec, int scale)
static const int szdeltatktbl
int DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp)
pg_tz * pg_tzset(const char *tzname)
#define SRF_RETURN_NEXT(_funcctx, _result)
int DecodeDateTime(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp)
const char *const months[]
#define DTERR_FIELD_OVERFLOW
int DecodeTimezoneAbbrev(int field, char *lowtoken, int *offset, pg_tz **tz)
#define MAX_INTERVAL_PRECISION
#define IntervalPGetDatum(X)
static bool CheckDateTokenTable(const char *tablename, const datetkn *base, int nel)
static char * AddISO8601IntPart(char *cp, int value, char units)
#define DTERR_INTERVAL_OVERFLOW
bool pg_interpret_timezone_abbrev(const char *abbrev, const pg_time_t *timep, long int *gmtoff, int *isdst, const pg_tz *tz)
int DecodeTimezone(char *str, int *tzp)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
const char * pg_get_timezone_name(pg_tz *tz)
datetkn abbrevs[FLEXIBLE_ARRAY_MEMBER]
static const datetkn * datebsearch(const char *key, const datetkn *base, int nel)
static const datetkn deltatktbl[]
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
int errdetail(const char *fmt,...)
#define USE_POSTGRES_DATES
bool time_overflows(int hour, int min, int sec, fsec_t fsec)
pg_time_t timestamptz_to_time_t(TimestampTz t)
void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
#define MAX_TIMESTAMP_PRECISION
int strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits, struct pg_tm *tm)
void GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp)
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
#define IS_VALID_JULIAN(y, m, d)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
void j2date(int jd, int *year, int *month, int *day)
static char * AddPostgresIntPart(char *cp, int value, const char *units, bool *is_zero, bool *is_before)
int DecodeISO8601Interval(char *str, int *dtype, struct pg_tm *tm, fsec_t *fsec)
static int ParseFractionalSecond(char *cp, fsec_t *fsec)
TimestampTz GetCurrentTransactionStartTimestamp(void)
#define DTERR_TZDISP_OVERFLOW
void EncodeInterval(struct pg_tm *tm, fsec_t fsec, int style, char *str)
char zone[FLEXIBLE_ARRAY_MEMBER]
Tuplestorestate * tuplestore_begin_heap(bool randomAccess, bool interXact, int maxKBytes)
int DetermineTimeZoneAbbrevOffsetTS(TimestampTz ts, const char *abbr, pg_tz *tzp, int *isdst)
Node * TemporalSimplify(int32 max_precis, Node *node)
#define INTSTYLE_ISO_8601
static char * AppendTimestampSeconds(char *cp, struct pg_tm *tm, fsec_t fsec)
static void AdjustFractDays(double frac, struct pg_tm *tm, fsec_t *fsec, int scale)
static char * AddVerboseIntPart(char *cp, int value, const char *units, bool *is_zero, bool *is_before)
int date2j(int y, int m, int d)
#define ereport(elevel,...)
static int DecodeTime(char *str, int fmask, int range, int *tmask, struct pg_tm *tm, fsec_t *fsec)
static void ClearPgTm(struct pg_tm *tm, fsec_t *fsec)
void dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
size_t strlcpy(char *dst, const char *src, size_t siz)
SetFunctionReturnMode returnMode
#define Assert(condition)
pg_tzenum * pg_tzenumerate_start(void)
static int ISO8601IntegerWidth(char *fieldstart)
MemoryContext multi_call_memory_ctx
static rewind_source * source
static int list_length(const List *l)
static int DecodeNumber(int flen, char *field, bool haveTextMonth, int fmask, int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits)
int DecodeSpecial(int field, char *lowtoken, int *val)
#define HeapTupleGetDatum(tuple)
MemoryContext ecxt_per_query_memory
Tuplestorestate * setResult
static TimeZoneAbbrevTable * zoneabbrevtbl
Datum pg_timezone_names(PG_FUNCTION_ARGS)
static Datum values[MAXATTR]
static char * AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros)
pg_tz * pg_tzenumerate_next(pg_tzenum *dir)
#define INTSTYLE_SQL_STANDARD
static const datetkn * datecache[MAXDATEFIELDS]
int errmsg(const char *fmt,...)
static const datetkn * abbrevcache[MAXDATEFIELDS]
static const int szdatetktbl
static int ParseISO8601Number(char *str, char **endptr, int *ipart, double *fpart)
int DecodeInterval(char **field, int *ftype, int nf, int range, int *dtype, struct pg_tm *tm, fsec_t *fsec)
#define CStringGetTextDatum(s)
static bool DetermineTimeZoneAbbrevOffsetInternal(pg_time_t t, const char *abbr, pg_tz *tzp, int *offset, int *isdst)
#define POSTGRES_EPOCH_JDATE
bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff)
int ParseDateTime(const char *timestr, char *workbuf, size_t buflen, char **field, int *ftype, int maxfields, int *numfields)
#define DTERR_MD_FIELD_OVERFLOW
unsigned char pg_toupper(unsigned char ch)
int DetermineTimeZoneAbbrevOffset(struct pg_tm *tm, const char *abbr, pg_tz *tzp)
TimeZoneAbbrevTable * ConvertTimeZoneAbbrevs(struct tzEntry *abbrevs, int n)
Datum now(PG_FUNCTION_ARGS)
Node * relabel_to_typmod(Node *expr, int32 typmod)
#define offsetof(type, field)
#define MAX_TIME_PRECISION
#define SRF_RETURN_DONE(_funcctx)
int ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc, struct pg_tm *tm)
#define INTSTYLE_POSTGRES
#define SRF_FIRSTCALL_INIT()
int tm2interval(struct pg_tm *tm, fsec_t fsec, Interval *span)