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)
 
static TimestampTz date2timestamptz (DateADT dateVal)
 
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 1733 of file date.c.

1734{
1735 static const int64 TimeScales[MAX_TIME_PRECISION + 1] = {
1736 INT64CONST(1000000),
1737 INT64CONST(100000),
1738 INT64CONST(10000),
1739 INT64CONST(1000),
1740 INT64CONST(100),
1741 INT64CONST(10),
1742 INT64CONST(1)
1743 };
1744
1745 static const int64 TimeOffsets[MAX_TIME_PRECISION + 1] = {
1746 INT64CONST(500000),
1747 INT64CONST(50000),
1748 INT64CONST(5000),
1749 INT64CONST(500),
1750 INT64CONST(50),
1751 INT64CONST(5),
1752 INT64CONST(0)
1753 };
1754
1755 if (typmod >= 0 && typmod <= MAX_TIME_PRECISION)
1756 {
1757 if (*time >= INT64CONST(0))
1758 *time = ((*time + TimeOffsets[typmod]) / TimeScales[typmod]) *
1759 TimeScales[typmod];
1760 else
1761 *time = -((((-*time) + TimeOffsets[typmod]) / TimeScales[typmod]) *
1762 TimeScales[typmod]);
1763 }
1764}
#define INT64CONST(x)
Definition c.h:632
int64_t int64
Definition c.h:615
#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:36
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
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:614
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(), date_timestamp(), datetime_timestamp(), and in_range_date_interval().

◆ date2timestamp_no_overflow()

double date2timestamp_no_overflow ( DateADT  dateVal)

Definition at line 745 of file date.c.

746{
747 double result;
748
750 result = -DBL_MAX;
751 else if (DATE_IS_NOEND(dateVal))
752 result = DBL_MAX;
753 else
754 {
755 /* date is days since 2000, timestamp is microseconds since same... */
756 result = dateVal * (double) USECS_PER_DAY;
757 }
758
759 return result;
760}
#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(), 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{
624 Timestamp result;
625
627 TIMESTAMP_NOBEGIN(result);
628 else if (DATE_IS_NOEND(dateVal))
629 TIMESTAMP_NOEND(result);
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 {
638 TIMESTAMP_NOEND(result);
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... */
645 result = dateVal * USECS_PER_DAY;
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:278

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

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

◆ date2timestamptz()

static TimestampTz date2timestamptz ( DateADT  dateVal)
static

Definition at line 729 of file date.c.

730{
732}
TimestampTz date2timestamptz_safe(DateADT dateVal, Node *escontext)
Definition date.c:671

References date2timestamptz_safe(), and fb().

Referenced by date_timestamptz().

◆ date2timestamptz_safe()

TimestampTz date2timestamptz_safe ( DateADT  dateVal,
Node escontext 
)

Definition at line 671 of file date.c.

672{
673 TimestampTz result;
674 struct pg_tm tt,
675 *tm = &tt;
676 int tz;
677
679 TIMESTAMP_NOBEGIN(result);
680 else if (DATE_IS_NOEND(dateVal))
681 TIMESTAMP_NOEND(result);
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 {
690 TIMESTAMP_NOEND(result);
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
703 result = dateVal * USECS_PER_DAY + tz * USECS_PER_SEC;
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 */
709 if (!IS_VALID_TIMESTAMP(result))
710 {
711 if (result < MIN_TIMESTAMP)
712 TIMESTAMP_NOBEGIN(result);
713 else
714 TIMESTAMP_NOEND(result);
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, 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(), date2timestamptz(), and date_cmp_timestamptz_internal().

◆ 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 840 of file date.c.

841{
844
846}
int32 date_cmp_timestamp_internal(DateADT dateVal, Timestamp dt2)
Definition date.c:768
#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 768 of file date.c.

769{
772
773 dt1 = date2timestamp_safe(dateVal, (Node *) &escontext);
774 if (escontext.error_occurred)
775 {
776 Assert(TIMESTAMP_IS_NOEND(dt1)); /* NOBEGIN case cannot occur */
777
778 /* dt1 is larger than any finite timestamp, but less than infinity */
779 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
780 }
781
783}
int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2)
Definition timestamp.c:2201
#define Assert(condition)
Definition c.h:945
#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 928 of file date.c.

929{
932
934}
int32 date_cmp_timestamptz_internal(DateADT dateVal, TimestampTz dt2)
Definition date.c:849
#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 849 of file date.c.

850{
853
854 dt1 = date2timestamptz_safe(dateVal, (Node *) &escontext);
855
856 if (escontext.error_occurred)
857 {
859 {
860 /* dt1 is larger than any finite timestamp, but less than infinity */
861 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
862 }
864 {
865 /* dt1 is less than any finite timestamp, but more than -infinity */
866 return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
867 }
868 }
869
871}
#define TIMESTAMP_IS_NOBEGIN(j)
Definition timestamp.h:162
#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:2159
#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 1296 of file date.c.

1297{
1301
1303
1307}
Datum timestamp_mi_interval(PG_FUNCTION_ARGS)
Definition timestamp.c:3198
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{
590 DateADT result;
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)) ||
599 !IS_VALID_DATE(result))
602 errmsg("date out of range")));
603
604 PG_RETURN_DATEADT(result);
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, and PG_RETURN_DATEADT.

◆ 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);
196 PG_RETURN_CSTRING(result);
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:125
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(), 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{
566 DateADT result;
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)) ||
575 !IS_VALID_DATE(result))
578 errmsg("date out of range")));
579
580 PG_RETURN_DATEADT(result);
581}

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

◆ date_recv()

Datum date_recv ( PG_FUNCTION_ARGS  )

Definition at line 203 of file date.c.

204{
206 DateADT result;
207
208 result = (DateADT) pq_getmsgint(buf, sizeof(DateADT));
209
210 /* Limit to the same range that date_in() accepts. */
211 if (DATE_NOT_FINITE(result))
212 /* ok */ ;
213 else if (!IS_VALID_DATE(result))
216 errmsg("date out of range")));
217
218 PG_RETURN_DATEADT(result);
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, and pq_getmsgint().

◆ 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:60
int(* comparator)(Datum x, Datum y, SortSupport ssup)
int ssup_datum_int32_cmp(Datum x, Datum y, SortSupport ssup)
Definition tuplesort.c:3436

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 1313 of file date.c.

1314{
1316 Timestamp result;
1317
1318 result = date2timestamp(dateVal);
1319
1320 PG_RETURN_TIMESTAMP(result);
1321}
#define PG_RETURN_TIMESTAMP(x)
Definition timestamp.h:67

References date2timestamp(), fb(), PG_GETARG_DATEADT, and PG_RETURN_TIMESTAMP.

Referenced by executeDateTimeMethod().

◆ date_timestamptz()

Datum date_timestamptz ( PG_FUNCTION_ARGS  )

Definition at line 1386 of file date.c.

1387{
1389 TimestampTz result;
1390
1391 result = date2timestamptz(dateVal);
1392
1393 PG_RETURN_TIMESTAMP(result);
1394}
static TimestampTz date2timestamptz(DateADT dateVal)
Definition date.c:729

References date2timestamptz(), fb(), PG_GETARG_DATEADT, and PG_RETURN_TIMESTAMP.

Referenced by executeDateTimeMethod().

◆ datetime_timestamp()

Datum datetime_timestamp ( PG_FUNCTION_ARGS  )

Definition at line 2054 of file date.c.

2055{
2057 TimeADT time = PG_GETARG_TIMEADT(1);
2058 Timestamp result;
2059
2060 result = date2timestamp(date);
2061 if (!TIMESTAMP_NOT_FINITE(result))
2062 {
2063 result += time;
2064 if (!IS_VALID_TIMESTAMP(result))
2065 ereport(ERROR,
2067 errmsg("timestamp out of range")));
2068 }
2069
2070 PG_RETURN_TIMESTAMP(result);
2071}
#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, and TIMESTAMP_NOT_FINITE.

◆ datetimetz_timestamptz()

Datum datetimetz_timestamptz ( PG_FUNCTION_ARGS  )

Definition at line 2974 of file date.c.

2975{
2978 TimestampTz result;
2979
2980 if (DATE_IS_NOBEGIN(date))
2981 TIMESTAMP_NOBEGIN(result);
2982 else if (DATE_IS_NOEND(date))
2983 TIMESTAMP_NOEND(result);
2984 else
2985 {
2986 /*
2987 * Date's range is wider than timestamp's, so check for boundaries.
2988 * Since dates have the same minimum values as timestamps, only upper
2989 * boundary need be checked for overflow.
2990 */
2992 ereport(ERROR,
2994 errmsg("date out of range for timestamp")));
2995 result = date * USECS_PER_DAY + time->time + time->zone * USECS_PER_SEC;
2996
2997 /*
2998 * Since it is possible to go beyond allowed timestamptz range because
2999 * of time zone, check for allowed timestamp range after adding tz.
3000 */
3001 if (!IS_VALID_TIMESTAMP(result))
3002 ereport(ERROR,
3004 errmsg("date out of range for timestamp")));
3005 }
3006
3007 PG_RETURN_TIMESTAMP(result);
3008}
#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, 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:226
#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 1096 of file date.c.

1097{
1101 int type,
1102 val;
1103 char *lowunits;
1104 int year,
1105 mon,
1106 mday;
1107
1110 false);
1111
1112 type = DecodeUnits(0, lowunits, &val);
1113 if (type == UNKNOWN_FIELD)
1115
1116 if (DATE_NOT_FINITE(date) && (type == UNITS || type == RESERV))
1117 {
1118 switch (val)
1119 {
1120 /* Oscillating units */
1121 case DTK_DAY:
1122 case DTK_MONTH:
1123 case DTK_QUARTER:
1124 case DTK_WEEK:
1125 case DTK_DOW:
1126 case DTK_ISODOW:
1127 case DTK_DOY:
1129 break;
1130
1131 /* Monotonically-increasing units */
1132 case DTK_YEAR:
1133 case DTK_DECADE:
1134 case DTK_CENTURY:
1135 case DTK_MILLENNIUM:
1136 case DTK_JULIAN:
1137 case DTK_ISOYEAR:
1138 case DTK_EPOCH:
1139 if (DATE_IS_NOBEGIN(date))
1141 CStringGetDatum("-Infinity"),
1143 Int32GetDatum(-1))));
1144 else
1146 CStringGetDatum("Infinity"),
1148 Int32GetDatum(-1))));
1149 default:
1150 ereport(ERROR,
1152 errmsg("unit \"%s\" not supported for type %s",
1154 }
1155 }
1156 else if (type == UNITS)
1157 {
1158 j2date(date + POSTGRES_EPOCH_JDATE, &year, &mon, &mday);
1159
1160 switch (val)
1161 {
1162 case DTK_DAY:
1163 intresult = mday;
1164 break;
1165
1166 case DTK_MONTH:
1167 intresult = mon;
1168 break;
1169
1170 case DTK_QUARTER:
1171 intresult = (mon - 1) / 3 + 1;
1172 break;
1173
1174 case DTK_WEEK:
1175 intresult = date2isoweek(year, mon, mday);
1176 break;
1177
1178 case DTK_YEAR:
1179 if (year > 0)
1180 intresult = year;
1181 else
1182 /* there is no year 0, just 1 BC and 1 AD */
1183 intresult = year - 1;
1184 break;
1185
1186 case DTK_DECADE:
1187 /* see comments in timestamp_part */
1188 if (year >= 0)
1189 intresult = year / 10;
1190 else
1191 intresult = -((8 - (year - 1)) / 10);
1192 break;
1193
1194 case DTK_CENTURY:
1195 /* see comments in timestamp_part */
1196 if (year > 0)
1197 intresult = (year + 99) / 100;
1198 else
1199 intresult = -((99 - (year - 1)) / 100);
1200 break;
1201
1202 case DTK_MILLENNIUM:
1203 /* see comments in timestamp_part */
1204 if (year > 0)
1205 intresult = (year + 999) / 1000;
1206 else
1207 intresult = -((999 - (year - 1)) / 1000);
1208 break;
1209
1210 case DTK_JULIAN:
1212 break;
1213
1214 case DTK_ISOYEAR:
1215 intresult = date2isoyear(year, mon, mday);
1216 /* Adjust BC years */
1217 if (intresult <= 0)
1218 intresult -= 1;
1219 break;
1220
1221 case DTK_DOW:
1222 case DTK_ISODOW:
1224 if (val == DTK_ISODOW && intresult == 0)
1225 intresult = 7;
1226 break;
1227
1228 case DTK_DOY:
1229 intresult = date2j(year, mon, mday) - date2j(year, 1, 1) + 1;
1230 break;
1231
1232 default:
1233 ereport(ERROR,
1235 errmsg("unit \"%s\" not supported for type %s",
1237 intresult = 0;
1238 }
1239 }
1240 else if (type == RESERV)
1241 {
1242 switch (val)
1243 {
1244 case DTK_EPOCH:
1246 break;
1247
1248 default:
1249 ereport(ERROR,
1251 errmsg("unit \"%s\" not supported for type %s",
1253 intresult = 0;
1254 }
1255 }
1256 else
1257 {
1258 ereport(ERROR,
1260 errmsg("unit \"%s\" not recognized for type %s",
1262 intresult = 0;
1263 }
1264
1266}
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:4259
Datum numeric_in(PG_FUNCTION_ARGS)
Definition numeric.c:626
int date2isoweek(int year, int mon, int mday)
Definition timestamp.c:5286
int date2isoyear(int year, int mon, int mday)
Definition timestamp.c:5341
#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:778
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 2337 of file date.c.

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

References time_part_common().

◆ extract_timetz()

Datum extract_timetz ( PG_FUNCTION_ARGS  )

Definition at line 3138 of file date.c.

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

References timetz_part_common().

◆ float_time_overflows()

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

Definition at line 1539 of file date.c.

1540{
1541 /* Range-check the fields individually. */
1544 return true;
1545
1546 /*
1547 * "sec", being double, requires extra care. Cope with NaN, and round off
1548 * before applying the range check to avoid unexpected errors due to
1549 * imprecise input. (We assume rint() behaves sanely with infinities.)
1550 */
1551 if (isnan(sec))
1552 return true;
1553 sec = rint(sec * USECS_PER_SEC);
1555 return true;
1556
1557 /*
1558 * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1559 * that the total time value doesn't exceed 24:00:00. This must match the
1560 * way that callers will convert the fields to a time.
1561 */
1562 if (((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1563 * USECS_PER_SEC) + (int64) sec) > USECS_PER_DAY)
1564 return true;
1565
1566 return false;
1567}
#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{
345 TimeTzADT *result;
346 struct pg_tm tt,
347 *tm = &tt;
348 fsec_t fsec;
349 int tz;
350
351 GetCurrentTimeUsec(tm, &fsec, &tz);
352
353 result = palloc_object(TimeTzADT);
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:2351
void AdjustTimeForTypmod(TimeADT *time, int32 typmod)
Definition date.c:1733
#define palloc_object(type)
Definition fe_memutils.h:74

References AdjustTimeForTypmod(), fb(), GetCurrentTimeUsec(), palloc_object, TimeTzADT::time, tm, and tm2timetz().

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLLocalTime()

TimeADT GetSQLLocalTime ( int32  typmod)

Definition at line 363 of file date.c.

364{
365 TimeADT result;
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:1504

References AdjustTimeForTypmod(), fb(), GetCurrentTimeUsec(), 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 1069 of file date.c.

1070{
1072 DateADT base = PG_GETARG_DATEADT(1);
1073 Interval *offset = PG_GETARG_INTERVAL_P(2);
1074 bool sub = PG_GETARG_BOOL(3);
1075 bool less = PG_GETARG_BOOL(4);
1078
1079 /* XXX we could support out-of-range cases here, perhaps */
1081 baseStamp = date2timestamp(base);
1082
1086 IntervalPGetDatum(offset),
1087 BoolGetDatum(sub),
1089}
Datum in_range_timestamp_interval(PG_FUNCTION_ARGS)
Definition timestamp.c:3867
#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 2186 of file date.c.

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

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

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 2100 of file date.c.

2101{
2103 TimeADT result;
2104
2106 ereport(ERROR,
2108 errmsg("cannot convert infinite interval to time")));
2109
2110 result = span->time % USECS_PER_DAY;
2111 if (result < 0)
2112 result += USECS_PER_DAY;
2113
2114 PG_RETURN_TIMEADT(result);
2115}
#define INTERVAL_NOT_FINITE(i)
Definition timestamp.h:195
#define PG_RETURN_TIMEADT(x)
Definition date.h:100

References ereport, errcode(), errmsg, ERROR, fb(), INTERVAL_NOT_FINITE, PG_GETARG_INTERVAL_P, PG_RETURN_TIMEADT, 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 1665 of file date.c.

1666{
1667 int tm_hour = PG_GETARG_INT32(0);
1668 int tm_min = PG_GETARG_INT32(1);
1669 double sec = PG_GETARG_FLOAT8(2);
1670 TimeADT time;
1671
1672 /* Check for time overflow */
1673 if (float_time_overflows(tm_hour, tm_min, sec))
1674 ereport(ERROR,
1676 errmsg("time field value out of range: %d:%02d:%02g",
1677 tm_hour, tm_min, sec)));
1678
1679 /* This should match tm2time */
1680 time = (((tm_hour * MINS_PER_HOUR + tm_min) * SECS_PER_MINUTE)
1681 * USECS_PER_SEC) + (int64) rint(sec * USECS_PER_SEC);
1682
1683 PG_RETURN_TIMEADT(time);
1684}
bool float_time_overflows(int hour, int min, double sec)
Definition date.c:1539
#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 1871 of file date.c.

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

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

1577{
1578 tm->tm_hour = time / USECS_PER_HOUR;
1579 time -= tm->tm_hour * USECS_PER_HOUR;
1580 tm->tm_min = time / USECS_PER_MINUTE;
1581 time -= tm->tm_min * USECS_PER_MINUTE;
1582 tm->tm_sec = time / USECS_PER_SEC;
1583 time -= tm->tm_sec * USECS_PER_SEC;
1584 *fsec = time;
1585 return 0;
1586}
#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 1822 of file date.c.

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

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 1768 of file date.c.

1769{
1772
1774}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timeeq().

◆ time_ge()

Datum time_ge ( PG_FUNCTION_ARGS  )

Definition at line 1813 of file date.c.

1814{
1817
1819}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timege().

◆ time_gt()

Datum time_gt ( PG_FUNCTION_ARGS  )

Definition at line 1804 of file date.c.

1805{
1808
1810}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timegt().

◆ time_hash()

Datum time_hash ( PG_FUNCTION_ARGS  )

Definition at line 1835 of file date.c.

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

References hashint8().

◆ time_hash_extended()

Datum time_hash_extended ( PG_FUNCTION_ARGS  )

Definition at line 1841 of file date.c.

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

References hashint8extended().

◆ time_in()

Datum time_in ( PG_FUNCTION_ARGS  )

Definition at line 1462 of file date.c.

1463{
1464 char *str = PG_GETARG_CSTRING(0);
1465#ifdef NOT_USED
1466 Oid typelem = PG_GETARG_OID(1);
1467#endif
1468 int32 typmod = PG_GETARG_INT32(2);
1469 Node *escontext = fcinfo->context;
1470 TimeADT result;
1471 fsec_t fsec;
1472 struct pg_tm tt,
1473 *tm = &tt;
1474 int tz;
1475 int nf;
1476 int dterr;
1477 char workbuf[MAXDATELEN + 1];
1478 char *field[MAXDATEFIELDS];
1479 int dtype;
1480 int ftype[MAXDATEFIELDS];
1481 DateTimeErrorExtra extra;
1482
1484 field, ftype, MAXDATEFIELDS, &nf);
1485 if (dterr == 0)
1486 dterr = DecodeTimeOnly(field, ftype, nf,
1487 &dtype, tm, &fsec, &tz, &extra);
1488 if (dterr != 0)
1489 {
1490 DateTimeParseError(dterr, &extra, str, "time", escontext);
1492 }
1493
1494 tm2time(tm, fsec, &result);
1495 AdjustTimeForTypmod(&result, typmod);
1496
1497 PG_RETURN_TIMEADT(result);
1498}
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, str, tm, and tm2time().

◆ time_interval()

Datum time_interval ( PG_FUNCTION_ARGS  )

Definition at line 2077 of file date.c.

2078{
2079 TimeADT time = PG_GETARG_TIMEADT(0);
2080 Interval *result;
2081
2082 result = palloc_object(Interval);
2083
2084 result->time = time;
2085 result->day = 0;
2086 result->month = 0;
2087
2088 PG_RETURN_INTERVAL_P(result);
2089}
int32 day
Definition timestamp.h:51
int32 month
Definition timestamp.h:52
#define PG_RETURN_INTERVAL_P(x)
Definition timestamp.h:69

References Interval::day, Interval::month, palloc_object, PG_GETARG_TIMEADT, PG_RETURN_INTERVAL_P, and Interval::time.

◆ time_larger()

Datum time_larger ( PG_FUNCTION_ARGS  )

Definition at line 1847 of file date.c.

1848{
1851
1853}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_TIMEADT.

◆ time_le()

Datum time_le ( PG_FUNCTION_ARGS  )

Definition at line 1795 of file date.c.

1796{
1799
1801}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

Referenced by gbt_timele().

◆ time_lt()

Datum time_lt ( PG_FUNCTION_ARGS  )

Definition at line 1786 of file date.c.

1787{
1790
1792}

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 2163 of file date.c.

2164{
2165 TimeADT time = PG_GETARG_TIMEADT(0);
2167 TimeADT result;
2168
2170 ereport(ERROR,
2172 errmsg("cannot subtract infinite interval from time")));
2173
2174 result = time - span->time;
2175 result -= result / USECS_PER_DAY * USECS_PER_DAY;
2176 if (result < INT64CONST(0))
2177 result += USECS_PER_DAY;
2178
2179 PG_RETURN_TIMEADT(result);
2180}

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

◆ time_mi_time()

Datum time_mi_time ( PG_FUNCTION_ARGS  )

Definition at line 2121 of file date.c.

2122{
2125 Interval *result;
2126
2127 result = palloc_object(Interval);
2128
2129 result->month = 0;
2130 result->day = 0;
2131 result->time = time1 - time2;
2132
2133 PG_RETURN_INTERVAL_P(result);
2134}

References Interval::day, fb(), Interval::month, palloc_object, PG_GETARG_TIMEADT, PG_RETURN_INTERVAL_P, and Interval::time.

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

◆ time_ne()

Datum time_ne ( PG_FUNCTION_ARGS  )

Definition at line 1777 of file date.c.

1778{
1781
1783}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_BOOL.

◆ time_out()

Datum time_out ( PG_FUNCTION_ARGS  )

Definition at line 1589 of file date.c.

1590{
1591 TimeADT time = PG_GETARG_TIMEADT(0);
1592 char *result;
1593 struct pg_tm tt,
1594 *tm = &tt;
1595 fsec_t fsec;
1596 char buf[MAXDATELEN + 1];
1597
1598 time2tm(time, tm, &fsec);
1599 EncodeTimeOnly(tm, fsec, false, 0, DateStyle, buf);
1600
1601 result = pstrdup(buf);
1602 PG_RETURN_CSTRING(result);
1603}
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:1576

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

Referenced by ExecGetJsonValueItemString().

◆ time_overflows()

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

Definition at line 1515 of file date.c.

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

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 2331 of file date.c.

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

References time_part_common().

◆ time_part_common()

static Datum time_part_common ( PG_FUNCTION_ARGS  ,
bool  retnumeric 
)
static

Definition at line 2228 of file date.c.

2229{
2231 TimeADT time = PG_GETARG_TIMEADT(1);
2233 int type,
2234 val;
2235 char *lowunits;
2236
2239 false);
2240
2241 type = DecodeUnits(0, lowunits, &val);
2242 if (type == UNKNOWN_FIELD)
2244
2245 if (type == UNITS)
2246 {
2247 fsec_t fsec;
2248 struct pg_tm tt,
2249 *tm = &tt;
2250
2251 time2tm(time, tm, &fsec);
2252
2253 switch (val)
2254 {
2255 case DTK_MICROSEC:
2256 intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
2257 break;
2258
2259 case DTK_MILLISEC:
2260 if (retnumeric)
2261 /*---
2262 * tm->tm_sec * 1000 + fsec / 1000
2263 * = (tm->tm_sec * 1'000'000 + fsec) / 1000
2264 */
2266 else
2267 PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
2268 break;
2269
2270 case DTK_SECOND:
2271 if (retnumeric)
2272 /*---
2273 * tm->tm_sec + fsec / 1'000'000
2274 * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
2275 */
2277 else
2278 PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
2279 break;
2280
2281 case DTK_MINUTE:
2282 intresult = tm->tm_min;
2283 break;
2284
2285 case DTK_HOUR:
2286 intresult = tm->tm_hour;
2287 break;
2288
2289 case DTK_TZ:
2290 case DTK_TZ_MINUTE:
2291 case DTK_TZ_HOUR:
2292 case DTK_DAY:
2293 case DTK_MONTH:
2294 case DTK_QUARTER:
2295 case DTK_YEAR:
2296 case DTK_DECADE:
2297 case DTK_CENTURY:
2298 case DTK_MILLENNIUM:
2299 case DTK_ISOYEAR:
2300 default:
2301 ereport(ERROR,
2303 errmsg("unit \"%s\" not supported for type %s",
2305 intresult = 0;
2306 }
2307 }
2308 else if (type == RESERV && val == DTK_EPOCH)
2309 {
2310 if (retnumeric)
2312 else
2313 PG_RETURN_FLOAT8(time / 1000000.0);
2314 }
2315 else
2316 {
2317 ereport(ERROR,
2319 errmsg("unit \"%s\" not recognized for type %s",
2321 intresult = 0;
2322 }
2323
2324 if (retnumeric)
2326 else
2328}
Numeric int64_div_fast_to_numeric(int64 val1, int log10val2)
Definition numeric.c:4280
#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 2140 of file date.c.

2141{
2142 TimeADT time = PG_GETARG_TIMEADT(0);
2144 TimeADT result;
2145
2147 ereport(ERROR,
2149 errmsg("cannot add infinite interval to time")));
2150
2151 result = time + span->time;
2152 result -= result / USECS_PER_DAY * USECS_PER_DAY;
2153 if (result < INT64CONST(0))
2154 result += USECS_PER_DAY;
2155
2156 PG_RETURN_TIMEADT(result);
2157}

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

◆ time_recv()

Datum time_recv ( PG_FUNCTION_ARGS  )

Definition at line 1609 of file date.c.

1610{
1612
1613#ifdef NOT_USED
1614 Oid typelem = PG_GETARG_OID(1);
1615#endif
1616 int32 typmod = PG_GETARG_INT32(2);
1617 TimeADT result;
1618
1619 result = pq_getmsgint64(buf);
1620
1621 if (result < INT64CONST(0) || result > USECS_PER_DAY)
1622 ereport(ERROR,
1624 errmsg("time out of range")));
1625
1626 AdjustTimeForTypmod(&result, typmod);
1627
1628 PG_RETURN_TIMEADT(result);
1629}
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(), and USECS_PER_DAY.

◆ time_scale()

Datum time_scale ( PG_FUNCTION_ARGS  )

Definition at line 1713 of file date.c.

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

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

◆ time_send()

Datum time_send ( PG_FUNCTION_ARGS  )

Definition at line 1635 of file date.c.

1636{
1637 TimeADT time = PG_GETARG_TIMEADT(0);
1639
1641 pq_sendint64(&buf, time);
1643}
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 1856 of file date.c.

1857{
1860
1862}

References fb(), PG_GETARG_TIMEADT, and PG_RETURN_TIMEADT.

◆ time_support()

Datum time_support ( PG_FUNCTION_ARGS  )

Definition at line 1693 of file date.c.

1694{
1696 Node *ret = NULL;
1697
1699 {
1701
1702 ret = TemporalSimplify(MAX_TIME_PRECISION, (Node *) req->fcall);
1703 }
1704
1705 PG_RETURN_POINTER(ret);
1706}
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 2916 of file date.c.

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

References DetermineTimeZoneOffset(), fb(), GetCurrentDateTime(), palloc_object, PG_GETARG_TIMEADT, PG_RETURN_TIMETZADT_P, session_timezone, TimeTzADT::time, time2tm(), tm, and TimeTzADT::zone.

Referenced by castTimeToTimeTz(), and executeDateTimeMethod().

◆ timestamp2date_safe()

DateADT timestamp2date_safe ( Timestamp  timestamp,
Node escontext 
)

Definition at line 1350 of file date.c.

1351{
1352 DateADT result;
1353 struct pg_tm tt,
1354 *tm = &tt;
1355 fsec_t fsec;
1356
1358 DATE_NOBEGIN(result);
1359 else if (TIMESTAMP_IS_NOEND(timestamp))
1360 DATE_NOEND(result);
1361 else
1362 {
1363 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
1364 {
1365 if (timestamp < 0)
1366 DATE_NOBEGIN(result);
1367 else
1368 DATE_NOEND(result); /* not actually reachable */
1369
1370 ereturn(escontext, result,
1372 errmsg("timestamp out of range")));
1373 }
1374
1376 }
1377
1378 return result;
1379}
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
Definition timestamp.c:1901
int64 timestamp

References date2j(), DATE_NOBEGIN, DATE_NOEND, ereturn, errcode(), errmsg, fb(), POSTGRES_EPOCH_JDATE, 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 1327 of file date.c.

1328{
1330 DateADT result;
1331
1333 PG_RETURN_DATEADT(result);
1334}
DateADT timestamp2date_safe(Timestamp timestamp, Node *escontext)
Definition date.c:1350

References fb(), PG_GETARG_TIMESTAMP, PG_RETURN_DATEADT, 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 1993 of file date.c.

1994{
1996 TimeADT result;
1997 struct pg_tm tt,
1998 *tm = &tt;
1999 fsec_t fsec;
2000
2003
2004 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
2005 ereport(ERROR,
2007 errmsg("timestamp out of range")));
2008
2009 /*
2010 * Could also do this with time = (timestamp / USECS_PER_DAY *
2011 * USECS_PER_DAY) - timestamp;
2012 */
2013 result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
2014 USECS_PER_SEC) + fsec;
2015
2016 PG_RETURN_TIMEADT(result);
2017}

References ereport, errcode(), errmsg, ERROR, fb(), MINS_PER_HOUR, PG_GETARG_TIMESTAMP, PG_RETURN_NULL, PG_RETURN_TIMEADT, 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 1424 of file date.c.

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

References date2j(), DATE_NOBEGIN, DATE_NOEND, ereturn, errcode(), errmsg, fb(), POSTGRES_EPOCH_JDATE, 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 1401 of file date.c.

1402{
1404 DateADT result;
1405
1407 PG_RETURN_DATEADT(result);
1408}
DateADT timestamptz2date_safe(TimestampTz timestamp, Node *escontext)
Definition date.c:1424

References fb(), PG_GETARG_TIMESTAMP, PG_RETURN_DATEADT, 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 2023 of file date.c.

2024{
2026 TimeADT result;
2027 struct pg_tm tt,
2028 *tm = &tt;
2029 int tz;
2030 fsec_t fsec;
2031
2034
2035 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
2036 ereport(ERROR,
2038 errmsg("timestamp out of range")));
2039
2040 /*
2041 * Could also do this with time = (timestamp / USECS_PER_DAY *
2042 * USECS_PER_DAY) - timestamp;
2043 */
2044 result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
2045 USECS_PER_SEC) + fsec;
2046
2047 PG_RETURN_TIMEADT(result);
2048}

References ereport, errcode(), errmsg, ERROR, fb(), MINS_PER_HOUR, PG_GETARG_TIMESTAMP, PG_RETURN_NULL, PG_RETURN_TIMEADT, 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 2942 of file date.c.

2943{
2945 TimeTzADT *result;
2946 struct pg_tm tt,
2947 *tm = &tt;
2948 int tz;
2949 fsec_t fsec;
2950
2953
2954 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
2955 ereport(ERROR,
2957 errmsg("timestamp out of range")));
2958
2959 result = palloc_object(TimeTzADT);
2960
2961 tm2timetz(tm, fsec, tz, result);
2962
2963 PG_RETURN_TIMETZADT_P(result);
2964}

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

Referenced by executeDateTimeMethod().

◆ timetypmodin()

Datum timetypmodin ( PG_FUNCTION_ARGS  )

Definition at line 1646 of file date.c.

1647{
1649
1651}
#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 1654 of file date.c.

1655{
1656 int32 typmod = PG_GETARG_INT32(0);
1657
1658 PG_RETURN_CSTRING(anytime_typmodout(false, typmod));
1659}
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 2491 of file date.c.

2492{
2493 TimeOffset trem = time->time;
2494
2500 *fsec = trem - tm->tm_sec * USECS_PER_SEC;
2501
2502 if (tzp != NULL)
2503 *tzp = time->zone;
2504
2505 return 0;
2506}
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 3253 of file date.c.

3254{
3255 Datum time = PG_GETARG_DATUM(0);
3256 const char *tzn = pg_get_timezone_name(session_timezone);
3258
3259 return DirectFunctionCall2(timetz_zone, zone, time);
3260}
Datum timetz_zone(PG_FUNCTION_ARGS)
Definition date.c:3148
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 2531 of file date.c.

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

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 2621 of file date.c.

2622{
2624 uint32 thash;
2625
2626 /*
2627 * To avoid any problems with padding bytes in the struct, we figure the
2628 * field hashes separately and XOR them.
2629 */
2631 Int64GetDatumFast(key->time)));
2634}
uint32_t uint32
Definition c.h:618
#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 2637 of file date.c.

2638{
2640 Datum seed = PG_GETARG_DATUM(1);
2641 uint64 thash;
2642
2643 /* Same approach as timetz_hash */
2645 Int64GetDatumFast(key->time),
2646 seed));
2648 DatumGetInt64(seed)));
2650}
uint64_t uint64
Definition c.h:619
#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 2361 of file date.c.

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

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, str, TimeTzADT::time, tm, and tm2timetz().

◆ timetz_izone()

Datum timetz_izone ( PG_FUNCTION_ARGS  )

Definition at line 3210 of file date.c.

3211{
3214 TimeTzADT *result;
3215 int tz;
3216
3218 ereport(ERROR,
3220 errmsg("interval time zone \"%s\" must be finite",
3222 PointerGetDatum(zone))))));
3223
3224 if (zone->month != 0 || zone->day != 0)
3225 ereport(ERROR,
3227 errmsg("interval time zone \"%s\" must not include months or days",
3229 PointerGetDatum(zone))))));
3230
3231 tz = -(zone->time / USECS_PER_SEC);
3232
3233 result = palloc_object(TimeTzADT);
3234
3235 result->time = time->time + (time->zone - tz) * USECS_PER_SEC;
3236 /* C99 modulo has the wrong sign convention for negative input */
3237 while (result->time < INT64CONST(0))
3238 result->time += USECS_PER_DAY;
3239 if (result->time >= USECS_PER_DAY)
3240 result->time %= USECS_PER_DAY;
3241
3242 result->zone = tz;
3243
3244 PG_RETURN_TIMETZADT_P(result);
3245}
Datum interval_out(PG_FUNCTION_ARGS)
Definition timestamp.c:964
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(), TimeTzADT::time, USECS_PER_DAY, USECS_PER_SEC, and TimeTzADT::zone.

◆ timetz_larger()

Datum timetz_larger ( PG_FUNCTION_ARGS  )

Definition at line 2653 of file date.c.

2654{
2657 TimeTzADT *result;
2658
2660 result = time1;
2661 else
2662 result = time2;
2663 PG_RETURN_TIMETZADT_P(result);
2664}

References fb(), PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, 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 2711 of file date.c.

2712{
2715 TimeTzADT *result;
2716
2718 ereport(ERROR,
2720 errmsg("cannot subtract infinite interval from time")));
2721
2722 result = palloc_object(TimeTzADT);
2723
2724 result->time = time->time - span->time;
2725 result->time -= result->time / USECS_PER_DAY * USECS_PER_DAY;
2726 if (result->time < INT64CONST(0))
2727 result->time += USECS_PER_DAY;
2728
2729 result->zone = time->zone;
2730
2731 PG_RETURN_TIMETZADT_P(result);
2732}

References ereport, errcode(), errmsg, ERROR, fb(), INT64CONST, INTERVAL_NOT_FINITE, palloc_object, PG_GETARG_INTERVAL_P, PG_GETARG_TIMETZADT_P, PG_RETURN_TIMETZADT_P, 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 2402 of file date.c.

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

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

Referenced by ExecGetJsonValueItemString().

◆ timetz_part()

Datum timetz_part ( PG_FUNCTION_ARGS  )

Definition at line 3132 of file date.c.

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

References timetz_part_common().

◆ timetz_part_common()

static Datum timetz_part_common ( PG_FUNCTION_ARGS  ,
bool  retnumeric 
)
static

Definition at line 3015 of file date.c.

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

2685{
2688 TimeTzADT *result;
2689
2691 ereport(ERROR,
2693 errmsg("cannot add infinite interval to time")));
2694
2695 result = palloc_object(TimeTzADT);
2696
2697 result->time = time->time + span->time;
2698 result->time -= result->time / USECS_PER_DAY * USECS_PER_DAY;
2699 if (result->time < INT64CONST(0))
2700 result->time += USECS_PER_DAY;
2701
2702 result->zone = time->zone;
2703
2704 PG_RETURN_TIMETZADT_P(result);
2705}

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

◆ timetz_recv()

Datum timetz_recv ( PG_FUNCTION_ARGS  )

Definition at line 2423 of file date.c.

2424{
2426
2427#ifdef NOT_USED
2428 Oid typelem = PG_GETARG_OID(1);
2429#endif
2430 int32 typmod = PG_GETARG_INT32(2);
2431 TimeTzADT *result;
2432
2433 result = palloc_object(TimeTzADT);
2434
2435 result->time = pq_getmsgint64(buf);
2436
2437 if (result->time < INT64CONST(0) || result->time > USECS_PER_DAY)
2438 ereport(ERROR,
2440 errmsg("time out of range")));
2441
2442 result->zone = pq_getmsgint(buf, sizeof(result->zone));
2443
2444 /* Check for sane GMT displacement; see notes in datatype/timestamp.h */
2445 if (result->zone <= -TZDISP_LIMIT || result->zone >= TZDISP_LIMIT)
2446 ereport(ERROR,
2448 errmsg("time zone displacement out of range")));
2449
2450 AdjustTimeForTypmod(&(result->time), typmod);
2451
2452 PG_RETURN_TIMETZADT_P(result);
2453}
#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(), TimeTzADT::time, TZDISP_LIMIT, USECS_PER_DAY, and TimeTzADT::zone.

◆ timetz_scale()

Datum timetz_scale ( PG_FUNCTION_ARGS  )

Definition at line 2513 of file date.c.

2514{
2516 int32 typmod = PG_GETARG_INT32(1);
2517 TimeTzADT *result;
2518
2519 result = palloc_object(TimeTzADT);
2520
2521 result->time = time->time;
2522 result->zone = time->zone;
2523
2524 AdjustTimeForTypmod(&(result->time), typmod);
2525
2526 PG_RETURN_TIMETZADT_P(result);
2527}

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

◆ timetz_send()

◆ timetz_smaller()

Datum timetz_smaller ( PG_FUNCTION_ARGS  )

Definition at line 2667 of file date.c.

2668{
2671 TimeTzADT *result;
2672
2674 result = time1;
2675 else
2676 result = time2;
2677 PG_RETURN_TIMETZADT_P(result);
2678}

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

◆ timetz_time()

Datum timetz_time ( PG_FUNCTION_ARGS  )

Definition at line 2903 of file date.c.

2904{
2906 TimeADT result;
2907
2908 /* swallow the time zone and just return the time */
2909 result = timetz->time;
2910
2911 PG_RETURN_TIMEADT(result);
2912}

References fb(), PG_GETARG_TIMETZADT_P, and PG_RETURN_TIMEADT.

Referenced by executeDateTimeMethod().

◆ timetz_zone()

Datum timetz_zone ( PG_FUNCTION_ARGS  )

Definition at line 3148 of file date.c.

3149{
3152 TimeTzADT *result;
3153 int tz;
3154 char tzname[TZ_STRLEN_MAX + 1];
3155 int type,
3156 val;
3157 pg_tz *tzp;
3158
3159 /*
3160 * Look up the requested timezone.
3161 */
3163
3164 type = DecodeTimezoneName(tzname, &val, &tzp);
3165
3167 {
3168 /* fixed-offset abbreviation */
3169 tz = -val;
3170 }
3171 else if (type == TZNAME_DYNTZ)
3172 {
3173 /* dynamic-offset abbreviation, resolve using transaction start time */
3175 int isdst;
3176
3178 }
3179 else
3180 {
3181 /* Get the offset-from-GMT that is valid now for the zone name */
3183 struct pg_tm tm;
3184 fsec_t fsec;
3185
3186 if (timestamp2tm(now, &tz, &tm, &fsec, NULL, tzp) != 0)
3187 ereport(ERROR,
3189 errmsg("timestamp out of range")));
3190 }
3191
3192 result = palloc_object(TimeTzADT);
3193
3194 result->time = t->time + (t->zone - tz) * USECS_PER_SEC;
3195 /* C99 modulo has the wrong sign convention for negative input */
3196 while (result->time < INT64CONST(0))
3197 result->time += USECS_PER_DAY;
3198 if (result->time >= USECS_PER_DAY)
3199 result->time %= USECS_PER_DAY;
3200
3201 result->zone = tz;
3202
3203 PG_RETURN_TIMETZADT_P(result);
3204}
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:1600
#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, 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 2471 of file date.c.

2472{
2474
2476}

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

◆ timetztypmodout()

Datum timetztypmodout ( PG_FUNCTION_ARGS  )

Definition at line 2479 of file date.c.

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

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 1504 of file date.c.

1505{
1506 *result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec)
1507 * USECS_PER_SEC) + fsec;
1508 return 0;
1509}

References MINS_PER_HOUR, 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 2351 of file date.c.

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

References MINS_PER_HOUR, SECS_PER_MINUTE, TimeTzADT::time, tm, pg_tm::tm_hour, pg_tm::tm_min, pg_tm::tm_sec, USECS_PER_SEC, and TimeTzADT::zone.

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