36 int fmask,
int *tmask,
39 int fmask,
int *tmask,
42 int *tmask,
struct pg_itm *itm);
48static int DecodeDate(
char *
str,
int fmask,
int *tmask,
bool *is2digits,
51 int precision,
bool fillzeros);
69 const char *abbr,
pg_tz *tzp,
70 int *offset,
int *isdst);
77 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
78 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}
81const char *
const months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
82"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec", NULL};
84const char *
const days[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
85"Thursday",
"Friday",
"Saturday", NULL};
116 {
"august",
MONTH, 8},
120 {
"december",
MONTH, 12},
126 {
"february",
MONTH, 2},
135 {
"january",
MONTH, 1},
150 {
"november",
MONTH, 11},
153 {
"october",
MONTH, 10},
158 {
"saturday",
DOW, 6},
161 {
"september",
MONTH, 9},
168 {
"thursday",
DOW, 4},
175 {
"wednesday",
DOW, 3},
312 century = year / 100;
313 julian = year * 365 - 32167;
314 julian += year / 4 - century + century / 4;
315 julian += 7834 * month / 256 + day;
321j2date(
int jd,
int *year,
int *month,
int *day)
330 quad = julian / 146097;
331 extra = (julian - quad * 146097) * 4 + 3;
332 julian += 60 + quad * 3 + extra / 146097;
333 quad = julian / 1461;
334 julian -= quad * 1461;
335 y = julian * 4 / 1461;
336 julian = ((
y != 0) ? ((julian + 305) % 365) : ((julian + 306) % 366))
340 quad = julian * 2141 / 65536;
341 *day = julian - 7834 * quad / 256;
410 static pg_tz *cache_timezone = NULL;
411 static struct pg_tm cache_tm;
421 cache_timezone = NULL;
428 if (
timestamp2tm(cur_ts, &cache_tz, &cache_tm, &cache_fsec,
431 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
432 errmsg(
"timestamp out of range")));
471 char *end = &cp[precision + 1];
472 bool gotnonzero =
false;
496 end = &cp[precision];
567 else if (frac < -0.5)
593 extra_days = (int) frac;
647 if (val < INT_MIN || val > INT_MAX)
661 if (val < INT_MIN || val > INT_MAX)
676 if (val < INT_MIN || val > INT_MAX)
711 if (strspn(cp + 1,
"0123456789") != strlen(cp + 1))
715 *frac = strtod(cp, &cp);
717 if (*cp !=
'\0' || errno != 0)
736 *fsec = rint(frac * 1000000);
774 char **field,
int *ftype,
int maxfields,
int *numfields)
777 const char *cp = timestr;
778 char *bufp = workbuf;
779 const char *bufend = workbuf + buflen;
787#define APPEND_CHAR(bufptr, end, newchar) \
790 if (((bufptr) + 1) >= (end)) \
791 return DTERR_BAD_FORMAT; \
792 *(bufptr)++ = newchar; \
799 if (isspace((
unsigned char) *cp))
811 if (isdigit((
unsigned char) *cp))
814 while (isdigit((
unsigned char) *cp))
822 while (isdigit((
unsigned char) *cp) ||
823 (*cp ==
':') || (*cp ==
'.'))
827 else if (*cp ==
'-' || *cp ==
'/' || *cp ==
'.')
834 if (isdigit((
unsigned char) *cp))
837 while (isdigit((
unsigned char) *cp))
848 while (isdigit((
unsigned char) *cp) || *cp == delim)
855 while (isalnum((
unsigned char) *cp) || *cp == delim)
871 while (isdigit((
unsigned char) *cp))
880 else if (isalpha((
unsigned char) *cp))
886 while (isalpha((
unsigned char) *cp))
898 if (*cp ==
'-' || *cp ==
'/' || *cp ==
'.')
900 else if (*cp ==
'+' || isdigit((
unsigned char) *cp))
913 }
while (*cp ==
'+' || *cp ==
'-' ||
914 *cp ==
'/' || *cp ==
'_' ||
915 *cp ==
'.' || *cp ==
':' ||
916 isalnum((
unsigned char) *cp));
920 else if (*cp ==
'+' || *cp ==
'-')
924 while (isspace((
unsigned char) *cp))
928 if (isdigit((
unsigned char) *cp))
932 while (isdigit((
unsigned char) *cp) ||
933 *cp ==
':' || *cp ==
'.' || *cp ==
'-')
937 else if (isalpha((
unsigned char) *cp))
941 while (isalpha((
unsigned char) *cp))
949 else if (ispunct((
unsigned char) *cp))
1009 bool haveTextMonth =
false;
1010 bool isjulian =
false;
1011 bool is2digits =
false;
1013 pg_tz *namedTz = NULL;
1014 pg_tz *abbrevTz = NULL;
1016 char *abbrev = NULL;
1017 struct pg_tm cur_tm;
1033 for (
i = 0;
i < nf;
i++)
1054 if (errno == ERANGE || jday < 0)
1080 else if (ptype != 0 ||
1088 if (isdigit((
unsigned char) *field[
i]) || ptype != 0)
1111 if ((cp = strchr(field[
i],
'-')) == NULL)
1152 &tmask, &is2digits,
tm);
1208 if (errno == ERANGE)
1210 if (*cp !=
'.' && *cp !=
'\0')
1264 flen = strlen(field[
i]);
1265 cp = strchr(field[
i],
'.');
1271 &tmask, &is2digits,
tm);
1276 else if (cp != NULL && flen - strlen(cp) > 2)
1299 else if (flen >= 6 && (!(fmask &
DTK_DATE_M) ||
1312 haveTextMonth, fmask,
1389 elog(
ERROR,
"unrecognized RESERV datetime token: %d",
1401 if ((fmask &
DTK_M(
MONTH)) && !haveTextMonth &&
1408 haveTextMonth =
true;
1551 if (namedTz != NULL)
1564 if (abbrevTz != NULL)
1574 if (tzp != NULL && !(fmask &
DTK_M(
TZ)))
1636 long int before_gmtoff,
1658 if (mytime < 0 && day > 0)
1668 if (mytime < 0 && prevtime > 0)
1672 &before_gmtoff, &before_isdst,
1674 &after_gmtoff, &after_isdst,
1683 *tp = mytime - before_gmtoff;
1684 return -(int) before_gmtoff;
1690 beforetime = mytime - before_gmtoff;
1691 if ((before_gmtoff > 0 &&
1692 mytime < 0 && beforetime > 0) ||
1693 (before_gmtoff <= 0 &&
1694 mytime > 0 && beforetime < 0))
1696 aftertime = mytime - after_gmtoff;
1697 if ((after_gmtoff > 0 &&
1698 mytime < 0 && aftertime > 0) ||
1699 (after_gmtoff <= 0 &&
1700 mytime > 0 && aftertime < 0))
1708 if (beforetime < boundary && aftertime < boundary)
1712 return -(int) before_gmtoff;
1714 if (beforetime > boundary && aftertime >= boundary)
1718 return -(int) after_gmtoff;
1732 if (beforetime > aftertime)
1736 return -(int) before_gmtoff;
1740 return -(int) after_gmtoff;
1782 &abbr_offset, &abbr_isdst))
1804 pg_tz *tzp,
int *isdst)
1817 &abbr_offset, isdst))
1825 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
1826 errmsg(
"timestamp out of range")));
1841 int *offset,
int *isdst)
1848 strlcpy(upabbr, abbr,
sizeof(upabbr));
1849 for (p = (
unsigned char *) upabbr; *p; p++)
1860 *offset = (int) -gmtoff;
1875 bool *isfixed,
int *offset,
int *isdst)
1882 strlcpy(upabbr, abbr,
sizeof(upabbr));
1883 for (p = (
unsigned char *) upabbr; *p; p++)
1894 *offset = (int) -gmtoff;
1928 bool isjulian =
false;
1929 bool is2digits =
false;
1932 pg_tz *namedTz = NULL;
1933 pg_tz *abbrevTz = NULL;
1934 char *abbrev = NULL;
1948 for (
i = 0;
i < nf;
i++)
1962 if (
i == 0 && nf >= 2 &&
1966 &tmask, &is2digits,
tm);
1973 if (isdigit((
unsigned char) *field[
i]))
1987 if ((cp = strchr(field[
i],
'-')) == NULL)
2071 if (errno == ERANGE)
2073 if (*cp !=
'.' && *cp !=
'\0')
2130 flen = strlen(field[
i]);
2131 cp = strchr(field[
i],
'.');
2140 if (
i == 0 && nf >= 2 && ftype[nf - 1] ==
DTK_DATE)
2143 &tmask, &is2digits,
tm);
2148 else if (flen - strlen(cp) > 2)
2353 if (namedTz != NULL)
2364 *tzp = -(int) gmtoff;
2378 if (abbrevTz != NULL)
2408 if (tzp != NULL && !(fmask &
DTK_M(
TZ)))
2459 bool haveTextMonth =
false;
2471 while (*
str !=
'\0' && !isalnum((
unsigned char) *
str))
2478 if (isdigit((
unsigned char) *
str))
2480 while (isdigit((
unsigned char) *
str))
2483 else if (isalpha((
unsigned char) *
str))
2485 while (isalpha((
unsigned char) *
str))
2496 for (
i = 0;
i < nf;
i++)
2498 if (isalpha((
unsigned char) *field[
i]))
2509 haveTextMonth =
true;
2527 for (
i = 0;
i < nf;
i++)
2529 if (field[
i] == NULL)
2532 if ((
len = strlen(field[
i])) <= 0)
2644 int *tmask,
struct pg_itm *itm)
2654 if (errno == ERANGE)
2660 if (errno == ERANGE)
2675 else if (*cp ==
'.')
2687 else if (*cp ==
':')
2691 if (errno == ERANGE)
2699 else if (*cp !=
'\0')
2781 int *tmask,
struct pg_tm *
tm,
fsec_t *fsec,
bool *is2digits)
2791 if (errno == ERANGE)
2817 else if (*cp !=
'\0')
2898 if (flen >= 3 && *is2digits)
2951 *is2digits = (flen <= 2);
2966 int *tmask,
struct pg_tm *
tm,
fsec_t *fsec,
bool *is2digits)
2977 if (strspn(
str,
"0123456789.") !=
len)
2984 if ((cp = strchr(
str,
'.')) != NULL)
3008 *(
str + (
len - 2)) =
'\0';
3010 *(
str + (
len - 4)) =
'\0';
3066 if (*
str !=
'+' && *
str !=
'-')
3071 if (errno == ERANGE)
3079 if (errno == ERANGE)
3085 if (errno == ERANGE)
3090 else if (*cp ==
'\0' && strlen(
str) > 3)
3142 int *ftype,
int *offset,
pg_tz **tz,
3157 *ftype = tzc->
ftype;
3170 &isfixed, offset, &isdst))
3172 *ftype = (isfixed ? (isdst ?
DTZ :
TZ) :
DYNTZ);
3175 *offset = -(*offset);
3178 tzc->
ftype = *ftype;
3209 *offset = tp->
value;
3215 tzc->
ftype = *ftype;
3329 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3330 errmsg(
"time zone \"%s\" not recognized", tzname)));
3382 if (*
str ==
'\0' || !isalpha((
unsigned char) *
str))
3386 lowtoken[
len] =
'\0';
3404 &isfixed, offset, &isdst))
3409 *offset = -(*offset);
3443 *offset = tp->
value;
3449 lowtoken[--
len] =
'\0';
3489 bool force_negative =
false;
3490 bool is_before =
false;
3491 bool parsing_unit_val =
false;
3524 force_negative =
true;
3526 for (
i = 1;
i < nf;
i++)
3528 if (*field[
i] ==
'-' || *field[
i] ==
'+')
3530 force_negative =
false;
3537 for (
i = nf - 1;
i >= 0;
i--)
3546 if (force_negative &&
3550 parsing_unit_val =
false;
3560 Assert(*field[
i] ==
'-' || *field[
i] ==
'+');
3566 if (strchr(field[
i] + 1,
':') != NULL &&
3568 &tmask, itm_in) == 0)
3570 if (*field[
i] ==
'-')
3578 if (force_negative &&
3588 parsing_unit_val =
false;
3638 val = strtoi64(field[
i], &cp, 10);
3639 if (errno == ERANGE)
3653 if (*field[
i] ==
'-')
3661 else if (*cp ==
'.')
3666 if (*field[
i] ==
'-')
3669 else if (*cp ==
'\0')
3778 parsing_unit_val =
false;
3784 if (parsing_unit_val)
3797 parsing_unit_val =
true;
3852 if (parsing_unit_val)
3860 itm_in->
tm_mon == INT_MIN ||
3898 if (!(isdigit((
unsigned char) *
str) || *
str ==
'-' || *
str ==
'.'))
3901 val = strtod(
str, endptr);
3903 if (*endptr ==
str || errno != 0)
3906 if (isnan(
val) || val < -1.0e15 || val > 1.0e15)
3913 *fpart =
val - *ipart;
3915 Assert(*fpart > -1.0 && *fpart < 1.0);
3927 if (*fieldstart ==
'-')
3929 return strspn(fieldstart,
"0123456789");
3954 bool datepart =
true;
3955 bool havefield =
false;
3960 if (strlen(
str) < 2 ||
str[0] !=
'P')
4215 const char *
str,
const char *datatype,
4222 (
errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
4223 errmsg(
"date/time field value out of range: \"%s\"",
4229 (
errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
4230 errmsg(
"date/time field value out of range: \"%s\"",
4232 errhint(
"Perhaps you need a different \"DateStyle\" setting.")));
4236 (
errcode(ERRCODE_INTERVAL_FIELD_OVERFLOW),
4237 errmsg(
"interval field value out of range: \"%s\"",
4242 (
errcode(ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE),
4243 errmsg(
"time zone displacement out of range: \"%s\"",
4248 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4249 errmsg(
"time zone \"%s\" not recognized",
4254 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
4255 errmsg(
"time zone \"%s\" not recognized",
4257 errdetail(
"This time zone name appears in the configuration file for time zone abbreviation \"%s\".",
4263 (
errcode(ERRCODE_INVALID_DATETIME_FORMAT),
4264 errmsg(
"invalid input syntax for type %s: \"%s\"",
4279 const datetkn *last = base + nel - 1,
4283 while (last >= base)
4285 position = base + ((last - base) >> 1);
4287 result = (int)
key[0] - (
int) position->token[0];
4296 last = position - 1;
4298 base = position + 1;
4324 *
str++ = (tz <= 0 ?
'+' :
'-');
4418 memcpy(
str,
" BC", 3);
4622 memcpy(
str,
" BC", 3);
4640 return cp + strlen(cp);
4646 bool *is_zero,
bool *is_before)
4650 sprintf(cp,
"%s%s%" PRId64
" %s%s",
4651 (!*is_zero) ?
" " :
"",
4652 (*is_before &&
value > 0) ?
"+" :
"",
4655 (
value != 1) ?
"s" :
"");
4661 *is_before = (
value < 0);
4663 return cp + strlen(cp);
4669 bool *is_zero,
bool *is_before)
4676 *is_before = (
value < 0);
4679 else if (*is_before)
4683 return cp + strlen(cp);
4717 bool is_before =
false;
4718 bool is_zero =
true;
4731 bool has_negative = year < 0 || mon < 0 ||
4732 mday < 0 || hour < 0 ||
4733 min < 0 || sec < 0 || fsec < 0;
4734 bool has_positive = year > 0 || mon > 0 ||
4735 mday > 0 || hour > 0 ||
4736 min > 0 || sec > 0 || fsec > 0;
4737 bool has_year_month = year != 0 || mon != 0;
4738 bool has_day_time = mday != 0 || hour != 0 ||
4739 min != 0 || sec != 0 || fsec != 0;
4740 bool has_day = mday != 0;
4741 bool sql_standard_value = !(has_negative && has_positive) &&
4742 !(has_year_month && has_day_time);
4748 if (has_negative && sql_standard_value)
4760 if (!has_negative && !has_positive)
4764 else if (!sql_standard_value)
4771 char year_sign = (year < 0 || mon < 0) ?
'-' :
'+';
4772 char day_sign = (mday < 0) ?
'-' :
'+';
4773 char sec_sign = (hour < 0 || min < 0 ||
4774 sec < 0 || fsec < 0) ?
'-' :
'+';
4776 sprintf(cp,
"%c%d-%d %c%" PRId64
" %c%" PRId64
":%02d:",
4777 year_sign, abs(year), abs(mon),
4778 day_sign, i64abs(mday),
4779 sec_sign, i64abs(hour), abs(min));
4784 else if (has_year_month)
4786 sprintf(cp,
"%d-%d", year, mon);
4790 sprintf(cp,
"%" PRId64
" %" PRId64
":%02d:",
4798 sprintf(cp,
"%" PRId64
":%02d:", hour, min);
4809 if (year == 0 && mon == 0 && mday == 0 &&
4810 hour == 0 && min == 0 && sec == 0 && fsec == 0)
4819 if (hour != 0 || min != 0 || sec != 0 || fsec != 0)
4823 if (sec != 0 || fsec != 0)
4825 if (sec < 0 || fsec < 0)
4844 if (is_zero || hour != 0 || min != 0 || sec != 0 || fsec != 0)
4846 bool minus = (hour < 0 || min < 0 || sec < 0 || fsec < 0);
4848 sprintf(cp,
"%s%s%02" PRId64
":%02d:",
4850 (minus ?
"-" : (is_before ?
"+" :
"")),
4851 i64abs(hour), abs(min));
4868 if (sec != 0 || fsec != 0)
4871 if (sec < 0 || (sec == 0 && fsec < 0))
4875 else if (!is_before)
4883 (abs(sec) != 1 || fsec != 0) ?
"s" :
"");
4906 for (
i = 0;
i < nel;
i++)
4912 elog(
LOG,
"token too long in %s table: \"%.*s\"",
4922 elog(
LOG,
"ordering error in %s table: \"%s\" >= \"%s\"",
4978 if (new_precis < 0 || new_precis == max_precis ||
4979 (old_precis >= 0 && new_precis >= old_precis))
5006 for (
i = 0;
i < n;
i++)
5008 struct tzEntry *abbr = abbrevs +
i;
5010 if (abbr->
zone != NULL)
5015 strlen(abbr->
zone) + 1;
5032 for (
i = 0;
i < n;
i++)
5034 struct tzEntry *abbr = abbrevs +
i;
5039 if (abbr->
zone != NULL)
5054 strlen(abbr->
zone) + 1;
5104 if (dtza->
tz == NULL)
5107 if (dtza->
tz == NULL)
5131 bool nulls[3] = {0};
5155 pindex = (
int *)
palloc(
sizeof(
int));
5160 elog(
ERROR,
"return type must be a row type");
5174 if (strspn(abbrev,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ") != strlen(abbrev))
5218 bool nulls[3] = {0};
5242 pindex = (
int *)
palloc(
sizeof(
int));
5247 elog(
ERROR,
"return type must be a row type");
5266 gmtoffset = tp->
value;
5270 gmtoffset = tp->
value;
5290 is_dst = (bool) isdst;
5294 elog(
ERROR,
"unrecognized timezone type %d", (
int) tp->
type);
5305 for (p = (
unsigned char *) buffer; *p; p++)
5338 bool nulls[4] = {0};
5360 &tzoff, &
tm, &fsec, &tzn, tz) != 0)
5372 if (tzn && strlen(tzn) > 31)
static char * EncodeTimezone(char *str, int tz, int style)
static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits, struct pg_tm *tm)
static int DetermineTimeZoneOffsetInternal(struct pg_tm *tm, pg_tz *tzp, pg_time_t *tp)
#define APPEND_CHAR(bufptr, end, newchar)
static int DecodeNumberField(int len, char *str, int fmask, int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits)
Node * TemporalSimplify(int32 max_precis, Node *node)
pg_tz * DecodeTimezoneNameToTz(const char *tzname)
static bool CheckDateTokenTable(const char *tablename, const datetkn *base, int nel)
int DetermineTimeZoneAbbrevOffsetTS(TimestampTz ts, const char *abbr, pg_tz *tzp, int *isdst)
static int ParseFraction(char *cp, double *frac)
static TzAbbrevCache tzabbrevcache[MAXDATEFIELDS]
void InstallTimeZoneAbbrevs(TimeZoneAbbrevTable *tbl)
static const datetkn datetktbl[]
static bool int64_multiply_add(int64 val, int64 multiplier, int64 *sum)
int DecodeUnits(int field, const char *lowtoken, int *val)
int DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp, DateTimeErrorExtra *extra)
static TimeZoneAbbrevTable * zoneabbrevtbl
static const datetkn * deltacache[MAXDATEFIELDS]
int ParseDateTime(const char *timestr, char *workbuf, size_t buflen, char **field, int *ftype, int maxfields, int *numfields)
void EncodeInterval(struct pg_itm *itm, int style, char *str)
static bool AdjustDays(int64 val, int scale, struct pg_itm_in *itm_in)
static const datetkn * datecache[MAXDATEFIELDS]
static int DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits)
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
static bool DetermineTimeZoneAbbrevOffsetInternal(pg_time_t t, const char *abbr, pg_tz *tzp, int *offset, int *isdst)
void DateTimeParseError(int dterr, DateTimeErrorExtra *extra, const char *str, const char *datatype, Node *escontext)
static int ParseFractionalSecond(char *cp, fsec_t *fsec)
static bool AdjustFractYears(double frac, int scale, struct pg_itm_in *itm_in)
static bool AdjustMicroseconds(int64 val, double fval, int64 scale, struct pg_itm_in *itm_in)
static int DecodeTimeCommon(char *str, int fmask, int range, int *tmask, struct pg_itm *itm)
int DecodeInterval(char **field, int *ftype, int nf, int range, int *dtype, struct pg_itm_in *itm_in)
Datum pg_timezone_abbrevs_abbrevs(PG_FUNCTION_ARGS)
static int DecodeTimeForInterval(char *str, int fmask, int range, int *tmask, struct pg_itm_in *itm_in)
static char * AddPostgresIntPart(char *cp, int64 value, const char *units, bool *is_zero, bool *is_before)
bool CheckDateTokenTables(void)
static const int szdeltatktbl
int DecodeTimezoneAbbrev(int field, const char *lowtoken, int *ftype, int *offset, pg_tz **tz, DateTimeErrorExtra *extra)
Datum pg_timezone_names(PG_FUNCTION_ARGS)
void EncodeTimeOnly(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, int style, char *str)
static int DecodeTime(char *str, int fmask, int range, int *tmask, struct pg_tm *tm, fsec_t *fsec)
static bool AdjustFractMicroseconds(double frac, int64 scale, struct pg_itm_in *itm_in)
int DecodeISO8601Interval(char *str, int *dtype, struct pg_itm_in *itm_in)
struct TzAbbrevCache TzAbbrevCache
int ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc, struct pg_tm *tm)
int DecodeSpecial(int field, const char *lowtoken, int *val)
void j2date(int jd, int *year, int *month, int *day)
void GetCurrentDateTime(struct pg_tm *tm)
static int ISO8601IntegerWidth(char *fieldstart)
static bool AdjustYears(int64 val, int scale, struct pg_itm_in *itm_in)
void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
int DecodeTimezone(const char *str, int *tzp)
TimeZoneAbbrevTable * ConvertTimeZoneAbbrevs(struct tzEntry *abbrevs, int n)
const char *const months[]
static bool AdjustMonths(int64 val, struct pg_itm_in *itm_in)
static char * AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros)
static const int szdatetktbl
Datum pg_timezone_abbrevs_zone(PG_FUNCTION_ARGS)
void EncodeDateOnly(struct pg_tm *tm, int style, char *str)
static char * AppendTimestampSeconds(char *cp, struct pg_tm *tm, fsec_t fsec)
static const datetkn * datebsearch(const char *key, const datetkn *base, int nel)
static char * AddISO8601IntPart(char *cp, int64 value, char units)
static int ParseISO8601Number(char *str, char **endptr, int64 *ipart, double *fpart)
int DecodeDateTime(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp, DateTimeErrorExtra *extra)
int date2j(int year, int month, int day)
static bool TimeZoneAbbrevIsKnown(const char *abbr, pg_tz *tzp, bool *isfixed, int *offset, int *isdst)
static bool AdjustFractDays(double frac, int scale, struct pg_itm_in *itm_in)
static void ClearPgItmIn(struct pg_itm_in *itm_in)
static char * AddVerboseIntPart(char *cp, int64 value, const char *units, bool *is_zero, bool *is_before)
static const datetkn deltatktbl[]
void GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp)
static pg_tz * FetchDynamicTimeZone(TimeZoneAbbrevTable *tbl, const datetkn *tp, DateTimeErrorExtra *extra)
void ClearTimeZoneAbbrevCache(void)
int DecodeTimezoneName(const char *tzname, int *offset, pg_tz **tz)
int DecodeTimezoneAbbrevPrefix(const char *str, int *offset, pg_tz **tz)
int DetermineTimeZoneAbbrevOffset(struct pg_tm *tm, const char *abbr, pg_tz *tzp)
void dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
int itmin2interval(struct pg_itm_in *itm_in, Interval *span)
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
Datum now(PG_FUNCTION_ARGS)
pg_time_t timestamptz_to_time_t(TimestampTz t)
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define MemSet(start, val, len)
#define MAX_TIMESTAMP_PRECISION
#define IS_VALID_JULIAN(y, m, d)
#define MAX_INTERVAL_PRECISION
#define POSTGRES_EPOCH_JDATE
bool time_overflows(int hour, int min, int sec, fsec_t fsec)
#define MAX_TIME_PRECISION
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define errsave(context,...)
#define ereport(elevel,...)
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
#define SRF_RETURN_DONE(_funcctx)
void * guc_malloc(int elevel, size_t size)
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
#define DTERR_BAD_ZONE_ABBREV
#define DTERR_INTERVAL_OVERFLOW
#define DTERR_BAD_TIMEZONE
#define TZNAME_FIXED_OFFSET
#define DTERR_TZDISP_OVERFLOW
#define DTERR_FIELD_OVERFLOW
#define DTERR_MD_FIELD_OVERFLOW
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
static bool pg_mul_s32_overflow(int32 a, int32 b, int32 *result)
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
if(TABLE==NULL||TABLE_index==NULL)
#define USE_POSTGRES_DATES
#define INTSTYLE_SQL_STANDARD
#define INTSTYLE_POSTGRES_VERBOSE
#define INTSTYLE_ISO_8601
#define INTSTYLE_POSTGRES
int32 exprTypmod(const Node *expr)
Node * relabel_to_typmod(Node *expr, int32 typmod)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
char * pg_ultostr_zeropad(char *str, uint32 value, int32 minwidth)
char * pg_ultostr(char *str, uint32 value)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static int list_length(const List *l)
static rewind_source * source
pg_tz * pg_tzset_offset(long gmtoffset)
pg_tz * pg_tzenumerate_next(pg_tzenum *dir)
bool pg_timezone_abbrev_is_known(const char *abbrev, bool *isfixed, long int *gmtoff, int *isdst, const pg_tz *tz)
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)
const char * pg_get_timezone_name(pg_tz *tz)
pg_tz * pg_tzset(const char *tzname)
bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff)
const char * pg_get_next_timezone_abbrev(int *indx, const pg_tz *tz)
PGDLLIMPORT pg_tz * session_timezone
void pg_tzenumerate_end(pg_tzenum *dir)
pg_tzenum * pg_tzenumerate_start(void)
bool pg_interpret_timezone_abbrev(const char *abbrev, const pg_time_t *timep, long int *gmtoff, int *isdst, const pg_tz *tz)
unsigned char pg_toupper(unsigned char ch)
unsigned char pg_tolower(unsigned char ch)
size_t strlcpy(char *dst, const char *src, size_t siz)
static Datum BoolGetDatum(bool X)
static int32 DatumGetInt32(Datum X)
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
char * downcase_truncate_identifier(const char *ident, int len, bool warn)
int strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
char zone[FLEXIBLE_ARRAY_MEMBER]
MemoryContext multi_call_memory_ctx
datetkn abbrevs[FLEXIBLE_ARRAY_MEMBER]
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)
#define INTERVAL_FULL_RANGE
static Datum IntervalPGetDatum(const Interval *X)
TimestampTz GetCurrentTransactionStartTimestamp(void)