PostgreSQL Source Code git master
Loading...
Searching...
No Matches
date.c File Reference
#include "postgres.h"
#include <ctype.h>
#include <limits.h>
#include <float.h>
#include <math.h>
#include <time.h>
#include "access/xact.h"
#include "catalog/pg_type.h"
#include "common/hashfn.h"
#include "common/int.h"
#include "libpq/pqformat.h"
#include "miscadmin.h"
#include "nodes/miscnodes.h"
#include "nodes/supportnodes.h"
#include "parser/scansup.h"
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/date.h"
#include "utils/datetime.h"
#include "utils/numeric.h"
#include "utils/skipsupport.h"
#include "utils/sortsupport.h"
Include dependency graph for date.c:

Go to the source code of this file.

Macros

#define TIMEADT_GT(t1, t2)    (DatumGetTimeADT(t1) > DatumGetTimeADT(t2))
 
#define TIMEADT_LT(t1, t2)    (DatumGetTimeADT(t1) < DatumGetTimeADT(t2))
 
#define TIMETZ_GT(t1, t2)    DatumGetBool(DirectFunctionCall2(timetz_gt,t1,t2))
 
#define TIMETZ_LT(t1, t2)    DatumGetBool(DirectFunctionCall2(timetz_lt,t1,t2))
 

Functions

static int32 anytime_typmodin (bool istz, ArrayType *ta)
 
int32 anytime_typmod_check (bool istz, int32 typmod)
 
static charanytime_typmodout (bool istz, int32 typmod)
 
Datum date_in (PG_FUNCTION_ARGS)
 
Datum date_out (PG_FUNCTION_ARGS)
 
Datum date_recv (PG_FUNCTION_ARGS)
 
Datum date_send (PG_FUNCTION_ARGS)
 
Datum make_date (PG_FUNCTION_ARGS)
 
void EncodeSpecialDate (DateADT dt, char *str)
 
DateADT GetSQLCurrentDate (void)
 
TimeTzADTGetSQLCurrentTime (int32 typmod)
 
TimeADT GetSQLLocalTime (int32 typmod)
 
Datum date_eq (PG_FUNCTION_ARGS)
 
Datum date_ne (PG_FUNCTION_ARGS)
 
Datum date_lt (PG_FUNCTION_ARGS)
 
Datum date_le (PG_FUNCTION_ARGS)
 
Datum date_gt (PG_FUNCTION_ARGS)
 
Datum date_ge (PG_FUNCTION_ARGS)
 
Datum date_cmp (PG_FUNCTION_ARGS)
 
Datum date_sortsupport (PG_FUNCTION_ARGS)
 
static Datum date_decrement (Relation rel, Datum existing, bool *underflow)
 
static Datum date_increment (Relation rel, Datum existing, bool *overflow)
 
Datum date_skipsupport (PG_FUNCTION_ARGS)
 
Datum hashdate (PG_FUNCTION_ARGS)
 
Datum hashdateextended (PG_FUNCTION_ARGS)
 
Datum date_finite (PG_FUNCTION_ARGS)
 
Datum date_larger (PG_FUNCTION_ARGS)
 
Datum date_smaller (PG_FUNCTION_ARGS)
 
Datum date_mi (PG_FUNCTION_ARGS)
 
Datum date_pli (PG_FUNCTION_ARGS)
 
Datum date_mii (PG_FUNCTION_ARGS)
 
Timestamp date2timestamp_safe (DateADT dateVal, Node *escontext)
 
static TimestampTz date2timestamp (DateADT dateVal)
 
TimestampTz date2timestamptz_safe (DateADT dateVal, Node *escontext)
 
double date2timestamp_no_overflow (DateADT dateVal)
 
int32 date_cmp_timestamp_internal (DateADT dateVal, Timestamp dt2)
 
Datum date_eq_timestamp (PG_FUNCTION_ARGS)
 
Datum date_ne_timestamp (PG_FUNCTION_ARGS)
 
Datum date_lt_timestamp (PG_FUNCTION_ARGS)
 
Datum date_gt_timestamp (PG_FUNCTION_ARGS)
 
Datum date_le_timestamp (PG_FUNCTION_ARGS)
 
Datum date_ge_timestamp (PG_FUNCTION_ARGS)
 
Datum date_cmp_timestamp (PG_FUNCTION_ARGS)
 
int32 date_cmp_timestamptz_internal (DateADT dateVal, TimestampTz dt2)
 
Datum date_eq_timestamptz (PG_FUNCTION_ARGS)
 
Datum date_ne_timestamptz (PG_FUNCTION_ARGS)
 
Datum date_lt_timestamptz (PG_FUNCTION_ARGS)
 
Datum date_gt_timestamptz (PG_FUNCTION_ARGS)
 
Datum date_le_timestamptz (PG_FUNCTION_ARGS)
 
Datum date_ge_timestamptz (PG_FUNCTION_ARGS)
 
Datum date_cmp_timestamptz (PG_FUNCTION_ARGS)
 
Datum timestamp_eq_date (PG_FUNCTION_ARGS)
 
Datum timestamp_ne_date (PG_FUNCTION_ARGS)
 
Datum timestamp_lt_date (PG_FUNCTION_ARGS)
 
Datum timestamp_gt_date (PG_FUNCTION_ARGS)
 
Datum timestamp_le_date (PG_FUNCTION_ARGS)
 
Datum timestamp_ge_date (PG_FUNCTION_ARGS)
 
Datum timestamp_cmp_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_eq_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_ne_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_lt_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_gt_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_le_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_ge_date (PG_FUNCTION_ARGS)
 
Datum timestamptz_cmp_date (PG_FUNCTION_ARGS)
 
Datum in_range_date_interval (PG_FUNCTION_ARGS)
 
Datum extract_date (PG_FUNCTION_ARGS)
 
Datum date_pl_interval (PG_FUNCTION_ARGS)
 
Datum date_mi_interval (PG_FUNCTION_ARGS)
 
Datum date_timestamp (PG_FUNCTION_ARGS)
 
Datum timestamp_date (PG_FUNCTION_ARGS)
 
DateADT timestamp2date_safe (Timestamp timestamp, Node *escontext)
 
Datum date_timestamptz (PG_FUNCTION_ARGS)
 
Datum timestamptz_date (PG_FUNCTION_ARGS)
 
DateADT timestamptz2date_safe (TimestampTz timestamp, Node *escontext)
 
Datum time_in (PG_FUNCTION_ARGS)
 
int tm2time (struct pg_tm *tm, fsec_t fsec, TimeADT *result)
 
bool time_overflows (int hour, int min, int sec, fsec_t fsec)
 
bool float_time_overflows (int hour, int min, double sec)
 
int time2tm (TimeADT time, struct pg_tm *tm, fsec_t *fsec)
 
Datum time_out (PG_FUNCTION_ARGS)
 
Datum time_recv (PG_FUNCTION_ARGS)
 
Datum time_send (PG_FUNCTION_ARGS)
 
Datum timetypmodin (PG_FUNCTION_ARGS)
 
Datum timetypmodout (PG_FUNCTION_ARGS)
 
Datum make_time (PG_FUNCTION_ARGS)
 
Datum time_support (PG_FUNCTION_ARGS)
 
Datum time_scale (PG_FUNCTION_ARGS)
 
void AdjustTimeForTypmod (TimeADT *time, int32 typmod)
 
Datum time_eq (PG_FUNCTION_ARGS)
 
Datum time_ne (PG_FUNCTION_ARGS)
 
Datum time_lt (PG_FUNCTION_ARGS)
 
Datum time_le (PG_FUNCTION_ARGS)
 
Datum time_gt (PG_FUNCTION_ARGS)
 
Datum time_ge (PG_FUNCTION_ARGS)
 
Datum time_cmp (PG_FUNCTION_ARGS)
 
Datum time_hash (PG_FUNCTION_ARGS)
 
Datum time_hash_extended (PG_FUNCTION_ARGS)
 
Datum time_larger (PG_FUNCTION_ARGS)
 
Datum time_smaller (PG_FUNCTION_ARGS)
 
Datum overlaps_time (PG_FUNCTION_ARGS)
 
Datum timestamp_time (PG_FUNCTION_ARGS)
 
Datum timestamptz_time (PG_FUNCTION_ARGS)
 
Datum datetime_timestamp (PG_FUNCTION_ARGS)
 
Datum time_interval (PG_FUNCTION_ARGS)
 
Datum interval_time (PG_FUNCTION_ARGS)
 
Datum time_mi_time (PG_FUNCTION_ARGS)
 
Datum time_pl_interval (PG_FUNCTION_ARGS)
 
Datum time_mi_interval (PG_FUNCTION_ARGS)
 
Datum in_range_time_interval (PG_FUNCTION_ARGS)
 
static Datum time_part_common (PG_FUNCTION_ARGS, bool retnumeric)
 
Datum time_part (PG_FUNCTION_ARGS)
 
Datum extract_time (PG_FUNCTION_ARGS)
 
int tm2timetz (struct pg_tm *tm, fsec_t fsec, int tz, TimeTzADT *result)
 
Datum timetz_in (PG_FUNCTION_ARGS)
 
Datum timetz_out (PG_FUNCTION_ARGS)
 
Datum timetz_recv (PG_FUNCTION_ARGS)
 
Datum timetz_send (PG_FUNCTION_ARGS)
 
Datum timetztypmodin (PG_FUNCTION_ARGS)
 
Datum timetztypmodout (PG_FUNCTION_ARGS)
 
int timetz2tm (TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp)
 
Datum timetz_scale (PG_FUNCTION_ARGS)
 
static int timetz_cmp_internal (TimeTzADT *time1, TimeTzADT *time2)
 
Datum timetz_eq (PG_FUNCTION_ARGS)
 
Datum timetz_ne (PG_FUNCTION_ARGS)
 
Datum timetz_lt (PG_FUNCTION_ARGS)
 
Datum timetz_le (PG_FUNCTION_ARGS)
 
Datum timetz_gt (PG_FUNCTION_ARGS)
 
Datum timetz_ge (PG_FUNCTION_ARGS)
 
Datum timetz_cmp (PG_FUNCTION_ARGS)
 
Datum timetz_hash (PG_FUNCTION_ARGS)
 
Datum timetz_hash_extended (PG_FUNCTION_ARGS)
 
Datum timetz_larger (PG_FUNCTION_ARGS)
 
Datum timetz_smaller (PG_FUNCTION_ARGS)
 
Datum timetz_pl_interval (PG_FUNCTION_ARGS)
 
Datum timetz_mi_interval (PG_FUNCTION_ARGS)
 
Datum in_range_timetz_interval (PG_FUNCTION_ARGS)
 
Datum overlaps_timetz (PG_FUNCTION_ARGS)
 
Datum timetz_time (PG_FUNCTION_ARGS)
 
Datum time_timetz (PG_FUNCTION_ARGS)
 
Datum timestamptz_timetz (PG_FUNCTION_ARGS)
 
Datum datetimetz_timestamptz (PG_FUNCTION_ARGS)
 
static Datum timetz_part_common (PG_FUNCTION_ARGS, bool retnumeric)
 
Datum timetz_part (PG_FUNCTION_ARGS)
 
Datum extract_timetz (PG_FUNCTION_ARGS)
 
Datum timetz_zone (PG_FUNCTION_ARGS)
 
Datum timetz_izone (PG_FUNCTION_ARGS)
 
Datum timetz_at_local (PG_FUNCTION_ARGS)
 

Macro Definition Documentation

◆ TIMEADT_GT

#define TIMEADT_GT (   t1,
  t2 
)     (DatumGetTimeADT(t1) > DatumGetTimeADT(t2))

◆ TIMEADT_LT

#define TIMEADT_LT (   t1,
  t2 
)     (DatumGetTimeADT(t1) < DatumGetTimeADT(t2))

◆ TIMETZ_GT

#define TIMETZ_GT (   t1,
  t2 
)     DatumGetBool(DirectFunctionCall2(timetz_gt,t1,t2))

◆ TIMETZ_LT

#define TIMETZ_LT (   t1,
  t2 
)     DatumGetBool(DirectFunctionCall2(timetz_lt,t1,t2))

Function Documentation

◆ AdjustTimeForTypmod()

void AdjustTimeForTypmod ( TimeADT time,
int32  typmod 
)

Definition at line 1734 of file date.c.

1735{
1736 static const int64 TimeScales[MAX_TIME_PRECISION + 1] = {
1737 INT64CONST(1000000),
1738 INT64CONST(100000),
1739 INT64CONST(10000),
1740 INT64CONST(1000),
1741 INT64CONST(100),
1742 INT64CONST(10),
1743 INT64CONST(1)
1744 };
1745
1746 static const int64 TimeOffsets[MAX_TIME_PRECISION + 1] = {
1747 INT64CONST(500000),
1748 INT64CONST(50000),
1749 INT64CONST(5000),
1750 INT64CONST(500),
1751 INT64CONST(50),
1752 INT64CONST(5),
1753 INT64CONST(0)
1754 };
1755
1756 if (typmod >= 0 && typmod <= MAX_TIME_PRECISION)
1757 {
1758 if (*time >= INT64CONST(0))
1759 *time = ((*time + TimeOffsets[typmod]) / TimeScales[typmod]) *
1760 TimeScales[typmod];
1761 else
1762 *time = -((((-*time) + TimeOffsets[typmod]) / TimeScales[typmod]) *
1763 TimeScales[typmod]);
1764 }
1765}
#define INT64CONST(x)
Definition c.h:630
int64_t int64
Definition c.h:621
#define MAX_TIME_PRECISION
Definition date.h:51
static int fb(int x)

References fb(), INT64CONST, and MAX_TIME_PRECISION.

Referenced by executeDateTimeMethod(), GetSQLCurrentTime(), GetSQLLocalTime(), parse_datetime(), time_in(), time_recv(), time_scale(), timetz_in(), timetz_recv(), and timetz_scale().

◆ anytime_typmod_check()

int32 anytime_typmod_check ( bool  istz,
int32  typmod 
)

Definition at line 65 of file date.c.

66{
67 if (typmod < 0)
70 errmsg("TIME(%d)%s precision must not be negative",
71 typmod, (istz ? " WITH TIME ZONE" : ""))));
72 if (typmod > MAX_TIME_PRECISION)
73 {
76 errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
77 typmod, (istz ? " WITH TIME ZONE" : ""),
79 typmod = MAX_TIME_PRECISION;
80 }
81
82 return typmod;
83}
int errcode(int sqlerrcode)
Definition elog.c:874
#define WARNING
Definition elog.h:37
#define ERROR
Definition elog.h:40
#define ereport(elevel,...)
Definition elog.h:152
static char * errmsg

References ereport, errcode(), errmsg, ERROR, fb(), MAX_TIME_PRECISION, and WARNING.

Referenced by anytime_typmodin(), executeDateTimeMethod(), and transformSQLValueFunction().

◆ anytime_typmodin()

static int32 anytime_typmodin ( bool  istz,
ArrayType ta 
)
static

Definition at line 44 of file date.c.

45{
46 int32 *tl;
47 int n;
48
50
51 /*
52 * we're not too tense about good error message here because grammar
53 * shouldn't allow wrong number of modifiers for TIME
54 */
55 if (n != 1)
58 errmsg("invalid type modifier")));
59
60 return anytime_typmod_check(istz, tl[0]);
61}
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
Definition arrayutils.c:233
int32_t int32
Definition c.h:620
int32 anytime_typmod_check(bool istz, int32 typmod)
Definition date.c:65

References anytime_typmod_check(), ArrayGetIntegerTypmods(), ereport, errcode(), errmsg, ERROR, and fb().

Referenced by timetypmodin(), and timetztypmodin().

◆ anytime_typmodout()

static char * anytime_typmodout ( bool  istz,
int32  typmod 
)
static

Definition at line 87 of file date.c.

88{
89 const char *tz = istz ? " with time zone" : " without time zone";
90
91 if (typmod >= 0)
92 return psprintf("(%d)%s", (int) typmod, tz);
93 else
94 return pstrdup(tz);
95}
char * pstrdup(const char *in)
Definition mcxt.c:1781
char * psprintf(const char *fmt,...)
Definition psprintf.c:43

References fb(), psprintf(), and pstrdup().

Referenced by timetypmodout(), and timetztypmodout().

◆ date2timestamp()

static TimestampTz date2timestamp ( DateADT  dateVal)
static

Definition at line 655 of file date.c.

656{
658}
Timestamp date2timestamp_safe(DateADT dateVal, Node *escontext)
Definition date.c:622

References date2timestamp_safe(), and fb().

Referenced by date_mi_interval(), date_pl_interval(), datetime_timestamp(), and in_range_date_interval().

◆ date2timestamp_no_overflow()

double date2timestamp_no_overflow ( DateADT  dateVal)

Definition at line 736 of file date.c.

737{
738 double result;
739
741 result = -DBL_MAX;
742 else if (DATE_IS_NOEND(dateVal))
743 result = DBL_MAX;
744 else
745 {
746 /* date is days since 2000, timestamp is microseconds since same... */
748 }
749
750 return result;
751}
uint32 result
#define USECS_PER_DAY
Definition timestamp.h:131
#define DATE_IS_NOEND(j)
Definition date.h:48
#define DATE_IS_NOBEGIN(j)
Definition date.h:46

References DATE_IS_NOBEGIN, DATE_IS_NOEND, fb(), result, and USECS_PER_DAY.

Referenced by convert_timevalue_to_scalar().

◆ date2timestamp_safe()

Timestamp date2timestamp_safe ( DateADT  dateVal,
Node escontext 
)

Definition at line 622 of file date.c.

623{
625
628 else if (DATE_IS_NOEND(dateVal))
630 else
631 {
632 /*
633 * Since dates have the same minimum values as timestamps, only upper
634 * boundary need be checked for overflow.
635 */
637 {
639 ereturn(escontext, result,
641 errmsg("date out of range for timestamp")));
642 }
643
644 /* date is days since 2000, timestamp is microseconds since same... */
646 }
647
648 return result;
649}
int64 Timestamp
Definition timestamp.h:38
#define TIMESTAMP_NOBEGIN(j)
Definition timestamp.h:159
#define TIMESTAMP_END_JULIAN
Definition timestamp.h:253
#define POSTGRES_EPOCH_JDATE
Definition timestamp.h:235
#define TIMESTAMP_NOEND(j)
Definition timestamp.h:164
#define ereturn(context, dummy_value,...)
Definition elog.h:280

References DATE_IS_NOBEGIN, DATE_IS_NOEND, ereturn, errcode(), errmsg, fb(), POSTGRES_EPOCH_JDATE, result, TIMESTAMP_END_JULIAN, TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, and USECS_PER_DAY.

Referenced by cvt_date_timestamp(), date2timestamp(), date_cmp_timestamp_internal(), and date_timestamp().

◆ date2timestamptz_safe()

TimestampTz date2timestamptz_safe ( DateADT  dateVal,
Node escontext 
)

Definition at line 671 of file date.c.

672{
674 struct pg_tm tt,
675 *tm = &tt;
676 int tz;
677
680 else if (DATE_IS_NOEND(dateVal))
682 else
683 {
684 /*
685 * Since dates have the same minimum values as timestamps, only upper
686 * boundary need be checked for overflow.
687 */
689 {
691 ereturn(escontext, result,
693 errmsg("date out of range for timestamp")));
694 }
695
697 &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
698 tm->tm_hour = 0;
699 tm->tm_min = 0;
700 tm->tm_sec = 0;
702
704
705 /*
706 * Since it is possible to go beyond allowed timestamptz range because
707 * of time zone, check for allowed timestamp range after adding tz.
708 */
710 {
711 if (result < MIN_TIMESTAMP)
713 else
715
716 ereturn(escontext, result,
718 errmsg("date out of range for timestamp")));
719 }
720 }
721
722 return result;
723}
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition datetime.c:1605
void j2date(int jd, int *year, int *month, int *day)
Definition datetime.c:322
int64 TimestampTz
Definition timestamp.h:39
#define IS_VALID_TIMESTAMP(t)
Definition timestamp.h:267
#define USECS_PER_SEC
Definition timestamp.h:134
#define MIN_TIMESTAMP
Definition timestamp.h:256
static struct pg_tm tm
Definition localtime.c:104
PGDLLIMPORT pg_tz * session_timezone
Definition pgtz.c:28
Definition pgtime.h:35
int tm_hour
Definition pgtime.h:38
int tm_mday
Definition pgtime.h:39
int tm_mon
Definition pgtime.h:40
int tm_min
Definition pgtime.h:37
int tm_sec
Definition pgtime.h:36
int tm_year
Definition pgtime.h:41

References DATE_IS_NOBEGIN, DATE_IS_NOEND, DetermineTimeZoneOffset(), ereturn, errcode(), errmsg, fb(), IS_VALID_TIMESTAMP, j2date(), MIN_TIMESTAMP, POSTGRES_EPOCH_JDATE, result, session_timezone, TIMESTAMP_END_JULIAN, TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, tm, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, pg_tm::tm_year, USECS_PER_DAY, and USECS_PER_SEC.

Referenced by cvt_date_timestamptz(), date_cmp_timestamptz_internal(), and date_timestamptz().

◆ date_cmp()

Datum date_cmp ( PG_FUNCTION_ARGS  )

Definition at line 438 of file date.c.

439{
442
443 if (dateVal1 < dateVal2)
444 PG_RETURN_INT32(-1);
445 else if (dateVal1 > dateVal2)
448}
int32 DateADT
Definition date.h:21
#define PG_GETARG_DATEADT(n)
Definition date.h:95
#define PG_RETURN_INT32(x)
Definition fmgr.h:355

References fb(), PG_GETARG_DATEADT, and PG_RETURN_INT32.

Referenced by compareDatetime(), gbt_date_ssup_cmp(), and gbt_datekey_cmp().

◆ date_cmp_timestamp()

Datum date_cmp_timestamp ( PG_FUNCTION_ARGS  )

Definition at line 831 of file date.c.

832{
835
837}
int32 date_cmp_timestamp_internal(DateADT dateVal, Timestamp dt2)
Definition date.c:759
#define PG_GETARG_TIMESTAMP(n)
Definition timestamp.h:63

References date_cmp_timestamp_internal(), fb(), PG_GETARG_DATEADT, PG_GETARG_TIMESTAMP, and PG_RETURN_INT32.

◆ date_cmp_timestamp_internal()

int32 date_cmp_timestamp_internal ( DateADT  dateVal,
Timestamp  dt2 
)

Definition at line 759 of file date.c.

760{
763
764 dt1 = date2timestamp_safe(dateVal, (Node *) &escontext);
765 if (escontext.error_occurred)
766 {
767 Assert(TIMESTAMP_IS_NOEND(dt1)); /* NOBEGIN case cannot occur */
768
769 /* dt1 is larger than any finite timestamp, but less than infinity */
770 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
771 }
772
774}
int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2)
Definition timestamp.c:2204
#define Assert(condition)
Definition c.h:943
#define TIMESTAMP_IS_NOEND(j)
Definition timestamp.h:167
Definition nodes.h:135

References Assert, date2timestamp_safe(), ErrorSaveContext::error_occurred, fb(), timestamp_cmp_internal(), and TIMESTAMP_IS_NOEND.

Referenced by cmpDateToTimestamp(), date_cmp_timestamp(), date_eq_timestamp(), date_ge_timestamp(), date_gt_timestamp(), date_le_timestamp(), date_lt_timestamp(), date_ne_timestamp(), timestamp_cmp_date(), timestamp_eq_date(), timestamp_ge_date(), timestamp_gt_date(), timestamp_le_date(), timestamp_lt_date(), and timestamp_ne_date().

◆ date_cmp_timestamptz()

Datum date_cmp_timestamptz ( PG_FUNCTION_ARGS  )

Definition at line 919 of file date.c.

920{
923
925}
int32 date_cmp_timestamptz_internal(DateADT dateVal, TimestampTz dt2)
Definition date.c:840
#define PG_GETARG_TIMESTAMPTZ(n)
Definition timestamp.h:64

References date_cmp_timestamptz_internal(), fb(), PG_GETARG_DATEADT, PG_GETARG_TIMESTAMPTZ, and PG_RETURN_INT32.

◆ date_cmp_timestamptz_internal()

int32 date_cmp_timestamptz_internal ( DateADT  dateVal,
TimestampTz  dt2 
)

Definition at line 840 of file date.c.

841{
844
845 dt1 = date2timestamptz_safe(dateVal, (Node *) &escontext);
846
847 if (escontext.error_occurred)
848 {
850 {
851 /* dt1 is larger than any finite timestamp, but less than infinity */
852 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
853 }
855 {
856 /* dt1 is less than any finite timestamp, but more than -infinity */
857 return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
858 }
859 }
860
862}
#define TIMESTAMP_IS_NOBEGIN(j)
Definition timestamp.h:162
TimestampTz date2timestamptz_safe(DateADT dateVal, Node *escontext)
Definition date.c:671
#define timestamptz_cmp_internal(dt1, dt2)
Definition timestamp.h:143

References date2timestamptz_safe(), ErrorSaveContext::error_occurred, fb(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, and timestamptz_cmp_internal.

Referenced by cmpDateToTimestampTz(), date_cmp_timestamptz(), date_eq_timestamptz(), date_ge_timestamptz(), date_gt_timestamptz(), date_le_timestamptz(), date_lt_timestamptz(), date_ne_timestamptz(), timestamptz_cmp_date(), timestamptz_eq_date(), timestamptz_ge_date(), timestamptz_gt_date(), timestamptz_le_date(), timestamptz_lt_date(), and timestamptz_ne_date().

◆ date_decrement()

static Datum date_decrement ( Relation  rel,
Datum  existing,
bool underflow 
)
static

Definition at line 460 of file date.c.

461{
463
465 {
466 /* return value is undefined */
467 *underflow = true;
468 return (Datum) 0;
469 }
470
471 *underflow = false;
472 return DateADTGetDatum(dexisting - 1);
473}
static Datum DateADTGetDatum(DateADT X)
Definition date.h:78
static DateADT DatumGetDateADT(Datum X)
Definition date.h:60
#define DATEVAL_NOBEGIN
Definition date.h:42
uint64_t Datum
Definition postgres.h:70

References DateADTGetDatum(), DATEVAL_NOBEGIN, DatumGetDateADT(), and fb().

Referenced by date_skipsupport().

◆ date_eq()

Datum date_eq ( PG_FUNCTION_ARGS  )

Definition at line 384 of file date.c.

385{
388
390}
#define PG_RETURN_BOOL(x)
Definition fmgr.h:360

References fb(), PG_GETARG_DATEADT, and PG_RETURN_BOOL.

Referenced by gbt_dateeq().

◆ date_eq_timestamp()

◆ date_eq_timestamptz()

◆ date_finite()

Datum date_finite ( PG_FUNCTION_ARGS  )

Definition at line 517 of file date.c.

518{
520
522}
#define DATE_NOT_FINITE(j)
Definition date.h:49
long date
Definition pgtypes_date.h:9

References DATE_NOT_FINITE, PG_GETARG_DATEADT, and PG_RETURN_BOOL.

◆ date_ge()

Datum date_ge ( PG_FUNCTION_ARGS  )

Definition at line 429 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_BOOL.

Referenced by gbt_datege().

◆ date_ge_timestamp()

◆ date_ge_timestamptz()

◆ date_gt()

Datum date_gt ( PG_FUNCTION_ARGS  )

Definition at line 420 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_BOOL.

Referenced by gbt_dategt().

◆ date_gt_timestamp()

◆ date_gt_timestamptz()

◆ date_in()

Datum date_in ( PG_FUNCTION_ARGS  )

Definition at line 107 of file date.c.

108{
109 char *str = PG_GETARG_CSTRING(0);
110 Node *escontext = fcinfo->context;
112 fsec_t fsec;
113 struct pg_tm tt,
114 *tm = &tt;
115 int tzp;
116 int dtype;
117 int nf;
118 int dterr;
119 char *field[MAXDATEFIELDS];
120 int ftype[MAXDATEFIELDS];
121 char workbuf[MAXDATELEN + 1];
122 DateTimeErrorExtra extra;
123
125 field, ftype, MAXDATEFIELDS, &nf);
126 if (dterr == 0)
127 dterr = DecodeDateTime(field, ftype, nf,
128 &dtype, tm, &fsec, &tzp, &extra);
129 if (dterr != 0)
130 {
131 DateTimeParseError(dterr, &extra, str, "date", escontext);
133 }
134
135 switch (dtype)
136 {
137 case DTK_DATE:
138 break;
139
140 case DTK_EPOCH:
142 break;
143
144 case DTK_LATE:
147
148 case DTK_EARLY:
151
152 default:
153 DateTimeParseError(DTERR_BAD_FORMAT, &extra, str, "date", escontext);
155 }
156
157 /* Prevent overflow in Julian-day routines */
159 ereturn(escontext, (Datum) 0,
161 errmsg("date out of range: \"%s\"", str)));
162
164
165 /* Now check for just-out-of-range dates */
166 if (!IS_VALID_DATE(date))
167 ereturn(escontext, (Datum) 0,
169 errmsg("date out of range: \"%s\"", str)));
170
172}
int ParseDateTime(const char *timestr, char *workbuf, size_t buflen, char **field, int *ftype, int maxfields, int *numfields)
Definition datetime.c:774
void DateTimeParseError(int dterr, DateTimeErrorExtra *extra, const char *str, const char *datatype, Node *escontext)
Definition datetime.c:4215
int DecodeDateTime(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp, DateTimeErrorExtra *extra)
Definition datetime.c:998
int date2j(int year, int month, int day)
Definition datetime.c:297
void GetEpochTime(struct pg_tm *tm)
Definition timestamp.c:2162
#define IS_VALID_DATE(d)
Definition timestamp.h:262
int32 fsec_t
Definition timestamp.h:41
#define IS_VALID_JULIAN(y, m, d)
Definition timestamp.h:227
#define PG_RETURN_DATEADT(x)
Definition date.h:99
#define DATE_NOEND(j)
Definition date.h:47
#define DATE_NOBEGIN(j)
Definition date.h:45
#define PG_GETARG_CSTRING(n)
Definition fmgr.h:278
#define PG_RETURN_NULL()
Definition fmgr.h:346
const char * str
#define MAXDATEFIELDS
Definition datetime.h:202
#define DTK_EPOCH
Definition datetime.h:152
#define DTK_LATE
Definition datetime.h:151
#define DTK_DATE
Definition datetime.h:144
#define DTERR_BAD_FORMAT
Definition datetime.h:282
#define DTK_EARLY
Definition datetime.h:150
#define MAXDATELEN
Definition datetime.h:200

References date2j(), DATE_NOBEGIN, DATE_NOEND, DateTimeParseError(), DecodeDateTime(), DTERR_BAD_FORMAT, DTK_DATE, DTK_EARLY, DTK_EPOCH, DTK_LATE, ereturn, errcode(), errmsg, fb(), GetEpochTime(), IS_VALID_DATE, IS_VALID_JULIAN, MAXDATEFIELDS, MAXDATELEN, ParseDateTime(), PG_GETARG_CSTRING, PG_RETURN_DATEADT, PG_RETURN_NULL, POSTGRES_EPOCH_JDATE, str, tm, pg_tm::tm_mday, pg_tm::tm_mon, and pg_tm::tm_year.

◆ date_increment()

static Datum date_increment ( Relation  rel,
Datum  existing,
bool overflow 
)
static

Definition at line 476 of file date.c.

477{
479
481 {
482 /* return value is undefined */
483 *overflow = true;
484 return (Datum) 0;
485 }
486
487 *overflow = false;
488 return DateADTGetDatum(dexisting + 1);
489}
#define DATEVAL_NOEND
Definition date.h:43

References DateADTGetDatum(), DATEVAL_NOEND, DatumGetDateADT(), and fb().

Referenced by date_skipsupport().

◆ date_larger()

Datum date_larger ( PG_FUNCTION_ARGS  )

Definition at line 525 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_DATEADT.

◆ date_le()

Datum date_le ( PG_FUNCTION_ARGS  )

Definition at line 411 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_BOOL.

Referenced by gbt_datele().

◆ date_le_timestamp()

◆ date_le_timestamptz()

◆ date_lt()

Datum date_lt ( PG_FUNCTION_ARGS  )

Definition at line 402 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_BOOL.

Referenced by gbt_datelt().

◆ date_lt_timestamp()

◆ date_lt_timestamptz()

◆ date_mi()

◆ date_mi_interval()

Datum date_mi_interval ( PG_FUNCTION_ARGS  )

Definition at line 1287 of file date.c.

1288{
1292
1294
1298}
Datum timestamp_mi_interval(PG_FUNCTION_ARGS)
Definition timestamp.c:3201
static TimestampTz date2timestamp(DateADT dateVal)
Definition date.c:655
#define DirectFunctionCall2(func, arg1, arg2)
Definition fmgr.h:686
static Datum PointerGetDatum(const void *X)
Definition postgres.h:342
static Datum TimestampGetDatum(Timestamp X)
Definition timestamp.h:46
#define PG_GETARG_INTERVAL_P(n)
Definition timestamp.h:65

References date2timestamp(), DirectFunctionCall2, fb(), PG_GETARG_DATEADT, PG_GETARG_INTERVAL_P, PointerGetDatum(), timestamp_mi_interval(), and TimestampGetDatum().

◆ date_mii()

Datum date_mii ( PG_FUNCTION_ARGS  )

Definition at line 586 of file date.c.

587{
591
593 PG_RETURN_DATEADT(dateVal); /* can't change infinity */
594
595 result = dateVal - days;
596
597 /* Check for integer overflow and out-of-allowed-range */
598 if ((days >= 0 ? (result > dateVal) : (result < dateVal)) ||
602 errmsg("date out of range")));
603
605}
const char *const days[]
Definition datetime.c:85
#define PG_GETARG_INT32(n)
Definition fmgr.h:269

References DATE_NOT_FINITE, days, ereport, errcode(), errmsg, ERROR, fb(), IS_VALID_DATE, PG_GETARG_DATEADT, PG_GETARG_INT32, PG_RETURN_DATEADT, and result.

◆ date_ne()

Datum date_ne ( PG_FUNCTION_ARGS  )

Definition at line 393 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_BOOL.

◆ date_ne_timestamp()

◆ date_ne_timestamptz()

◆ date_out()

Datum date_out ( PG_FUNCTION_ARGS  )

Definition at line 178 of file date.c.

179{
181 char *result;
182 struct pg_tm tt,
183 *tm = &tt;
184 char buf[MAXDATELEN + 1];
185
188 else
189 {
191 &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
193 }
194
195 result = pstrdup(buf);
197}
void EncodeDateOnly(struct pg_tm *tm, int style, char *str)
Definition datetime.c:4350
void EncodeSpecialDate(DateADT dt, char *str)
Definition date.c:295
#define PG_RETURN_CSTRING(x)
Definition fmgr.h:364
int DateStyle
Definition globals.c:127
static char buf[DEFAULT_XLOG_SEG_SIZE]

References buf, DATE_NOT_FINITE, DateStyle, EncodeDateOnly(), EncodeSpecialDate(), fb(), j2date(), MAXDATELEN, PG_GETARG_DATEADT, PG_RETURN_CSTRING, POSTGRES_EPOCH_JDATE, pstrdup(), result, tm, pg_tm::tm_mday, pg_tm::tm_mon, and pg_tm::tm_year.

Referenced by ExecGetJsonValueItemString().

◆ date_pl_interval()

◆ date_pli()

Datum date_pli ( PG_FUNCTION_ARGS  )

Definition at line 562 of file date.c.

563{
567
569 PG_RETURN_DATEADT(dateVal); /* can't change infinity */
570
571 result = dateVal + days;
572
573 /* Check for integer overflow and out-of-allowed-range */
574 if ((days >= 0 ? (result < dateVal) : (result > dateVal)) ||
578 errmsg("date out of range")));
579
581}

References DATE_NOT_FINITE, days, ereport, errcode(), errmsg, ERROR, fb(), IS_VALID_DATE, PG_GETARG_DATEADT, PG_GETARG_INT32, PG_RETURN_DATEADT, and result.

◆ date_recv()

Datum date_recv ( PG_FUNCTION_ARGS  )

Definition at line 203 of file date.c.

204{
207
208 result = (DateADT) pq_getmsgint(buf, sizeof(DateADT));
209
210 /* Limit to the same range that date_in() accepts. */
212 /* ok */ ;
213 else if (!IS_VALID_DATE(result))
216 errmsg("date out of range")));
217
219}
#define PG_GETARG_POINTER(n)
Definition fmgr.h:277
unsigned int pq_getmsgint(StringInfo msg, int b)
Definition pqformat.c:414
struct StringInfoData * StringInfo
Definition string.h:15

References buf, DATE_NOT_FINITE, ereport, errcode(), errmsg, ERROR, fb(), IS_VALID_DATE, PG_GETARG_POINTER, PG_RETURN_DATEADT, pq_getmsgint(), and result.

◆ date_send()

Datum date_send ( PG_FUNCTION_ARGS  )

Definition at line 225 of file date.c.

226{
229
233}
#define PG_RETURN_BYTEA_P(x)
Definition fmgr.h:373
void pq_begintypsend(StringInfo buf)
Definition pqformat.c:325
bytea * pq_endtypsend(StringInfo buf)
Definition pqformat.c:345
static void pq_sendint32(StringInfo buf, uint32 i)
Definition pqformat.h:144

References buf, PG_GETARG_DATEADT, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), and pq_sendint32().

◆ date_skipsupport()

Datum date_skipsupport ( PG_FUNCTION_ARGS  )

Definition at line 492 of file date.c.

493{
495
496 sksup->decrement = date_decrement;
497 sksup->increment = date_increment;
500
502}
static Datum date_decrement(Relation rel, Datum existing, bool *underflow)
Definition date.c:460
static Datum date_increment(Relation rel, Datum existing, bool *overflow)
Definition date.c:476
#define PG_RETURN_VOID()
Definition fmgr.h:350
struct SkipSupportData * SkipSupport
Definition skipsupport.h:50
SkipSupportIncDec decrement
Definition skipsupport.h:91
SkipSupportIncDec increment
Definition skipsupport.h:92

References date_decrement(), date_increment(), DateADTGetDatum(), DATEVAL_NOBEGIN, DATEVAL_NOEND, SkipSupportData::decrement, SkipSupportData::high_elem, SkipSupportData::increment, SkipSupportData::low_elem, PG_GETARG_POINTER, and PG_RETURN_VOID.

◆ date_smaller()

Datum date_smaller ( PG_FUNCTION_ARGS  )

Definition at line 534 of file date.c.

References fb(), PG_GETARG_DATEADT, and PG_RETURN_DATEADT.

◆ date_sortsupport()

Datum date_sortsupport ( PG_FUNCTION_ARGS  )

Definition at line 451 of file date.c.

452{
454
457}
struct SortSupportData * SortSupport
Definition execnodes.h:61
int(* comparator)(Datum x, Datum y, SortSupport ssup)
int ssup_datum_int32_cmp(Datum x, Datum y, SortSupport ssup)
Definition tuplesort.c:3472

References SortSupportData::comparator, PG_GETARG_POINTER, PG_RETURN_VOID, and ssup_datum_int32_cmp().

◆ date_timestamp()

Datum date_timestamp ( PG_FUNCTION_ARGS  )

Definition at line 1304 of file date.c.

1305{
1308
1309 result = date2timestamp_safe(dateVal, fcinfo->context);
1310 if (SOFT_ERROR_OCCURRED(fcinfo->context))
1312
1314}
#define SOFT_ERROR_OCCURRED(escontext)
Definition miscnodes.h:53
#define PG_RETURN_TIMESTAMP(x)
Definition timestamp.h:67

References date2timestamp_safe(), fb(), PG_GETARG_DATEADT, PG_RETURN_NULL, PG_RETURN_TIMESTAMP, result, and SOFT_ERROR_OCCURRED.

Referenced by executeDateTimeMethod().

◆ date_timestamptz()

Datum date_timestamptz ( PG_FUNCTION_ARGS  )

Definition at line 1382 of file date.c.

1383{
1386
1387 result = date2timestamptz_safe(dateVal, fcinfo->context);
1388 if (SOFT_ERROR_OCCURRED(fcinfo->context))
1390
1392}

References date2timestamptz_safe(), fb(), PG_GETARG_DATEADT, PG_RETURN_NULL, PG_RETURN_TIMESTAMP, result, and SOFT_ERROR_OCCURRED.

Referenced by executeDateTimeMethod().

◆ datetime_timestamp()

Datum datetime_timestamp ( PG_FUNCTION_ARGS  )

Definition at line 2055 of file date.c.

2056{
2058 TimeADT time = PG_GETARG_TIMEADT(1);
2060
2063 {
2064 result += time;
2066 ereport(ERROR,
2068 errmsg("timestamp out of range")));
2069 }
2070
2072}
#define TIMESTAMP_NOT_FINITE(j)
Definition timestamp.h:169
#define PG_GETARG_TIMEADT(n)
Definition date.h:96
int64 TimeADT
Definition date.h:23

References date2timestamp(), ereport, errcode(), errmsg, ERROR, fb(), IS_VALID_TIMESTAMP, PG_GETARG_DATEADT, PG_GETARG_TIMEADT, PG_RETURN_TIMESTAMP, result, and TIMESTAMP_NOT_FINITE.

◆ datetimetz_timestamptz()

Datum datetimetz_timestamptz ( PG_FUNCTION_ARGS  )

Definition at line 2975 of file date.c.

2976{
2980
2981 if (DATE_IS_NOBEGIN(date))
2983 else if (DATE_IS_NOEND(date))
2985 else
2986 {
2987 /*
2988 * Date's range is wider than timestamp's, so check for boundaries.
2989 * Since dates have the same minimum values as timestamps, only upper
2990 * boundary need be checked for overflow.
2991 */
2993 ereport(ERROR,
2995 errmsg("date out of range for timestamp")));
2996 result = date * USECS_PER_DAY + time->time + time->zone * USECS_PER_SEC;
2997
2998 /*
2999 * Since it is possible to go beyond allowed timestamptz range because
3000 * of time zone, check for allowed timestamp range after adding tz.
3001 */
3003 ereport(ERROR,
3005 errmsg("date out of range for timestamp")));
3006 }
3007
3009}
#define PG_GETARG_TIMETZADT_P(n)
Definition date.h:97
TimeADT time
Definition date.h:27
int32 zone
Definition date.h:28

References DATE_IS_NOBEGIN, DATE_IS_NOEND, ereport, errcode(), errmsg, ERROR, fb(), IS_VALID_TIMESTAMP, PG_GETARG_DATEADT, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMESTAMP, POSTGRES_EPOCH_JDATE, result, TimeTzADT::time, TIMESTAMP_END_JULIAN, TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, USECS_PER_DAY, USECS_PER_SEC, and TimeTzADT::zone.

◆ EncodeSpecialDate()

void EncodeSpecialDate ( DateADT  dt,
char str 
)

Definition at line 295 of file date.c.

296{
297 if (DATE_IS_NOBEGIN(dt))
298 strcpy(str, EARLY);
299 else if (DATE_IS_NOEND(dt))
300 strcpy(str, LATE);
301 else /* shouldn't happen */
302 elog(ERROR, "invalid argument for EncodeSpecialDate");
303}
#define elog(elevel,...)
Definition elog.h:228
#define EARLY
Definition datetime.h:39
#define LATE
Definition datetime.h:40

References DATE_IS_NOBEGIN, DATE_IS_NOEND, EARLY, elog, ERROR, fb(), LATE, and str.

Referenced by date_out(), and JsonEncodeDateTime().

◆ extract_date()

Datum extract_date ( PG_FUNCTION_ARGS  )

Definition at line 1087 of file date.c.

1088{
1092 int type,
1093 val;
1094 char *lowunits;
1095 int year,
1096 mon,
1097 mday;
1098
1101 false);
1102
1103 type = DecodeUnits(0, lowunits, &val);
1104 if (type == UNKNOWN_FIELD)
1106
1107 if (DATE_NOT_FINITE(date) && (type == UNITS || type == RESERV))
1108 {
1109 switch (val)
1110 {
1111 /* Oscillating units */
1112 case DTK_DAY:
1113 case DTK_MONTH:
1114 case DTK_QUARTER:
1115 case DTK_WEEK:
1116 case DTK_DOW:
1117 case DTK_ISODOW:
1118 case DTK_DOY:
1120 break;
1121
1122 /* Monotonically-increasing units */
1123 case DTK_YEAR:
1124 case DTK_DECADE:
1125 case DTK_CENTURY:
1126 case DTK_MILLENNIUM:
1127 case DTK_JULIAN:
1128 case DTK_ISOYEAR:
1129 case DTK_EPOCH:
1130 if (DATE_IS_NOBEGIN(date))
1132 CStringGetDatum("-Infinity"),
1134 Int32GetDatum(-1))));
1135 else
1137 CStringGetDatum("Infinity"),
1139 Int32GetDatum(-1))));
1140 default:
1141 ereport(ERROR,
1143 errmsg("unit \"%s\" not supported for type %s",
1145 }
1146 }
1147 else if (type == UNITS)
1148 {
1149 j2date(date + POSTGRES_EPOCH_JDATE, &year, &mon, &mday);
1150
1151 switch (val)
1152 {
1153 case DTK_DAY:
1154 intresult = mday;
1155 break;
1156
1157 case DTK_MONTH:
1158 intresult = mon;
1159 break;
1160
1161 case DTK_QUARTER:
1162 intresult = (mon - 1) / 3 + 1;
1163 break;
1164
1165 case DTK_WEEK:
1166 intresult = date2isoweek(year, mon, mday);
1167 break;
1168
1169 case DTK_YEAR:
1170 if (year > 0)
1171 intresult = year;
1172 else
1173 /* there is no year 0, just 1 BC and 1 AD */
1174 intresult = year - 1;
1175 break;
1176
1177 case DTK_DECADE:
1178 /* see comments in timestamp_part */
1179 if (year >= 0)
1180 intresult = year / 10;
1181 else
1182 intresult = -((8 - (year - 1)) / 10);
1183 break;
1184
1185 case DTK_CENTURY:
1186 /* see comments in timestamp_part */
1187 if (year > 0)
1188 intresult = (year + 99) / 100;
1189 else
1190 intresult = -((99 - (year - 1)) / 100);
1191 break;
1192
1193 case DTK_MILLENNIUM:
1194 /* see comments in timestamp_part */
1195 if (year > 0)
1196 intresult = (year + 999) / 1000;
1197 else
1198 intresult = -((999 - (year - 1)) / 1000);
1199 break;
1200
1201 case DTK_JULIAN:
1203 break;
1204
1205 case DTK_ISOYEAR:
1206 intresult = date2isoyear(year, mon, mday);
1207 /* Adjust BC years */
1208 if (intresult <= 0)
1209 intresult -= 1;
1210 break;
1211
1212 case DTK_DOW:
1213 case DTK_ISODOW:
1215 if (val == DTK_ISODOW && intresult == 0)
1216 intresult = 7;
1217 break;
1218
1219 case DTK_DOY:
1220 intresult = date2j(year, mon, mday) - date2j(year, 1, 1) + 1;
1221 break;
1222
1223 default:
1224 ereport(ERROR,
1226 errmsg("unit \"%s\" not supported for type %s",
1228 intresult = 0;
1229 }
1230 }
1231 else if (type == RESERV)
1232 {
1233 switch (val)
1234 {
1235 case DTK_EPOCH:
1237 break;
1238
1239 default:
1240 ereport(ERROR,
1242 errmsg("unit \"%s\" not supported for type %s",
1244 intresult = 0;
1245 }
1246 }
1247 else
1248 {
1249 ereport(ERROR,
1251 errmsg("unit \"%s\" not recognized for type %s",
1253 intresult = 0;
1254 }
1255
1257}
int DecodeUnits(int field, const char *lowtoken, int *val)
Definition datetime.c:4170
int j2day(int date)
Definition datetime.c:355
int DecodeSpecial(int field, const char *lowtoken, int *val)
Definition datetime.c:3247
Numeric int64_to_numeric(int64 val)
Definition numeric.c:4264
Datum numeric_in(PG_FUNCTION_ARGS)
Definition numeric.c:626
int date2isoweek(int year, int mon, int mday)
Definition timestamp.c:5289
int date2isoyear(int year, int mon, int mday)
Definition timestamp.c:5344
#define UNIX_EPOCH_JDATE
Definition timestamp.h:234
#define SECS_PER_DAY
Definition timestamp.h:126
#define PG_GETARG_TEXT_PP(n)
Definition fmgr.h:310
#define DirectFunctionCall3(func, arg1, arg2, arg3)
Definition fmgr.h:688
char * format_type_be(Oid type_oid)
#define UNKNOWN_FIELD
Definition datetime.h:124
#define DTK_DECADE
Definition datetime.h:168
#define DTK_QUARTER
Definition datetime.h:166
#define DTK_JULIAN
Definition datetime.h:173
#define DTK_CENTURY
Definition datetime.h:169
#define DTK_ISODOW
Definition datetime.h:180
#define DTK_DAY
Definition datetime.h:163
#define RESERV
Definition datetime.h:90
#define DTK_MILLENNIUM
Definition datetime.h:170
#define DTK_ISOYEAR
Definition datetime.h:179
#define DTK_DOY
Definition datetime.h:176
#define DTK_WEEK
Definition datetime.h:164
#define DTK_DOW
Definition datetime.h:175
#define DTK_YEAR
Definition datetime.h:167
#define DTK_MONTH
Definition datetime.h:165
#define UNITS
Definition datetime.h:107
long val
Definition informix.c:689
static Numeric DatumGetNumeric(Datum X)
Definition numeric.h:64
#define PG_RETURN_NUMERIC(x)
Definition numeric.h:83
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:252
static Datum CStringGetDatum(const char *X)
Definition postgres.h:370
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
#define InvalidOid
char * downcase_truncate_identifier(const char *ident, int len, bool warn)
Definition scansup.c:38
Definition c.h:776
static Size VARSIZE_ANY_EXHDR(const void *PTR)
Definition varatt.h:472
static char * VARDATA_ANY(const void *PTR)
Definition varatt.h:486
const char * type

References CStringGetDatum(), date2isoweek(), date2isoyear(), date2j(), DATE_IS_NOBEGIN, DATE_NOT_FINITE, DatumGetNumeric(), DecodeSpecial(), DecodeUnits(), DirectFunctionCall3, downcase_truncate_identifier(), DTK_CENTURY, DTK_DAY, DTK_DECADE, DTK_DOW, DTK_DOY, DTK_EPOCH, DTK_ISODOW, DTK_ISOYEAR, DTK_JULIAN, DTK_MILLENNIUM, DTK_MONTH, DTK_QUARTER, DTK_WEEK, DTK_YEAR, ereport, errcode(), errmsg, ERROR, fb(), format_type_be(), Int32GetDatum(), int64_to_numeric(), InvalidOid, j2date(), j2day(), numeric_in(), ObjectIdGetDatum(), PG_GETARG_DATEADT, PG_GETARG_TEXT_PP, PG_RETURN_NULL, PG_RETURN_NUMERIC, POSTGRES_EPOCH_JDATE, RESERV, SECS_PER_DAY, type, UNITS, UNIX_EPOCH_JDATE, UNKNOWN_FIELD, val, VARDATA_ANY(), and VARSIZE_ANY_EXHDR().

◆ extract_time()

Datum extract_time ( PG_FUNCTION_ARGS  )

Definition at line 2338 of file date.c.

2339{
2340 return time_part_common(fcinfo, true);
2341}
static Datum time_part_common(PG_FUNCTION_ARGS, bool retnumeric)
Definition date.c:2229

References time_part_common().

◆ extract_timetz()

Datum extract_timetz ( PG_FUNCTION_ARGS  )

Definition at line 3139 of file date.c.

3140{
3141 return timetz_part_common(fcinfo, true);
3142}
static Datum timetz_part_common(PG_FUNCTION_ARGS, bool retnumeric)
Definition date.c:3016

References timetz_part_common().

◆ float_time_overflows()

bool float_time_overflows ( int  hour,
int  min,
double  sec 
)

Definition at line 1540 of file date.c.

1541{
1542 /* Range-check the fields individually. */
1545 return true;
1546
1547 /*
1548 * "sec", being double, requires extra care. Cope with NaN, and round off
1549 * before applying the range check to avoid unexpected errors due to
1550 * imprecise input. (We assume rint() behaves sanely with infinities.)
1551 */
1552 if (isnan(sec))
1553 return true;
1554 sec = rint(sec * USECS_PER_SEC);
1556 return true;
1557
1558 /*
1559 * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1560 * that the total time value doesn't exceed 24:00:00. This must match the
1561 * way that callers will convert the fields to a time.
1562 */
1563 if (((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1564 * USECS_PER_SEC) + (int64) sec) > USECS_PER_DAY)
1565 return true;
1566
1567 return false;
1568}
#define MINS_PER_HOUR
Definition timestamp.h:129
#define SECS_PER_MINUTE
Definition timestamp.h:128
#define HOURS_PER_DAY
Definition timestamp.h:118

References fb(), HOURS_PER_DAY, MINS_PER_HOUR, SECS_PER_MINUTE, USECS_PER_DAY, and USECS_PER_SEC.

Referenced by make_time(), and make_timestamp_internal().

◆ GetSQLCurrentDate()

DateADT GetSQLCurrentDate ( void  )

Definition at line 310 of file date.c.

311{
312 struct pg_tm tm;
313
314 static int cache_year = 0;
315 static int cache_mon = 0;
316 static int cache_mday = 0;
317 static DateADT cache_date;
318
320
321 /*
322 * date2j involves several integer divisions; moreover, unless our session
323 * lives across local midnight, we don't really have to do it more than
324 * once. So it seems worth having a separate cache here.
325 */
326 if (tm.tm_year != cache_year ||
327 tm.tm_mon != cache_mon ||
329 {
334 }
335
336 return cache_date;
337}
void GetCurrentDateTime(struct pg_tm *tm)
Definition datetime.c:377

References date2j(), fb(), GetCurrentDateTime(), POSTGRES_EPOCH_JDATE, tm, pg_tm::tm_mday, pg_tm::tm_mon, and pg_tm::tm_year.

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLCurrentTime()

TimeTzADT * GetSQLCurrentTime ( int32  typmod)

Definition at line 343 of file date.c.

344{
346 struct pg_tm tt,
347 *tm = &tt;
348 fsec_t fsec;
349 int tz;
350
351 GetCurrentTimeUsec(tm, &fsec, &tz);
352
354 tm2timetz(tm, fsec, tz, result);
355 AdjustTimeForTypmod(&(result->time), typmod);
356 return result;
357}
void GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp)
Definition datetime.c:398
int tm2timetz(struct pg_tm *tm, fsec_t fsec, int tz, TimeTzADT *result)
Definition date.c:2352
void AdjustTimeForTypmod(TimeADT *time, int32 typmod)
Definition date.c:1734
#define palloc_object(type)
Definition fe_memutils.h:74

References AdjustTimeForTypmod(), fb(), GetCurrentTimeUsec(), palloc_object, result, tm, and tm2timetz().

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLLocalTime()

TimeADT GetSQLLocalTime ( int32  typmod)

Definition at line 363 of file date.c.

364{
366 struct pg_tm tt,
367 *tm = &tt;
368 fsec_t fsec;
369 int tz;
370
371 GetCurrentTimeUsec(tm, &fsec, &tz);
372
373 tm2time(tm, fsec, &result);
374 AdjustTimeForTypmod(&result, typmod);
375 return result;
376}
int tm2time(struct pg_tm *tm, fsec_t fsec, TimeADT *result)
Definition date.c:1505

References AdjustTimeForTypmod(), fb(), GetCurrentTimeUsec(), result, tm, and tm2time().

Referenced by ExecEvalSQLValueFunction().

◆ hashdate()

Datum hashdate ( PG_FUNCTION_ARGS  )

Definition at line 505 of file date.c.

506{
508}
static Datum hash_uint32(uint32 k)
Definition hashfn.h:43

References hash_uint32(), and PG_GETARG_DATEADT.

◆ hashdateextended()

Datum hashdateextended ( PG_FUNCTION_ARGS  )

Definition at line 511 of file date.c.

512{
514}
#define PG_GETARG_INT64(n)
Definition fmgr.h:284
static Datum hash_uint32_extended(uint32 k, uint64 seed)
Definition hashfn.h:49

References hash_uint32_extended(), PG_GETARG_DATEADT, and PG_GETARG_INT64.

◆ in_range_date_interval()

Datum in_range_date_interval ( PG_FUNCTION_ARGS  )

Definition at line 1060 of file date.c.

1061{
1063 DateADT base = PG_GETARG_DATEADT(1);
1064 Interval *offset = PG_GETARG_INTERVAL_P(2);
1065 bool sub = PG_GETARG_BOOL(3);
1066 bool less = PG_GETARG_BOOL(4);
1069
1070 /* XXX we could support out-of-range cases here, perhaps */
1072 baseStamp = date2timestamp(base);
1073
1077 IntervalPGetDatum(offset),
1078 BoolGetDatum(sub),
1080}
Datum in_range_timestamp_interval(PG_FUNCTION_ARGS)
Definition timestamp.c:3870
#define PG_GETARG_BOOL(n)
Definition fmgr.h:274
#define DirectFunctionCall5(func, arg1, arg2, arg3, arg4, arg5)
Definition fmgr.h:692
static Datum BoolGetDatum(bool X)
Definition postgres.h:112
static Datum IntervalPGetDatum(const Interval *X)
Definition timestamp.h:58

References BoolGetDatum(), date2timestamp(), DirectFunctionCall5, fb(), in_range_timestamp_interval(), IntervalPGetDatum(), PG_GETARG_BOOL, PG_GETARG_DATEADT, PG_GETARG_INTERVAL_P, TimestampGetDatum(), and val.

◆ in_range_time_interval()

Datum in_range_time_interval ( PG_FUNCTION_ARGS  )

Definition at line 2187 of file date.c.

2188{
2190 TimeADT base = PG_GETARG_TIMEADT(1);
2191 Interval *offset = PG_GETARG_INTERVAL_P(2);
2192 bool sub = PG_GETARG_BOOL(3);
2193 bool less = PG_GETARG_BOOL(4);
2194 TimeADT sum;
2195
2196 /*
2197 * Like time_pl_interval/time_mi_interval, we disregard the month and day
2198 * fields of the offset. So our test for negative should too. This also
2199 * catches -infinity, so we only need worry about +infinity below.
2200 */
2201 if (offset->time < 0)
2202 ereport(ERROR,
2204 errmsg("invalid preceding or following size in window function")));
2205
2206 /*
2207 * We can't use time_pl_interval/time_mi_interval here, because their
2208 * wraparound behavior would give wrong (or at least undesirable) answers.
2209 * Fortunately the equivalent non-wrapping behavior is trivial, except
2210 * that adding an infinite (or very large) interval might cause integer
2211 * overflow. Subtraction cannot overflow here.
2212 */
2213 if (sub)
2214 sum = base - offset->time;
2215 else if (pg_add_s64_overflow(base, offset->time, &sum))
2217
2218 if (less)
2219 PG_RETURN_BOOL(val <= sum);
2220 else
2221 PG_RETURN_BOOL(val >= sum);
2222}
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
Definition int.h:235
TimeOffset time
Definition timestamp.h:49

References ereport, errcode(), errmsg, ERROR, fb(), pg_add_s64_overflow(), PG_GETARG_BOOL, PG_GETARG_INTERVAL_P, PG_GETARG_TIMEADT, PG_RETURN_BOOL, Interval::time, and val.

◆ in_range_timetz_interval()

Datum in_range_timetz_interval ( PG_FUNCTION_ARGS  )

Definition at line 2739 of file date.c.

2740{
2743 Interval *offset = PG_GETARG_INTERVAL_P(2);
2744 bool sub = PG_GETARG_BOOL(3);
2745 bool less = PG_GETARG_BOOL(4);
2746 TimeTzADT sum;
2747
2748 /*
2749 * Like timetz_pl_interval/timetz_mi_interval, we disregard the month and
2750 * day fields of the offset. So our test for negative should too. This
2751 * also catches -infinity, so we only need worry about +infinity below.
2752 */
2753 if (offset->time < 0)
2754 ereport(ERROR,
2756 errmsg("invalid preceding or following size in window function")));
2757
2758 /*
2759 * We can't use timetz_pl_interval/timetz_mi_interval here, because their
2760 * wraparound behavior would give wrong (or at least undesirable) answers.
2761 * Fortunately the equivalent non-wrapping behavior is trivial, except
2762 * that adding an infinite (or very large) interval might cause integer
2763 * overflow. Subtraction cannot overflow here.
2764 */
2765 if (sub)
2766 sum.time = base->time - offset->time;
2767 else if (pg_add_s64_overflow(base->time, offset->time, &sum.time))
2769 sum.zone = base->zone;
2770
2771 if (less)
2773 else
2775}
static int timetz_cmp_internal(TimeTzADT *time1, TimeTzADT *time2)
Definition date.c:2532

References ereport, errcode(), errmsg, ERROR, fb(), pg_add_s64_overflow(), PG_GETARG_BOOL, PG_GETARG_INTERVAL_P, PG_GETARG_TIMETZADT_P, PG_RETURN_BOOL, Interval::time, TimeTzADT::time, timetz_cmp_internal(), val, and TimeTzADT::zone.

◆ interval_time()

Datum interval_time ( PG_FUNCTION_ARGS  )

Definition at line 2101 of file date.c.

2102{
2105
2107 ereturn(fcinfo->context, (Datum) 0,
2109 errmsg("cannot convert infinite interval to time")));
2110
2111 result = span->time % USECS_PER_DAY;
2112 if (result < 0)
2114
2116}
#define INTERVAL_NOT_FINITE(i)
Definition timestamp.h:195
#define PG_RETURN_TIMEADT(x)
Definition date.h:100

References ereturn, errcode(), errmsg, fb(), INTERVAL_NOT_FINITE, PG_GETARG_INTERVAL_P, PG_RETURN_TIMEADT, result, and USECS_PER_DAY.

◆ make_date()

Datum make_date ( PG_FUNCTION_ARGS  )

Definition at line 239 of file date.c.

240{
241 struct pg_tm tm;
243 int dterr;
244 bool bc = false;
245
249
250 /* Handle negative years as BC */
251 if (tm.tm_year < 0)
252 {
253 int year = tm.tm_year;
254
255 bc = true;
256 if (pg_neg_s32_overflow(year, &year))
259 errmsg("date field value out of range: %d-%02d-%02d",
261 tm.tm_year = year;
262 }
263
264 dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm);
265
266 if (dterr != 0)
269 errmsg("date field value out of range: %d-%02d-%02d",
271
272 /* Prevent overflow in Julian-day routines */
276 errmsg("date out of range: %d-%02d-%02d",
278
280
281 /* Now check for just-out-of-range dates */
282 if (!IS_VALID_DATE(date))
285 errmsg("date out of range: %d-%02d-%02d",
287
289}
int ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc, struct pg_tm *tm)
Definition datetime.c:2562
#define DTK_DATE_M
Definition datetime.h:191
static bool pg_neg_s32_overflow(int32 a, int32 *result)
Definition int.h:205

References date2j(), DTK_DATE_M, ereport, errcode(), errmsg, ERROR, fb(), IS_VALID_DATE, IS_VALID_JULIAN, PG_GETARG_INT32, pg_neg_s32_overflow(), PG_RETURN_DATEADT, POSTGRES_EPOCH_JDATE, tm, pg_tm::tm_mday, pg_tm::tm_mon, pg_tm::tm_year, and ValidateDate().

◆ make_time()

Datum make_time ( PG_FUNCTION_ARGS  )

Definition at line 1666 of file date.c.

1667{
1668 int tm_hour = PG_GETARG_INT32(0);
1669 int tm_min = PG_GETARG_INT32(1);
1670 double sec = PG_GETARG_FLOAT8(2);
1671 TimeADT time;
1672
1673 /* Check for time overflow */
1674 if (float_time_overflows(tm_hour, tm_min, sec))
1675 ereport(ERROR,
1677 errmsg("time field value out of range: %d:%02d:%02g",
1678 tm_hour, tm_min, sec)));
1679
1680 /* This should match tm2time */
1681 time = (((tm_hour * MINS_PER_HOUR + tm_min) * SECS_PER_MINUTE)
1682 * USECS_PER_SEC) + (int64) rint(sec * USECS_PER_SEC);
1683
1684 PG_RETURN_TIMEADT(time);
1685}
bool float_time_overflows(int hour, int min, double sec)
Definition date.c:1540
#define PG_GETARG_FLOAT8(n)
Definition fmgr.h:283

References ereport, errcode(), errmsg, ERROR, fb(), float_time_overflows(), MINS_PER_HOUR, PG_GETARG_FLOAT8, PG_GETARG_INT32, PG_RETURN_TIMEADT, SECS_PER_MINUTE, pg_tm::tm_hour, pg_tm::tm_min, and USECS_PER_SEC.

◆ overlaps_time()

Datum overlaps_time ( PG_FUNCTION_ARGS  )

Definition at line 1872 of file date.c.

1873{
1874 /*
1875 * The arguments are TimeADT, but we leave them as generic Datums to avoid
1876 * dereferencing nulls (TimeADT is pass-by-reference!)
1877 */
1882 bool ts1IsNull = PG_ARGISNULL(0);
1883 bool te1IsNull = PG_ARGISNULL(1);
1884 bool ts2IsNull = PG_ARGISNULL(2);
1885 bool te2IsNull = PG_ARGISNULL(3);
1886
1887#define TIMEADT_GT(t1,t2) \
1888 (DatumGetTimeADT(t1) > DatumGetTimeADT(t2))
1889#define TIMEADT_LT(t1,t2) \
1890 (DatumGetTimeADT(t1) < DatumGetTimeADT(t2))
1891
1892 /*
1893 * If both endpoints of interval 1 are null, the result is null (unknown).
1894 * If just one endpoint is null, take ts1 as the non-null one. Otherwise,
1895 * take ts1 as the lesser endpoint.
1896 */
1897 if (ts1IsNull)
1898 {
1899 if (te1IsNull)
1901 /* swap null for non-null */
1902 ts1 = te1;
1903 te1IsNull = true;
1904 }
1905 else if (!te1IsNull)
1906 {
1907 if (TIMEADT_GT(ts1, te1))
1908 {
1909 Datum tt = ts1;
1910
1911 ts1 = te1;
1912 te1 = tt;
1913 }
1914 }
1915
1916 /* Likewise for interval 2. */
1917 if (ts2IsNull)
1918 {
1919 if (te2IsNull)
1921 /* swap null for non-null */
1922 ts2 = te2;
1923 te2IsNull = true;
1924 }
1925 else if (!te2IsNull)
1926 {
1927 if (TIMEADT_GT(ts2, te2))
1928 {
1929 Datum tt = ts2;
1930
1931 ts2 = te2;
1932 te2 = tt;
1933 }
1934 }
1935
1936 /*
1937 * At this point neither ts1 nor ts2 is null, so we can consider three
1938 * cases: ts1 > ts2, ts1 < ts2, ts1 = ts2
1939 */
1940 if (TIMEADT_GT(ts1, ts2))
1941 {
1942 /*
1943 * This case is ts1 < te2 OR te1 < te2, which may look redundant but
1944 * in the presence of nulls it's not quite completely so.
1945 */
1946 if (te2IsNull)
1948 if (TIMEADT_LT(ts1, te2))
1949 PG_RETURN_BOOL(true);
1950 if (te1IsNull)
1952
1953 /*
1954 * If te1 is not null then we had ts1 <= te1 above, and we just found
1955 * ts1 >= te2, hence te1 >= te2.
1956 */
1957 PG_RETURN_BOOL(false);
1958 }
1959 else if (TIMEADT_LT(ts1, ts2))
1960 {
1961 /* This case is ts2 < te1 OR te2 < te1 */
1962 if (te1IsNull)
1964 if (TIMEADT_LT(ts2, te1))
1965 PG_RETURN_BOOL(true);
1966 if (te2IsNull)
1968
1969 /*
1970 * If te2 is not null then we had ts2 <= te2 above, and we just found
1971 * ts2 >= te1, hence te2 >= te1.
1972 */
1973 PG_RETURN_BOOL(false);
1974 }
1975 else
1976 {
1977 /*
1978 * For ts1 = ts2 the spec says te1 <> te2 OR te1 = te2, which is a
1979 * rather silly way of saying "true if both are nonnull, else null".
1980 */
1981 if (te1IsNull || te2IsNull)
1983 PG_RETURN_BOOL(true);
1984 }
1985
1986#undef TIMEADT_GT
1987#undef TIMEADT_LT
1988}
#define TIMEADT_GT(t1, t2)
#define TIMEADT_LT(t1, t2)
#define PG_ARGISNULL(n)
Definition fmgr.h:209
#define PG_GETARG_DATUM(n)
Definition fmgr.h:268

References fb(), PG_ARGISNULL, PG_GETARG_DATUM, PG_RETURN_BOOL, PG_RETURN_NULL, TIMEADT_GT, and TIMEADT_LT.

◆ overlaps_timetz()

Datum overlaps_timetz ( PG_FUNCTION_ARGS  )

Definition at line 2784 of file date.c.

2785{
2786 /*
2787 * The arguments are TimeTzADT *, but we leave them as generic Datums for
2788 * convenience of notation --- and to avoid dereferencing nulls.
2789 */
2794 bool ts1IsNull = PG_ARGISNULL(0);
2795 bool te1IsNull = PG_ARGISNULL(1);
2796 bool ts2IsNull = PG_ARGISNULL(2);
2797 bool te2IsNull = PG_ARGISNULL(3);
2798
2799#define TIMETZ_GT(t1,t2) \
2800 DatumGetBool(DirectFunctionCall2(timetz_gt,t1,t2))
2801#define TIMETZ_LT(t1,t2) \
2802 DatumGetBool(DirectFunctionCall2(timetz_lt,t1,t2))
2803
2804 /*
2805 * If both endpoints of interval 1 are null, the result is null (unknown).
2806 * If just one endpoint is null, take ts1 as the non-null one. Otherwise,
2807 * take ts1 as the lesser endpoint.
2808 */
2809 if (ts1IsNull)
2810 {
2811 if (te1IsNull)
2813 /* swap null for non-null */
2814 ts1 = te1;
2815 te1IsNull = true;
2816 }
2817 else if (!te1IsNull)
2818 {
2819 if (TIMETZ_GT(ts1, te1))
2820 {
2821 Datum tt = ts1;
2822
2823 ts1 = te1;
2824 te1 = tt;
2825 }
2826 }
2827
2828 /* Likewise for interval 2. */
2829 if (ts2IsNull)
2830 {
2831 if (te2IsNull)
2833 /* swap null for non-null */
2834 ts2 = te2;
2835 te2IsNull = true;
2836 }
2837 else if (!te2IsNull)
2838 {
2839 if (TIMETZ_GT(ts2, te2))
2840 {
2841 Datum tt = ts2;
2842
2843 ts2 = te2;
2844 te2 = tt;
2845 }
2846 }
2847
2848 /*
2849 * At this point neither ts1 nor ts2 is null, so we can consider three
2850 * cases: ts1 > ts2, ts1 < ts2, ts1 = ts2
2851 */
2852 if (TIMETZ_GT(ts1, ts2))
2853 {
2854 /*
2855 * This case is ts1 < te2 OR te1 < te2, which may look redundant but
2856 * in the presence of nulls it's not quite completely so.
2857 */
2858 if (te2IsNull)
2860 if (TIMETZ_LT(ts1, te2))
2861 PG_RETURN_BOOL(true);
2862 if (te1IsNull)
2864
2865 /*
2866 * If te1 is not null then we had ts1 <= te1 above, and we just found
2867 * ts1 >= te2, hence te1 >= te2.
2868 */
2869 PG_RETURN_BOOL(false);
2870 }
2871 else if (TIMETZ_LT(ts1, ts2))
2872 {
2873 /* This case is ts2 < te1 OR te2 < te1 */
2874 if (te1IsNull)
2876 if (TIMETZ_LT(ts2, te1))
2877 PG_RETURN_BOOL(true);
2878 if (te2IsNull)
2880
2881 /*
2882 * If te2 is not null then we had ts2 <= te2 above, and we just found
2883 * ts2 >= te1, hence te2 >= te1.
2884 */
2885 PG_RETURN_BOOL(false);
2886 }
2887 else
2888 {
2889 /*
2890 * For ts1 = ts2 the spec says te1 <> te2 OR te1 = te2, which is a
2891 * rather silly way of saying "true if both are nonnull, else null".
2892 */
2893 if (te1IsNull || te2IsNull)
2895 PG_RETURN_BOOL(true);
2896 }
2897
2898#undef TIMETZ_GT
2899#undef TIMETZ_LT
2900}
#define TIMETZ_GT(t1, t2)
#define TIMETZ_LT(t1, t2)

References fb(), PG_ARGISNULL, PG_GETARG_DATUM, PG_RETURN_BOOL, PG_RETURN_NULL, TIMETZ_GT, and TIMETZ_LT.

◆ time2tm()

int time2tm ( TimeADT  time,
struct pg_tm tm,
fsec_t fsec 
)

Definition at line 1577 of file date.c.

1578{
1579 tm->tm_hour = time / USECS_PER_HOUR;
1580 time -= tm->tm_hour * USECS_PER_HOUR;
1581 tm->tm_min = time / USECS_PER_MINUTE;
1582 time -= tm->tm_min * USECS_PER_MINUTE;
1583 tm->tm_sec = time / USECS_PER_SEC;
1584 time -= tm->tm_sec * USECS_PER_SEC;
1585 *fsec = time;
1586 return 0;
1587}
#define USECS_PER_HOUR
Definition timestamp.h:132
#define USECS_PER_MINUTE
Definition timestamp.h:133

References tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by JsonEncodeDateTime(), time_out(), time_part_common(), and time_timetz().

◆ time_cmp()

Datum time_cmp ( PG_FUNCTION_ARGS  )

Definition at line 1823 of file date.c.

1824{
1827
1828 if (time1 < time2)
1829 PG_RETURN_INT32(-1);
1830 if (time1 > time2)
1831 PG_RETURN_INT32(1);
1832 PG_RETURN_INT32(0);
1833}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_INT32.

Referenced by compareDatetime(), gbt_timekey_cmp(), and gbt_timekey_ssup_cmp().

◆ time_eq()

Datum time_eq ( PG_FUNCTION_ARGS  )

Definition at line 1769 of file date.c.

1770{
1773
1775}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timeeq().

◆ time_ge()

Datum time_ge ( PG_FUNCTION_ARGS  )

Definition at line 1814 of file date.c.

1815{
1818
1820}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timege().

◆ time_gt()

Datum time_gt ( PG_FUNCTION_ARGS  )

Definition at line 1805 of file date.c.

1806{
1809
1811}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timegt().

◆ time_hash()

Datum time_hash ( PG_FUNCTION_ARGS  )

Definition at line 1836 of file date.c.

1837{
1838 return hashint8(fcinfo);
1839}
Datum hashint8(PG_FUNCTION_ARGS)
Definition hashfunc.c:84

References hashint8().

◆ time_hash_extended()

Datum time_hash_extended ( PG_FUNCTION_ARGS  )

Definition at line 1842 of file date.c.

1843{
1844 return hashint8extended(fcinfo);
1845}
Datum hashint8extended(PG_FUNCTION_ARGS)
Definition hashfunc.c:104

References hashint8extended().

◆ time_in()

Datum time_in ( PG_FUNCTION_ARGS  )

Definition at line 1463 of file date.c.

1464{
1465 char *str = PG_GETARG_CSTRING(0);
1466#ifdef NOT_USED
1467 Oid typelem = PG_GETARG_OID(1);
1468#endif
1469 int32 typmod = PG_GETARG_INT32(2);
1470 Node *escontext = fcinfo->context;
1472 fsec_t fsec;
1473 struct pg_tm tt,
1474 *tm = &tt;
1475 int tz;
1476 int nf;
1477 int dterr;
1478 char workbuf[MAXDATELEN + 1];
1479 char *field[MAXDATEFIELDS];
1480 int dtype;
1481 int ftype[MAXDATEFIELDS];
1482 DateTimeErrorExtra extra;
1483
1485 field, ftype, MAXDATEFIELDS, &nf);
1486 if (dterr == 0)
1487 dterr = DecodeTimeOnly(field, ftype, nf,
1488 &dtype, tm, &fsec, &tz, &extra);
1489 if (dterr != 0)
1490 {
1491 DateTimeParseError(dterr, &extra, str, "time", escontext);
1493 }
1494
1495 tm2time(tm, fsec, &result);
1496 AdjustTimeForTypmod(&result, typmod);
1497
1499}
int DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp, DateTimeErrorExtra *extra)
Definition datetime.c:1918
#define PG_GETARG_OID(n)
Definition fmgr.h:275
unsigned int Oid

References AdjustTimeForTypmod(), DateTimeParseError(), DecodeTimeOnly(), fb(), MAXDATEFIELDS, MAXDATELEN, ParseDateTime(), PG_GETARG_CSTRING, PG_GETARG_INT32, PG_GETARG_OID, PG_RETURN_NULL, PG_RETURN_TIMEADT, result, str, tm, and tm2time().

◆ time_interval()

Datum time_interval ( PG_FUNCTION_ARGS  )

Definition at line 2078 of file date.c.

2079{
2080 TimeADT time = PG_GETARG_TIMEADT(0);
2082
2084
2085 result->time = time;
2086 result->day = 0;
2087 result->month = 0;
2088
2090}
#define PG_RETURN_INTERVAL_P(x)
Definition timestamp.h:69

References palloc_object, PG_GETARG_TIMEADT, PG_RETURN_INTERVAL_P, and result.

◆ time_larger()

Datum time_larger ( PG_FUNCTION_ARGS  )

Definition at line 1848 of file date.c.

1849{
1852
1854}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_TIMEADT.

◆ time_le()

Datum time_le ( PG_FUNCTION_ARGS  )

Definition at line 1796 of file date.c.

1797{
1800
1802}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timele().

◆ time_lt()

Datum time_lt ( PG_FUNCTION_ARGS  )

Definition at line 1787 of file date.c.

1788{
1791
1793}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timelt().

◆ time_mi_interval()

Datum time_mi_interval ( PG_FUNCTION_ARGS  )

Definition at line 2164 of file date.c.

2165{
2166 TimeADT time = PG_GETARG_TIMEADT(0);
2169
2171 ereport(ERROR,
2173 errmsg("cannot subtract infinite interval from time")));
2174
2175 result = time - span->time;
2177 if (result < INT64CONST(0))
2179
2181}

References ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, INTERVAL_NOT_FINITE, PG_GETARG_INTERVAL_P, PG_GETARG_TIMEADT, PG_RETURN_TIMEADT, result, and USECS_PER_DAY.

◆ time_mi_time()

Datum time_mi_time ( PG_FUNCTION_ARGS  )

Definition at line 2122 of file date.c.

2123{
2127
2129
2130 result->month = 0;
2131 result->day = 0;
2132 result->time = time1 - time2;
2133
2135}

References fb(), palloc_object, PG_GETARG_TIMEADT, PG_RETURN_INTERVAL_P, and result.

Referenced by gbt_time_dist(), gbt_time_penalty(), and time_dist().

◆ time_ne()

Datum time_ne ( PG_FUNCTION_ARGS  )

Definition at line 1778 of file date.c.

1779{
1782
1784}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

◆ time_out()

Datum time_out ( PG_FUNCTION_ARGS  )

Definition at line 1590 of file date.c.

1591{
1592 TimeADT time = PG_GETARG_TIMEADT(0);
1593 char *result;
1594 struct pg_tm tt,
1595 *tm = &tt;
1596 fsec_t fsec;
1597 char buf[MAXDATELEN + 1];
1598
1599 time2tm(time, tm, &fsec);
1600 EncodeTimeOnly(tm, fsec, false, 0, DateStyle, buf);
1601
1602 result = pstrdup(buf);
1604}
void EncodeTimeOnly(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, int style, char *str)
Definition datetime.c:4435
int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec)
Definition date.c:1577

References buf, DateStyle, EncodeTimeOnly(), fb(), MAXDATELEN, PG_GETARG_TIMEADT, PG_RETURN_CSTRING, pstrdup(), result, time2tm(), and tm.

Referenced by ExecGetJsonValueItemString().

◆ time_overflows()

bool time_overflows ( int  hour,
int  min,
int  sec,
fsec_t  fsec 
)

Definition at line 1516 of file date.c.

1517{
1518 /* Range-check the fields individually. */
1523 return true;
1524
1525 /*
1526 * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1527 * that the total time value doesn't exceed 24:00:00.
1528 */
1529 if ((((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1530 + sec) * USECS_PER_SEC) + fsec) > USECS_PER_DAY)
1531 return true;
1532
1533 return false;
1534}

References fb(), HOURS_PER_DAY, MINS_PER_HOUR, SECS_PER_MINUTE, USECS_PER_DAY, and USECS_PER_SEC.

Referenced by DecodeDateTime(), and DecodeTimeOnly().

◆ time_part()

Datum time_part ( PG_FUNCTION_ARGS  )

Definition at line 2332 of file date.c.

2333{
2334 return time_part_common(fcinfo, false);
2335}

References time_part_common().

◆ time_part_common()

static Datum time_part_common ( PG_FUNCTION_ARGS  ,
bool  retnumeric 
)
static

Definition at line 2229 of file date.c.

2230{
2232 TimeADT time = PG_GETARG_TIMEADT(1);
2234 int type,
2235 val;
2236 char *lowunits;
2237
2240 false);
2241
2242 type = DecodeUnits(0, lowunits, &val);
2243 if (type == UNKNOWN_FIELD)
2245
2246 if (type == UNITS)
2247 {
2248 fsec_t fsec;
2249 struct pg_tm tt,
2250 *tm = &tt;
2251
2252 time2tm(time, tm, &fsec);
2253
2254 switch (val)
2255 {
2256 case DTK_MICROSEC:
2257 intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
2258 break;
2259
2260 case DTK_MILLISEC:
2261 if (retnumeric)
2262 /*---
2263 * tm->tm_sec * 1000 + fsec / 1000
2264 * = (tm->tm_sec * 1'000'000 + fsec) / 1000
2265 */
2267 else
2268 PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
2269 break;
2270
2271 case DTK_SECOND:
2272 if (retnumeric)
2273 /*---
2274 * tm->tm_sec + fsec / 1'000'000
2275 * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
2276 */
2278 else
2279 PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
2280 break;
2281
2282 case DTK_MINUTE:
2283 intresult = tm->tm_min;
2284 break;
2285
2286 case DTK_HOUR:
2287 intresult = tm->tm_hour;
2288 break;
2289
2290 case DTK_TZ:
2291 case DTK_TZ_MINUTE:
2292 case DTK_TZ_HOUR:
2293 case DTK_DAY:
2294 case DTK_MONTH:
2295 case DTK_QUARTER:
2296 case DTK_YEAR:
2297 case DTK_DECADE:
2298 case DTK_CENTURY:
2299 case DTK_MILLENNIUM:
2300 case DTK_ISOYEAR:
2301 default:
2302 ereport(ERROR,
2304 errmsg("unit \"%s\" not supported for type %s",
2306 intresult = 0;
2307 }
2308 }
2309 else if (type == RESERV && val == DTK_EPOCH)
2310 {
2311 if (retnumeric)
2313 else
2314 PG_RETURN_FLOAT8(time / 1000000.0);
2315 }
2316 else
2317 {
2318 ereport(ERROR,
2320 errmsg("unit \"%s\" not recognized for type %s",
2322 intresult = 0;
2323 }
2324
2325 if (retnumeric)
2327 else
2329}
Numeric int64_div_fast_to_numeric(int64 val1, int log10val2)
Definition numeric.c:4285
#define PG_RETURN_FLOAT8(x)
Definition fmgr.h:369
#define DTK_SECOND
Definition datetime.h:160
#define DTK_TZ_HOUR
Definition datetime.h:177
#define DTK_TZ_MINUTE
Definition datetime.h:178
#define DTK_TZ
Definition datetime.h:146
#define DTK_HOUR
Definition datetime.h:162
#define DTK_MICROSEC
Definition datetime.h:172
#define DTK_MILLISEC
Definition datetime.h:171
#define DTK_MINUTE
Definition datetime.h:161

References DecodeSpecial(), DecodeUnits(), downcase_truncate_identifier(), DTK_CENTURY, DTK_DAY, DTK_DECADE, DTK_EPOCH, DTK_HOUR, DTK_ISOYEAR, DTK_MICROSEC, DTK_MILLENNIUM, DTK_MILLISEC, DTK_MINUTE, DTK_MONTH, DTK_QUARTER, DTK_SECOND, DTK_TZ, DTK_TZ_HOUR, DTK_TZ_MINUTE, DTK_YEAR, ereport, errcode(), errmsg, ERROR, fb(), format_type_be(), int64_div_fast_to_numeric(), int64_to_numeric(), INT64CONST, PG_GETARG_TEXT_PP, PG_GETARG_TIMEADT, PG_RETURN_FLOAT8, PG_RETURN_NUMERIC, RESERV, time2tm(), tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, type, UNITS, UNKNOWN_FIELD, val, VARDATA_ANY(), and VARSIZE_ANY_EXHDR().

Referenced by extract_time(), and time_part().

◆ time_pl_interval()

Datum time_pl_interval ( PG_FUNCTION_ARGS  )

Definition at line 2141 of file date.c.

2142{
2143 TimeADT time = PG_GETARG_TIMEADT(0);
2146
2148 ereport(ERROR,
2150 errmsg("cannot add infinite interval to time")));
2151
2152 result = time + span->time;
2154 if (result < INT64CONST(0))
2156
2158}

References ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, INTERVAL_NOT_FINITE, PG_GETARG_INTERVAL_P, PG_GETARG_TIMEADT, PG_RETURN_TIMEADT, result, and USECS_PER_DAY.

◆ time_recv()

Datum time_recv ( PG_FUNCTION_ARGS  )

Definition at line 1610 of file date.c.

1611{
1613
1614#ifdef NOT_USED
1615 Oid typelem = PG_GETARG_OID(1);
1616#endif
1617 int32 typmod = PG_GETARG_INT32(2);
1619
1621
1622 if (result < INT64CONST(0) || result > USECS_PER_DAY)
1623 ereport(ERROR,
1625 errmsg("time out of range")));
1626
1627 AdjustTimeForTypmod(&result, typmod);
1628
1630}
int64 pq_getmsgint64(StringInfo msg)
Definition pqformat.c:452

References AdjustTimeForTypmod(), buf, ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, PG_GETARG_INT32, PG_GETARG_OID, PG_GETARG_POINTER, PG_RETURN_TIMEADT, pq_getmsgint64(), result, and USECS_PER_DAY.

◆ time_scale()

Datum time_scale ( PG_FUNCTION_ARGS  )

Definition at line 1714 of file date.c.

1715{
1716 TimeADT time = PG_GETARG_TIMEADT(0);
1717 int32 typmod = PG_GETARG_INT32(1);
1719
1720 result = time;
1721 AdjustTimeForTypmod(&result, typmod);
1722
1724}

References AdjustTimeForTypmod(), PG_GETARG_INT32, PG_GETARG_TIMEADT, PG_RETURN_TIMEADT, and result.

◆ time_send()

Datum time_send ( PG_FUNCTION_ARGS  )

Definition at line 1636 of file date.c.

1637{
1638 TimeADT time = PG_GETARG_TIMEADT(0);
1640
1642 pq_sendint64(&buf, time);
1644}
static void pq_sendint64(StringInfo buf, uint64 i)
Definition pqformat.h:152

References buf, PG_GETARG_TIMEADT, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), and pq_sendint64().

◆ time_smaller()

Datum time_smaller ( PG_FUNCTION_ARGS  )

Definition at line 1857 of file date.c.

1858{
1861
1863}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_TIMEADT.

◆ time_support()

Datum time_support ( PG_FUNCTION_ARGS  )

Definition at line 1694 of file date.c.

1695{
1697 Node *ret = NULL;
1698
1700 {
1702
1703 ret = TemporalSimplify(MAX_TIME_PRECISION, (Node *) req->fcall);
1704 }
1705
1706 PG_RETURN_POINTER(ret);
1707}
Node * TemporalSimplify(int32 max_precis, Node *node)
Definition datetime.c:4963
#define PG_RETURN_POINTER(x)
Definition fmgr.h:363
#define IsA(nodeptr, _type_)
Definition nodes.h:164

References fb(), IsA, MAX_TIME_PRECISION, PG_GETARG_POINTER, PG_RETURN_POINTER, and TemporalSimplify().

◆ time_timetz()

Datum time_timetz ( PG_FUNCTION_ARGS  )

Definition at line 2917 of file date.c.

2918{
2919 TimeADT time = PG_GETARG_TIMEADT(0);
2921 struct pg_tm tt,
2922 *tm = &tt;
2923 fsec_t fsec;
2924 int tz;
2925
2927 time2tm(time, tm, &fsec);
2929
2931
2932 result->time = time;
2933 result->zone = tz;
2934
2936}
#define PG_RETURN_TIMETZADT_P(x)
Definition date.h:101

References DetermineTimeZoneOffset(), fb(), GetCurrentDateTime(), palloc_object, PG_GETARG_TIMEADT, PG_RETURN_TIMETZADT_P, result, session_timezone, time2tm(), and tm.

Referenced by castTimeToTimeTz(), and executeDateTimeMethod().

◆ timestamp2date_safe()

DateADT timestamp2date_safe ( Timestamp  timestamp,
Node escontext 
)

Definition at line 1346 of file date.c.

1347{
1349 struct pg_tm tt,
1350 *tm = &tt;
1351 fsec_t fsec;
1352
1355 else if (TIMESTAMP_IS_NOEND(timestamp))
1357 else
1358 {
1359 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
1360 {
1361 if (timestamp < 0)
1363 else
1364 DATE_NOEND(result); /* not actually reachable */
1365
1366 ereturn(escontext, result,
1368 errmsg("timestamp out of range")));
1369 }
1370
1372 }
1373
1374 return result;
1375}
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
Definition timestamp.c:1904
int64 timestamp

References date2j(), DATE_NOBEGIN, DATE_NOEND, ereturn, errcode(), errmsg, fb(), POSTGRES_EPOCH_JDATE, result, timestamp2tm(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, tm, pg_tm::tm_mday, pg_tm::tm_mon, and pg_tm::tm_year.

Referenced by cvt_timestamp_date(), and timestamp_date().

◆ timestamp_cmp_date()

◆ timestamp_date()

Datum timestamp_date ( PG_FUNCTION_ARGS  )

Definition at line 1320 of file date.c.

1321{
1324
1325 result = timestamp2date_safe(timestamp, fcinfo->context);
1326 if (SOFT_ERROR_OCCURRED(fcinfo->context))
1328
1330}
DateADT timestamp2date_safe(Timestamp timestamp, Node *escontext)
Definition date.c:1346

References PG_GETARG_TIMESTAMP, PG_RETURN_DATEADT, PG_RETURN_NULL, result, SOFT_ERROR_OCCURRED, and timestamp2date_safe().

Referenced by executeDateTimeMethod().

◆ timestamp_eq_date()

◆ timestamp_ge_date()

◆ timestamp_gt_date()

◆ timestamp_le_date()

◆ timestamp_lt_date()

◆ timestamp_ne_date()

◆ timestamp_time()

Datum timestamp_time ( PG_FUNCTION_ARGS  )

Definition at line 1994 of file date.c.

1995{
1998 struct pg_tm tt,
1999 *tm = &tt;
2000 fsec_t fsec;
2001
2004
2005 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
2006 ereturn(fcinfo->context, (Datum) 0,
2008 errmsg("timestamp out of range")));
2009
2010 /*
2011 * Could also do this with time = (timestamp / USECS_PER_DAY *
2012 * USECS_PER_DAY) - timestamp;
2013 */
2015 USECS_PER_SEC) + fsec;
2016
2018}

References ereturn, errcode(), errmsg, fb(), MINS_PER_HOUR, PG_GETARG_TIMESTAMP, PG_RETURN_NULL, PG_RETURN_TIMEADT, result, SECS_PER_MINUTE, timestamp2tm(), TIMESTAMP_NOT_FINITE, tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, and USECS_PER_SEC.

Referenced by executeDateTimeMethod().

◆ timestamptz2date_safe()

DateADT timestamptz2date_safe ( TimestampTz  timestamp,
Node escontext 
)

Definition at line 1425 of file date.c.

1426{
1428 struct pg_tm tt,
1429 *tm = &tt;
1430 fsec_t fsec;
1431 int tz;
1432
1435 else if (TIMESTAMP_IS_NOEND(timestamp))
1437 else
1438 {
1439 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
1440 {
1441 if (timestamp < 0)
1443 else
1444 DATE_NOEND(result); /* not actually reachable */
1445
1446 ereturn(escontext, result,
1448 errmsg("timestamp out of range")));
1449 }
1450
1452 }
1453
1454 return result;
1455}

References date2j(), DATE_NOBEGIN, DATE_NOEND, ereturn, errcode(), errmsg, fb(), POSTGRES_EPOCH_JDATE, result, timestamp2tm(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, tm, pg_tm::tm_mday, pg_tm::tm_mon, and pg_tm::tm_year.

Referenced by cvt_timestamptz_date(), and timestamptz_date().

◆ timestamptz_cmp_date()

◆ timestamptz_date()

Datum timestamptz_date ( PG_FUNCTION_ARGS  )

Definition at line 1399 of file date.c.

1400{
1403
1404 result = timestamptz2date_safe(timestamp, fcinfo->context);
1405 if (SOFT_ERROR_OCCURRED(fcinfo->context))
1407
1409}
DateADT timestamptz2date_safe(TimestampTz timestamp, Node *escontext)
Definition date.c:1425

References PG_GETARG_TIMESTAMP, PG_RETURN_DATEADT, PG_RETURN_NULL, result, SOFT_ERROR_OCCURRED, and timestamptz2date_safe().

Referenced by executeDateTimeMethod().

◆ timestamptz_eq_date()

◆ timestamptz_ge_date()

◆ timestamptz_gt_date()

◆ timestamptz_le_date()

◆ timestamptz_lt_date()

◆ timestamptz_ne_date()

◆ timestamptz_time()

Datum timestamptz_time ( PG_FUNCTION_ARGS  )

Definition at line 2024 of file date.c.

2025{
2028 struct pg_tm tt,
2029 *tm = &tt;
2030 int tz;
2031 fsec_t fsec;
2032
2035
2036 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
2037 ereturn(fcinfo->context, (Datum) 0,
2039 errmsg("timestamp out of range")));
2040
2041 /*
2042 * Could also do this with time = (timestamp / USECS_PER_DAY *
2043 * USECS_PER_DAY) - timestamp;
2044 */
2046 USECS_PER_SEC) + fsec;
2047
2049}

References ereturn, errcode(), errmsg, fb(), MINS_PER_HOUR, PG_GETARG_TIMESTAMP, PG_RETURN_NULL, PG_RETURN_TIMEADT, result, SECS_PER_MINUTE, timestamp2tm(), TIMESTAMP_NOT_FINITE, tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, and USECS_PER_SEC.

Referenced by executeDateTimeMethod().

◆ timestamptz_timetz()

Datum timestamptz_timetz ( PG_FUNCTION_ARGS  )

Definition at line 2943 of file date.c.

2944{
2947 struct pg_tm tt,
2948 *tm = &tt;
2949 int tz;
2950 fsec_t fsec;
2951
2954
2955 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
2956 ereturn(fcinfo->context, (Datum) 0,
2958 errmsg("timestamp out of range")));
2959
2961
2962 tm2timetz(tm, fsec, tz, result);
2963
2965}

References ereturn, errcode(), errmsg, fb(), palloc_object, PG_GETARG_TIMESTAMP, PG_RETURN_NULL, PG_RETURN_TIMETZADT_P, result, timestamp2tm(), TIMESTAMP_NOT_FINITE, tm, and tm2timetz().

Referenced by executeDateTimeMethod().

◆ timetypmodin()

Datum timetypmodin ( PG_FUNCTION_ARGS  )

Definition at line 1647 of file date.c.

1648{
1650
1652}
#define PG_GETARG_ARRAYTYPE_P(n)
Definition array.h:263
static int32 anytime_typmodin(bool istz, ArrayType *ta)
Definition date.c:44

References anytime_typmodin(), fb(), PG_GETARG_ARRAYTYPE_P, and PG_RETURN_INT32.

◆ timetypmodout()

Datum timetypmodout ( PG_FUNCTION_ARGS  )

Definition at line 1655 of file date.c.

1656{
1657 int32 typmod = PG_GETARG_INT32(0);
1658
1659 PG_RETURN_CSTRING(anytime_typmodout(false, typmod));
1660}
static char * anytime_typmodout(bool istz, int32 typmod)
Definition date.c:87

References anytime_typmodout(), PG_GETARG_INT32, and PG_RETURN_CSTRING.

◆ timetz2tm()

int timetz2tm ( TimeTzADT time,
struct pg_tm tm,
fsec_t fsec,
int tzp 
)

Definition at line 2492 of file date.c.

2493{
2494 TimeOffset trem = time->time;
2495
2501 *fsec = trem - tm->tm_sec * USECS_PER_SEC;
2502
2503 if (tzp != NULL)
2504 *tzp = time->zone;
2505
2506 return 0;
2507}
int64 TimeOffset
Definition timestamp.h:40

References fb(), TimeTzADT::time, tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, USECS_PER_HOUR, USECS_PER_MINUTE, USECS_PER_SEC, and TimeTzADT::zone.

Referenced by JsonEncodeDateTime(), timetz_out(), and timetz_part_common().

◆ timetz_at_local()

Datum timetz_at_local ( PG_FUNCTION_ARGS  )

Definition at line 3254 of file date.c.

3255{
3256 Datum time = PG_GETARG_DATUM(0);
3257 const char *tzn = pg_get_timezone_name(session_timezone);
3259
3260 return DirectFunctionCall2(timetz_zone, zone, time);
3261}
Datum timetz_zone(PG_FUNCTION_ARGS)
Definition date.c:3149
const char * pg_get_timezone_name(pg_tz *tz)
Definition localtime.c:1990
Definition zic.c:99
text * cstring_to_text(const char *s)
Definition varlena.c:184

References cstring_to_text(), DirectFunctionCall2, pg_get_timezone_name(), PG_GETARG_DATUM, PointerGetDatum(), session_timezone, and timetz_zone().

◆ timetz_cmp()

Datum timetz_cmp ( PG_FUNCTION_ARGS  )

◆ timetz_cmp_internal()

static int timetz_cmp_internal ( TimeTzADT time1,
TimeTzADT time2 
)
static

Definition at line 2532 of file date.c.

2533{
2534 TimeOffset t1,
2535 t2;
2536
2537 /* Primary sort is by true (GMT-equivalent) time */
2538 t1 = time1->time + (time1->zone * USECS_PER_SEC);
2539 t2 = time2->time + (time2->zone * USECS_PER_SEC);
2540
2541 if (t1 > t2)
2542 return 1;
2543 if (t1 < t2)
2544 return -1;
2545
2546 /*
2547 * If same GMT time, sort by timezone; we only want to say that two
2548 * timetz's are equal if both the time and zone parts are equal.
2549 */
2550 if (time1->zone > time2->zone)
2551 return 1;
2552 if (time1->zone < time2->zone)
2553 return -1;
2554
2555 return 0;
2556}

References fb(), and USECS_PER_SEC.

Referenced by in_range_timetz_interval(), timetz_cmp(), timetz_eq(), timetz_ge(), timetz_gt(), timetz_larger(), timetz_le(), timetz_lt(), timetz_ne(), and timetz_smaller().

◆ timetz_eq()

Datum timetz_eq ( PG_FUNCTION_ARGS  )

◆ timetz_ge()

Datum timetz_ge ( PG_FUNCTION_ARGS  )

◆ timetz_gt()

Datum timetz_gt ( PG_FUNCTION_ARGS  )

◆ timetz_hash()

Datum timetz_hash ( PG_FUNCTION_ARGS  )

Definition at line 2622 of file date.c.

2623{
2625 uint32 thash;
2626
2627 /*
2628 * To avoid any problems with padding bytes in the struct, we figure the
2629 * field hashes separately and XOR them.
2630 */
2632 Int64GetDatumFast(key->time)));
2635}
uint32_t uint32
Definition c.h:624
#define PG_RETURN_UINT32(x)
Definition fmgr.h:356
#define DirectFunctionCall1(func, arg1)
Definition fmgr.h:684
static uint32 DatumGetUInt32(Datum X)
Definition postgres.h:222
#define Int64GetDatumFast(X)
Definition postgres.h:525

References DatumGetUInt32(), DirectFunctionCall1, fb(), hash_uint32(), hashint8(), Int64GetDatumFast, PG_GETARG_TIMETZADT_P, and PG_RETURN_UINT32.

◆ timetz_hash_extended()

Datum timetz_hash_extended ( PG_FUNCTION_ARGS  )

Definition at line 2638 of file date.c.

2639{
2641 Datum seed = PG_GETARG_DATUM(1);
2642 uint64 thash;
2643
2644 /* Same approach as timetz_hash */
2646 Int64GetDatumFast(key->time),
2647 seed));
2649 DatumGetInt64(seed)));
2651}
uint64_t uint64
Definition c.h:625
#define PG_RETURN_UINT64(x)
Definition fmgr.h:371
static uint64 DatumGetUInt64(Datum X)
Definition postgres.h:423
static int64 DatumGetInt64(Datum X)
Definition postgres.h:403

References DatumGetInt64(), DatumGetUInt64(), DirectFunctionCall2, fb(), hash_uint32_extended(), hashint8extended(), Int64GetDatumFast, PG_GETARG_DATUM, PG_GETARG_TIMETZADT_P, and PG_RETURN_UINT64.

◆ timetz_in()

Datum timetz_in ( PG_FUNCTION_ARGS  )

Definition at line 2362 of file date.c.

2363{
2364 char *str = PG_GETARG_CSTRING(0);
2365#ifdef NOT_USED
2366 Oid typelem = PG_GETARG_OID(1);
2367#endif
2368 int32 typmod = PG_GETARG_INT32(2);
2369 Node *escontext = fcinfo->context;
2371 fsec_t fsec;
2372 struct pg_tm tt,
2373 *tm = &tt;
2374 int tz;
2375 int nf;
2376 int dterr;
2377 char workbuf[MAXDATELEN + 1];
2378 char *field[MAXDATEFIELDS];
2379 int dtype;
2380 int ftype[MAXDATEFIELDS];
2381 DateTimeErrorExtra extra;
2382
2384 field, ftype, MAXDATEFIELDS, &nf);
2385 if (dterr == 0)
2386 dterr = DecodeTimeOnly(field, ftype, nf,
2387 &dtype, tm, &fsec, &tz, &extra);
2388 if (dterr != 0)
2389 {
2390 DateTimeParseError(dterr, &extra, str, "time with time zone",
2391 escontext);
2393 }
2394
2396 tm2timetz(tm, fsec, tz, result);
2397 AdjustTimeForTypmod(&(result->time), typmod);
2398
2400}

References AdjustTimeForTypmod(), DateTimeParseError(), DecodeTimeOnly(), fb(), MAXDATEFIELDS, MAXDATELEN, palloc_object, ParseDateTime(), PG_GETARG_CSTRING, PG_GETARG_INT32, PG_GETARG_OID, PG_RETURN_NULL, PG_RETURN_TIMETZADT_P, result, str, tm, and tm2timetz().

◆ timetz_izone()

Datum timetz_izone ( PG_FUNCTION_ARGS  )

Definition at line 3211 of file date.c.

3212{
3216 int tz;
3217
3219 ereport(ERROR,
3221 errmsg("interval time zone \"%s\" must be finite",
3223 PointerGetDatum(zone))))));
3224
3225 if (zone->month != 0 || zone->day != 0)
3226 ereport(ERROR,
3228 errmsg("interval time zone \"%s\" must not include months or days",
3230 PointerGetDatum(zone))))));
3231
3232 tz = -(zone->time / USECS_PER_SEC);
3233
3235
3236 result->time = time->time + (time->zone - tz) * USECS_PER_SEC;
3237 /* C99 modulo has the wrong sign convention for negative input */
3238 while (result->time < INT64CONST(0))
3239 result->time += USECS_PER_DAY;
3240 if (result->time >= USECS_PER_DAY)
3241 result->time %= USECS_PER_DAY;
3242
3243 result->zone = tz;
3244
3246}
Datum interval_out(PG_FUNCTION_ARGS)
Definition timestamp.c:966
static char * DatumGetCString(Datum X)
Definition postgres.h:355

References DatumGetCString(), DirectFunctionCall1, ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, INTERVAL_NOT_FINITE, interval_out(), palloc_object, PG_GETARG_INTERVAL_P, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, PointerGetDatum(), result, TimeTzADT::time, USECS_PER_DAY, USECS_PER_SEC, and TimeTzADT::zone.

◆ timetz_larger()

Datum timetz_larger ( PG_FUNCTION_ARGS  )

Definition at line 2654 of file date.c.

2655{
2659
2661 result = time1;
2662 else
2663 result = time2;
2665}

References fb(), PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, result, and timetz_cmp_internal().

◆ timetz_le()

Datum timetz_le ( PG_FUNCTION_ARGS  )

◆ timetz_lt()

Datum timetz_lt ( PG_FUNCTION_ARGS  )

◆ timetz_mi_interval()

Datum timetz_mi_interval ( PG_FUNCTION_ARGS  )

Definition at line 2712 of file date.c.

2713{
2717
2719 ereport(ERROR,
2721 errmsg("cannot subtract infinite interval from time")));
2722
2724
2725 result->time = time->time - span->time;
2726 result->time -= result->time / USECS_PER_DAY * USECS_PER_DAY;
2727 if (result->time < INT64CONST(0))
2728 result->time += USECS_PER_DAY;
2729
2730 result->zone = time->zone;
2731
2733}

References ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, INTERVAL_NOT_FINITE, palloc_object, PG_GETARG_INTERVAL_P, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, result, TimeTzADT::time, USECS_PER_DAY, and TimeTzADT::zone.

◆ timetz_ne()

Datum timetz_ne ( PG_FUNCTION_ARGS  )

◆ timetz_out()

Datum timetz_out ( PG_FUNCTION_ARGS  )

Definition at line 2403 of file date.c.

2404{
2406 char *result;
2407 struct pg_tm tt,
2408 *tm = &tt;
2409 fsec_t fsec;
2410 int tz;
2411 char buf[MAXDATELEN + 1];
2412
2413 timetz2tm(time, tm, &fsec, &tz);
2414 EncodeTimeOnly(tm, fsec, true, tz, DateStyle, buf);
2415
2416 result = pstrdup(buf);
2418}
int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp)
Definition date.c:2492

References buf, DateStyle, EncodeTimeOnly(), fb(), MAXDATELEN, PG_GETARG_TIMETZADT_P, PG_RETURN_CSTRING, pstrdup(), result, timetz2tm(), and tm.

Referenced by ExecGetJsonValueItemString().

◆ timetz_part()

Datum timetz_part ( PG_FUNCTION_ARGS  )

Definition at line 3133 of file date.c.

3134{
3135 return timetz_part_common(fcinfo, false);
3136}

References timetz_part_common().

◆ timetz_part_common()

static Datum timetz_part_common ( PG_FUNCTION_ARGS  ,
bool  retnumeric 
)
static

Definition at line 3016 of file date.c.

3017{
3021 int type,
3022 val;
3023 char *lowunits;
3024
3027 false);
3028
3029 type = DecodeUnits(0, lowunits, &val);
3030 if (type == UNKNOWN_FIELD)
3032
3033 if (type == UNITS)
3034 {
3035 int tz;
3036 fsec_t fsec;
3037 struct pg_tm tt,
3038 *tm = &tt;
3039
3040 timetz2tm(time, tm, &fsec, &tz);
3041
3042 switch (val)
3043 {
3044 case DTK_TZ:
3045 intresult = -tz;
3046 break;
3047
3048 case DTK_TZ_MINUTE:
3050 break;
3051
3052 case DTK_TZ_HOUR:
3053 intresult = -tz / SECS_PER_HOUR;
3054 break;
3055
3056 case DTK_MICROSEC:
3057 intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
3058 break;
3059
3060 case DTK_MILLISEC:
3061 if (retnumeric)
3062 /*---
3063 * tm->tm_sec * 1000 + fsec / 1000
3064 * = (tm->tm_sec * 1'000'000 + fsec) / 1000
3065 */
3067 else
3068 PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
3069 break;
3070
3071 case DTK_SECOND:
3072 if (retnumeric)
3073 /*---
3074 * tm->tm_sec + fsec / 1'000'000
3075 * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
3076 */
3078 else
3079 PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
3080 break;
3081
3082 case DTK_MINUTE:
3083 intresult = tm->tm_min;
3084 break;
3085
3086 case DTK_HOUR:
3087 intresult = tm->tm_hour;
3088 break;
3089
3090 case DTK_DAY:
3091 case DTK_MONTH:
3092 case DTK_QUARTER:
3093 case DTK_YEAR:
3094 case DTK_DECADE:
3095 case DTK_CENTURY:
3096 case DTK_MILLENNIUM:
3097 default:
3098 ereport(ERROR,
3100 errmsg("unit \"%s\" not supported for type %s",
3102 intresult = 0;
3103 }
3104 }
3105 else if (type == RESERV && val == DTK_EPOCH)
3106 {
3107 if (retnumeric)
3108 /*---
3109 * time->time / 1'000'000 + time->zone
3110 * = (time->time + time->zone * 1'000'000) / 1'000'000
3111 */
3112 PG_RETURN_NUMERIC(int64_div_fast_to_numeric(time->time + time->zone * INT64CONST(1000000), 6));
3113 else
3114 PG_RETURN_FLOAT8(time->time / 1000000.0 + time->zone);
3115 }
3116 else
3117 {
3118 ereport(ERROR,
3120 errmsg("unit \"%s\" not recognized for type %s",
3122 intresult = 0;
3123 }
3124
3125 if (retnumeric)
3127 else
3129}
#define SECS_PER_HOUR
Definition timestamp.h:127

References DecodeSpecial(), DecodeUnits(), downcase_truncate_identifier(), DTK_CENTURY, DTK_DAY, DTK_DECADE, DTK_EPOCH, DTK_HOUR, DTK_MICROSEC, DTK_MILLENNIUM, DTK_MILLISEC, DTK_MINUTE, DTK_MONTH, DTK_QUARTER, DTK_SECOND, DTK_TZ, DTK_TZ_HOUR, DTK_TZ_MINUTE, DTK_YEAR, ereport, errcode(), errmsg, ERROR, fb(), format_type_be(), int64_div_fast_to_numeric(), int64_to_numeric(), INT64CONST, MINS_PER_HOUR, PG_GETARG_TEXT_PP, PG_GETARG_TIMETZADT_P, PG_RETURN_FLOAT8, PG_RETURN_NUMERIC, RESERV, SECS_PER_HOUR, SECS_PER_MINUTE, TimeTzADT::time, timetz2tm(), tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, type, UNITS, UNKNOWN_FIELD, val, VARDATA_ANY(), VARSIZE_ANY_EXHDR(), and TimeTzADT::zone.

Referenced by extract_timetz(), and timetz_part().

◆ timetz_pl_interval()

Datum timetz_pl_interval ( PG_FUNCTION_ARGS  )

Definition at line 2685 of file date.c.

2686{
2690
2692 ereport(ERROR,
2694 errmsg("cannot add infinite interval to time")));
2695
2697
2698 result->time = time->time + span->time;
2699 result->time -= result->time / USECS_PER_DAY * USECS_PER_DAY;
2700 if (result->time < INT64CONST(0))
2701 result->time += USECS_PER_DAY;
2702
2703 result->zone = time->zone;
2704
2706}

References ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, INTERVAL_NOT_FINITE, palloc_object, PG_GETARG_INTERVAL_P, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, result, TimeTzADT::time, USECS_PER_DAY, and TimeTzADT::zone.

◆ timetz_recv()

Datum timetz_recv ( PG_FUNCTION_ARGS  )

Definition at line 2424 of file date.c.

2425{
2427
2428#ifdef NOT_USED
2429 Oid typelem = PG_GETARG_OID(1);
2430#endif
2431 int32 typmod = PG_GETARG_INT32(2);
2433
2435
2436 result->time = pq_getmsgint64(buf);
2437
2438 if (result->time < INT64CONST(0) || result->time > USECS_PER_DAY)
2439 ereport(ERROR,
2441 errmsg("time out of range")));
2442
2443 result->zone = pq_getmsgint(buf, sizeof(result->zone));
2444
2445 /* Check for sane GMT displacement; see notes in datatype/timestamp.h */
2446 if (result->zone <= -TZDISP_LIMIT || result->zone >= TZDISP_LIMIT)
2447 ereport(ERROR,
2449 errmsg("time zone displacement out of range")));
2450
2451 AdjustTimeForTypmod(&(result->time), typmod);
2452
2454}
#define TZDISP_LIMIT
Definition timestamp.h:144

References AdjustTimeForTypmod(), buf, ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, palloc_object, PG_GETARG_INT32, PG_GETARG_OID, PG_GETARG_POINTER, PG_RETURN_TIMETZADT_P, pq_getmsgint(), pq_getmsgint64(), result, TZDISP_LIMIT, and USECS_PER_DAY.

◆ timetz_scale()

Datum timetz_scale ( PG_FUNCTION_ARGS  )

Definition at line 2514 of file date.c.

2515{
2517 int32 typmod = PG_GETARG_INT32(1);
2519
2521
2522 result->time = time->time;
2523 result->zone = time->zone;
2524
2525 AdjustTimeForTypmod(&(result->time), typmod);
2526
2528}

References AdjustTimeForTypmod(), palloc_object, PG_GETARG_INT32, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, result, TimeTzADT::time, and TimeTzADT::zone.

◆ timetz_send()

◆ timetz_smaller()

Datum timetz_smaller ( PG_FUNCTION_ARGS  )

Definition at line 2668 of file date.c.

2669{
2673
2675 result = time1;
2676 else
2677 result = time2;
2679}

References fb(), PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, result, and timetz_cmp_internal().

◆ timetz_time()

Datum timetz_time ( PG_FUNCTION_ARGS  )

Definition at line 2904 of file date.c.

2905{
2908
2909 /* swallow the time zone and just return the time */
2910 result = timetz->time;
2911
2913}

References fb(), PG_GETARG_TIMETZADT_P, PG_RETURN_TIMEADT, and result.

Referenced by executeDateTimeMethod().

◆ timetz_zone()

Datum timetz_zone ( PG_FUNCTION_ARGS  )

Definition at line 3149 of file date.c.

3150{
3154 int tz;
3155 char tzname[TZ_STRLEN_MAX + 1];
3156 int type,
3157 val;
3158 pg_tz *tzp;
3159
3160 /*
3161 * Look up the requested timezone.
3162 */
3164
3165 type = DecodeTimezoneName(tzname, &val, &tzp);
3166
3168 {
3169 /* fixed-offset abbreviation */
3170 tz = -val;
3171 }
3172 else if (type == TZNAME_DYNTZ)
3173 {
3174 /* dynamic-offset abbreviation, resolve using transaction start time */
3176 int isdst;
3177
3179 }
3180 else
3181 {
3182 /* Get the offset-from-GMT that is valid now for the zone name */
3184 struct pg_tm tm;
3185 fsec_t fsec;
3186
3187 if (timestamp2tm(now, &tz, &tm, &fsec, NULL, tzp) != 0)
3188 ereport(ERROR,
3190 errmsg("timestamp out of range")));
3191 }
3192
3194
3195 result->time = t->time + (t->zone - tz) * USECS_PER_SEC;
3196 /* C99 modulo has the wrong sign convention for negative input */
3197 while (result->time < INT64CONST(0))
3198 result->time += USECS_PER_DAY;
3199 if (result->time >= USECS_PER_DAY)
3200 result->time %= USECS_PER_DAY;
3201
3202 result->zone = tz;
3203
3205}
int DetermineTimeZoneAbbrevOffsetTS(TimestampTz ts, const char *abbr, pg_tz *tzp, int *isdst)
Definition datetime.c:1804
int DecodeTimezoneName(const char *tzname, int *offset, pg_tz **tz)
Definition datetime.c:3289
Datum now(PG_FUNCTION_ARGS)
Definition timestamp.c:1603
#define TZNAME_FIXED_OFFSET
Definition datetime.h:299
#define TZNAME_DYNTZ
Definition datetime.h:300
#define TZ_STRLEN_MAX
Definition pgtime.h:54
Definition pgtz.h:66
void text_to_cstring_buffer(const text *src, char *dst, size_t dst_len)
Definition varlena.c:248
TimestampTz GetCurrentTransactionStartTimestamp(void)
Definition xact.c:872

References DecodeTimezoneName(), DetermineTimeZoneAbbrevOffsetTS(), ereport, errcode(), errmsg, ERROR, fb(), GetCurrentTransactionStartTimestamp(), INT64CONST, now(), palloc_object, PG_GETARG_TEXT_PP, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, result, text_to_cstring_buffer(), TimeTzADT::time, timestamp2tm(), tm, type, TZ_STRLEN_MAX, TZNAME_DYNTZ, TZNAME_FIXED_OFFSET, USECS_PER_DAY, USECS_PER_SEC, val, and TimeTzADT::zone.

Referenced by timetz_at_local().

◆ timetztypmodin()

Datum timetztypmodin ( PG_FUNCTION_ARGS  )

Definition at line 2472 of file date.c.

2473{
2475
2477}

References anytime_typmodin(), fb(), PG_GETARG_ARRAYTYPE_P, and PG_RETURN_INT32.

◆ timetztypmodout()

Datum timetztypmodout ( PG_FUNCTION_ARGS  )

Definition at line 2480 of file date.c.

2481{
2482 int32 typmod = PG_GETARG_INT32(0);
2483
2484 PG_RETURN_CSTRING(anytime_typmodout(true, typmod));
2485}

References anytime_typmodout(), PG_GETARG_INT32, and PG_RETURN_CSTRING.

◆ tm2time()

int tm2time ( struct pg_tm tm,
fsec_t  fsec,
TimeADT result 
)

Definition at line 1505 of file date.c.

1506{
1508 * USECS_PER_SEC) + fsec;
1509 return 0;
1510}

References MINS_PER_HOUR, result, SECS_PER_MINUTE, tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, and USECS_PER_SEC.

Referenced by GetSQLLocalTime(), parse_datetime(), and time_in().

◆ tm2timetz()

int tm2timetz ( struct pg_tm tm,
fsec_t  fsec,
int  tz,
TimeTzADT result 
)

Definition at line 2352 of file date.c.

2353{
2354 result->time = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
2355 USECS_PER_SEC) + fsec;
2356 result->zone = tz;
2357
2358 return 0;
2359}

References MINS_PER_HOUR, result, SECS_PER_MINUTE, tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, and USECS_PER_SEC.

Referenced by GetSQLCurrentTime(), parse_datetime(), timestamptz_timetz(), and timetz_in().