71 int *offset,
int *
isdst);
78 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
79 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}
82const char *
const months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
83"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
NULL};
85const char *
const days[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
86"Thursday",
"Friday",
"Saturday",
NULL};
117 {
"august",
MONTH, 8},
121 {
"december",
MONTH, 12},
127 {
"february",
MONTH, 2},
136 {
"january",
MONTH, 1},
151 {
"november",
MONTH, 11},
154 {
"october",
MONTH, 10},
159 {
"saturday",
DOW, 6},
162 {
"september",
MONTH, 9},
169 {
"thursday",
DOW, 4},
176 {
"wednesday",
DOW, 3},
314 julian = year * 365 - 32167;
316 julian += 7834 * month / 256 + day;
433 errmsg(
"timestamp out of range")));
472 char *end = &
cp[precision + 1];
497 end = &
cp[precision];
568 else if (
frac < -0.5)
780 const char *bufend =
workbuf + buflen;
788#define APPEND_CHAR(bufptr, end, newchar) \
791 if (((bufptr) + 1) >= (end)) \
792 return DTERR_BAD_FORMAT; \
793 *(bufptr)++ = newchar; \
824 (*
cp ==
':') || (*
cp ==
'.'))
828 else if (*
cp ==
'-' || *
cp ==
'/' || *
cp ==
'.')
849 while (
isdigit((
unsigned char) *
cp) || *
cp == delim)
856 while (
isalnum((
unsigned char) *
cp) || *
cp == delim)
899 if (*
cp ==
'-' || *
cp ==
'/' || *
cp ==
'.')
901 else if (*
cp ==
'+' ||
isdigit((
unsigned char) *
cp))
914 }
while (*
cp ==
'+' || *
cp ==
'-' ||
915 *
cp ==
'/' || *
cp ==
'_' ||
916 *
cp ==
'.' || *
cp ==
':' ||
921 else if (*
cp ==
'+' || *
cp ==
'-')
934 *
cp ==
':' || *
cp ==
'.' || *
cp ==
'-')
1017 char *abbrev =
NULL;
1034 for (
i = 0;
i <
nf;
i++)
1081 else if (ptype != 0 ||
1089 if (
isdigit((
unsigned char) *field[
i]) || ptype != 0)
1211 if (*
cp !=
'.' && *
cp !=
'\0')
1390 elog(
ERROR,
"unrecognized RESERV datetime token: %d",
1827 errmsg(
"timestamp out of range")));
1842 int *offset,
int *
isdst)
1850 for (p = (
unsigned char *)
upabbr; *p; p++)
1876 bool *isfixed,
int *offset,
int *
isdst)
1884 for (p = (
unsigned char *)
upabbr; *p; p++)
1935 char *abbrev =
NULL;
1949 for (
i = 0;
i <
nf;
i++)
1963 if (
i == 0 &&
nf >= 2 &&
1974 if (
isdigit((
unsigned char) *field[
i]))
2074 if (*
cp !=
'.' && *
cp !=
'\0')
2497 for (
i = 0;
i <
nf;
i++)
2499 if (
isalpha((
unsigned char) *field[
i]))
2528 for (
i = 0;
i <
nf;
i++)
2530 if (field[
i] ==
NULL)
2671 itm->tm_sec =
itm->tm_min;
2676 else if (*
cp ==
'.')
2684 itm->tm_sec =
itm->tm_min;
2688 else if (*
cp ==
':')
2700 else if (*
cp !=
'\0')
2707 if (
itm->tm_hour < 0 ||
2713 itm->tm_usec = (
int) fsec;
2742 *fsec =
itm.tm_usec;
2818 else if (*
cp !=
'\0')
3009 *(
str + (
len - 2)) =
'\0';
3011 *(
str + (
len - 4)) =
'\0';
3067 if (*
str !=
'+' && *
str !=
'-')
3143 int *ftype,
int *offset,
pg_tz **tz,
3158 *ftype =
tzc->ftype;
3159 *offset =
tzc->offset;
3171 &isfixed, offset, &
isdst))
3176 *offset = -(*offset);
3179 tzc->ftype = *ftype;
3180 tzc->offset = *offset;
3210 *offset = tp->
value;
3216 tzc->ftype = *ftype;
3217 tzc->offset = *offset;
3405 &isfixed, offset, &
isdst))
3410 *offset = -(*offset);
3444 *offset = tp->
value;
3527 for (
i = 1;
i <
nf;
i++)
3529 if (*field[
i] ==
'-' || *field[
i] ==
'+')
3538 for (
i =
nf - 1;
i >= 0;
i--)
3561 Assert(*field[
i] ==
'-' || *field[
i] ==
'+');
3571 if (*field[
i] ==
'-')
3654 if (*field[
i] ==
'-')
3662 else if (*
cp ==
'.')
3667 if (*field[
i] ==
'-')
3670 else if (*
cp ==
'\0')
4216 const char *
str,
const char *datatype,
4224 errmsg(
"date/time field value out of range: \"%s\"",
4231 errmsg(
"date/time field value out of range: \"%s\"",
4233 errhint(
"Perhaps you need a different \"DateStyle\" setting.")));
4238 errmsg(
"interval field value out of range: \"%s\"",
4244 errmsg(
"time zone displacement out of range: \"%s\"",
4250 errmsg(
"time zone \"%s\" not recognized",
4256 errmsg(
"time zone \"%s\" not recognized",
4258 errdetail(
"This time zone name appears in the configuration file for time zone abbreviation \"%s\".",
4265 errmsg(
"invalid input syntax for type %s: \"%s\"",
4284 while (last >= base)
4286 position = base + ((last - base) >> 1);
4288 result = (
int) key[0] - (
int) position->token[0];
4297 last = position - 1;
4299 base = position + 1;
4325 *
str++ = (tz <= 0 ?
'+' :
'-');
4656 (
value != 1) ?
"s" :
"");
4711 int year =
itm->tm_year;
4712 int mon =
itm->tm_mon;
4715 int min =
itm->tm_min;
4716 int sec =
itm->tm_sec;
4717 int fsec =
itm->tm_usec;
4734 min < 0 || sec < 0 || fsec < 0;
4737 min > 0 || sec > 0 || fsec > 0;
4740 min != 0 || sec != 0 || fsec != 0;
4772 char year_sign = (year < 0 || mon < 0) ?
'-' :
'+';
4775 sec < 0 || fsec < 0) ?
'-' :
'+';
4810 if (year == 0 && mon == 0 &&
mday == 0 &&
4811 hour == 0 && min == 0 && sec == 0 && fsec == 0)
4820 if (
hour != 0 || min != 0 || sec != 0 || fsec != 0)
4824 if (sec != 0 || fsec != 0)
4826 if (sec < 0 || fsec < 0)
4845 if (
is_zero ||
hour != 0 || min != 0 || sec != 0 || fsec != 0)
4847 bool minus = (
hour < 0 || min < 0 || sec < 0 || fsec < 0);
4869 if (sec != 0 || fsec != 0)
4872 if (sec < 0 || (sec == 0 && fsec < 0))
4884 (
abs(sec) != 1 || fsec != 0) ?
"s" :
"");
4907 for (
i = 0;
i <
nel;
i++)
4913 elog(
LOG,
"token too long in %s table: \"%.*s\"",
4923 elog(
LOG,
"ordering error in %s table: \"%s\" >= \"%s\"",
5007 for (
i = 0;
i < n;
i++)
5028 tbl->numabbrevs = n;
5033 for (
i = 0;
i < n;
i++)
5132 bool nulls[3] = {0};
5161 elog(
ERROR,
"return type must be a row type");
5162 funcctx->tuple_desc = tupdesc;
5175 if (
strspn(abbrev,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ") !=
strlen(abbrev))
5219 bool nulls[3] = {0};
5248 elog(
ERROR,
"return type must be a row type");
5249 funcctx->tuple_desc = tupdesc;
5267 gmtoffset = tp->
value;
5271 gmtoffset = tp->
value;
5295 elog(
ERROR,
"unrecognized timezone type %d", (
int) tp->
type);
5306 for (p = (
unsigned char *) buffer; *p; p++)
5339 bool nulls[4] = {0};
5361 &
tzoff, &
tm, &fsec, &tzn, tz) != 0)
5373 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 errcode(int sqlerrcode)
#define errsave(context,...)
int errhint(const char *fmt,...) pg_attribute_printf(1
int errdetail(const char *fmt,...) pg_attribute_printf(1
#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)