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},
313 julian = year * 365 - 32167;
315 julian += 7834 * month / 256 + day;
432 errmsg(
"timestamp out of range")));
471 char *end = &
cp[precision + 1];
496 end = &
cp[precision];
567 else if (
frac < -0.5)
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; \
823 (*
cp ==
':') || (*
cp ==
'.'))
827 else if (*
cp ==
'-' || *
cp ==
'/' || *
cp ==
'.')
848 while (
isdigit((
unsigned char) *
cp) || *
cp == delim)
855 while (
isalnum((
unsigned char) *
cp) || *
cp == delim)
898 if (*
cp ==
'-' || *
cp ==
'/' || *
cp ==
'.')
900 else if (*
cp ==
'+' ||
isdigit((
unsigned char) *
cp))
913 }
while (*
cp ==
'+' || *
cp ==
'-' ||
914 *
cp ==
'/' || *
cp ==
'_' ||
915 *
cp ==
'.' || *
cp ==
':' ||
920 else if (*
cp ==
'+' || *
cp ==
'-')
933 *
cp ==
':' || *
cp ==
'.' || *
cp ==
'-')
1016 char *abbrev =
NULL;
1033 for (
i = 0;
i <
nf;
i++)
1080 else if (ptype != 0 ||
1088 if (
isdigit((
unsigned char) *field[
i]) || ptype != 0)
1210 if (*
cp !=
'.' && *
cp !=
'\0')
1389 elog(
ERROR,
"unrecognized RESERV datetime token: %d",
1826 errmsg(
"timestamp out of range")));
1841 int *offset,
int *
isdst)
1849 for (p = (
unsigned char *)
upabbr; *p; p++)
1875 bool *isfixed,
int *offset,
int *
isdst)
1883 for (p = (
unsigned char *)
upabbr; *p; p++)
1934 char *abbrev =
NULL;
1948 for (
i = 0;
i <
nf;
i++)
1962 if (
i == 0 &&
nf >= 2 &&
1973 if (
isdigit((
unsigned char) *field[
i]))
2073 if (*
cp !=
'.' && *
cp !=
'\0')
2496 for (
i = 0;
i <
nf;
i++)
2498 if (
isalpha((
unsigned char) *field[
i]))
2527 for (
i = 0;
i <
nf;
i++)
2529 if (field[
i] ==
NULL)
2670 itm->tm_sec =
itm->tm_min;
2675 else if (*
cp ==
'.')
2683 itm->tm_sec =
itm->tm_min;
2687 else if (*
cp ==
':')
2699 else if (*
cp !=
'\0')
2706 if (
itm->tm_hour < 0 ||
2712 itm->tm_usec = (
int) fsec;
2741 *fsec =
itm.tm_usec;
2817 else if (*
cp !=
'\0')
3008 *(
str + (
len - 2)) =
'\0';
3010 *(
str + (
len - 4)) =
'\0';
3066 if (*
str !=
'+' && *
str !=
'-')
3142 int *ftype,
int *offset,
pg_tz **tz,
3157 *ftype =
tzc->ftype;
3158 *offset =
tzc->offset;
3170 &isfixed, offset, &
isdst))
3175 *offset = -(*offset);
3178 tzc->ftype = *ftype;
3179 tzc->offset = *offset;
3209 *offset = tp->
value;
3215 tzc->ftype = *ftype;
3216 tzc->offset = *offset;
3404 &isfixed, offset, &
isdst))
3409 *offset = -(*offset);
3443 *offset = tp->
value;
3526 for (
i = 1;
i <
nf;
i++)
3528 if (*field[
i] ==
'-' || *field[
i] ==
'+')
3537 for (
i =
nf - 1;
i >= 0;
i--)
3560 Assert(*field[
i] ==
'-' || *field[
i] ==
'+');
3570 if (*field[
i] ==
'-')
3653 if (*field[
i] ==
'-')
3661 else if (*
cp ==
'.')
3666 if (*field[
i] ==
'-')
3669 else if (*
cp ==
'\0')
4215 const char *
str,
const char *datatype,
4223 errmsg(
"date/time field value out of range: \"%s\"",
4230 errmsg(
"date/time field value out of range: \"%s\"",
4232 errhint(
"Perhaps you need a different \"DateStyle\" setting.")));
4237 errmsg(
"interval field value out of range: \"%s\"",
4243 errmsg(
"time zone displacement out of range: \"%s\"",
4249 errmsg(
"time zone \"%s\" not recognized",
4255 errmsg(
"time zone \"%s\" not recognized",
4257 errdetail(
"This time zone name appears in the configuration file for time zone abbreviation \"%s\".",
4264 errmsg(
"invalid input syntax for type %s: \"%s\"",
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 ?
'+' :
'-');
4655 (
value != 1) ?
"s" :
"");
4710 int year =
itm->tm_year;
4711 int mon =
itm->tm_mon;
4714 int min =
itm->tm_min;
4715 int sec =
itm->tm_sec;
4716 int fsec =
itm->tm_usec;
4733 min < 0 || sec < 0 || fsec < 0;
4736 min > 0 || sec > 0 || fsec > 0;
4739 min != 0 || sec != 0 || fsec != 0;
4771 char year_sign = (year < 0 || mon < 0) ?
'-' :
'+';
4774 sec < 0 || fsec < 0) ?
'-' :
'+';
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);
4868 if (sec != 0 || fsec != 0)
4871 if (sec < 0 || (sec == 0 && fsec < 0))
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\"",
5006 for (
i = 0;
i < n;
i++)
5027 tbl->numabbrevs = n;
5032 for (
i = 0;
i < n;
i++)
5131 bool nulls[3] = {0};
5160 elog(
ERROR,
"return type must be a row type");
5161 funcctx->tuple_desc = tupdesc;
5174 if (
strspn(abbrev,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ") !=
strlen(abbrev))
5218 bool nulls[3] = {0};
5247 elog(
ERROR,
"return type must be a row type");
5248 funcctx->tuple_desc = tupdesc;
5266 gmtoffset = tp->
value;
5270 gmtoffset = tp->
value;
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)
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 Assert(condition)
#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,...)
#define palloc_object(type)
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)
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)
#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)
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)