PostgreSQL Source Code  git master
date.h File Reference
#include <math.h>
#include "datatype/timestamp.h"
#include "fmgr.h"
#include "pgtime.h"
Include dependency graph for date.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  TimeTzADT
 

Macros

#define DATEVAL_NOBEGIN   ((DateADT) PG_INT32_MIN)
 
#define DATEVAL_NOEND   ((DateADT) PG_INT32_MAX)
 
#define DATE_NOBEGIN(j)   ((j) = DATEVAL_NOBEGIN)
 
#define DATE_IS_NOBEGIN(j)   ((j) == DATEVAL_NOBEGIN)
 
#define DATE_NOEND(j)   ((j) = DATEVAL_NOEND)
 
#define DATE_IS_NOEND(j)   ((j) == DATEVAL_NOEND)
 
#define DATE_NOT_FINITE(j)   (DATE_IS_NOBEGIN(j) || DATE_IS_NOEND(j))
 
#define MAX_TIME_PRECISION   6
 
#define PG_GETARG_DATEADT(n)   DatumGetDateADT(PG_GETARG_DATUM(n))
 
#define PG_GETARG_TIMEADT(n)   DatumGetTimeADT(PG_GETARG_DATUM(n))
 
#define PG_GETARG_TIMETZADT_P(n)   DatumGetTimeTzADTP(PG_GETARG_DATUM(n))
 
#define PG_RETURN_DATEADT(x)   return DateADTGetDatum(x)
 
#define PG_RETURN_TIMEADT(x)   return TimeADTGetDatum(x)
 
#define PG_RETURN_TIMETZADT_P(x)   return TimeTzADTPGetDatum(x)
 

Typedefs

typedef int32 DateADT
 
typedef int64 TimeADT
 

Functions

static DateADT DatumGetDateADT (Datum X)
 
static TimeADT DatumGetTimeADT (Datum X)
 
static TimeTzADTDatumGetTimeTzADTP (Datum X)
 
static Datum DateADTGetDatum (DateADT X)
 
static Datum TimeADTGetDatum (TimeADT X)
 
static Datum TimeTzADTPGetDatum (const TimeTzADT *X)
 
int32 anytime_typmod_check (bool istz, int32 typmod)
 
double date2timestamp_no_overflow (DateADT dateVal)
 
Timestamp date2timestamp_opt_overflow (DateADT dateVal, int *overflow)
 
TimestampTz date2timestamptz_opt_overflow (DateADT dateVal, int *overflow)
 
int32 date_cmp_timestamp_internal (DateADT dateVal, Timestamp dt2)
 
int32 date_cmp_timestamptz_internal (DateADT dateVal, TimestampTz dt2)
 
void EncodeSpecialDate (DateADT dt, char *str)
 
DateADT GetSQLCurrentDate (void)
 
TimeTzADTGetSQLCurrentTime (int32 typmod)
 
TimeADT GetSQLLocalTime (int32 typmod)
 
int time2tm (TimeADT time, struct pg_tm *tm, fsec_t *fsec)
 
int timetz2tm (TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp)
 
int tm2time (struct pg_tm *tm, fsec_t fsec, TimeADT *result)
 
int tm2timetz (struct pg_tm *tm, fsec_t fsec, int tz, TimeTzADT *result)
 
bool time_overflows (int hour, int min, int sec, fsec_t fsec)
 
bool float_time_overflows (int hour, int min, double sec)
 
void AdjustTimeForTypmod (TimeADT *time, int32 typmod)
 

Macro Definition Documentation

◆ DATE_IS_NOBEGIN

#define DATE_IS_NOBEGIN (   j)    ((j) == DATEVAL_NOBEGIN)

Definition at line 40 of file date.h.

◆ DATE_IS_NOEND

#define DATE_IS_NOEND (   j)    ((j) == DATEVAL_NOEND)

Definition at line 42 of file date.h.

◆ DATE_NOBEGIN

#define DATE_NOBEGIN (   j)    ((j) = DATEVAL_NOBEGIN)

Definition at line 39 of file date.h.

◆ DATE_NOEND

#define DATE_NOEND (   j)    ((j) = DATEVAL_NOEND)

Definition at line 41 of file date.h.

◆ DATE_NOT_FINITE

#define DATE_NOT_FINITE (   j)    (DATE_IS_NOBEGIN(j) || DATE_IS_NOEND(j))

Definition at line 43 of file date.h.

◆ DATEVAL_NOBEGIN

#define DATEVAL_NOBEGIN   ((DateADT) PG_INT32_MIN)

Definition at line 36 of file date.h.

◆ DATEVAL_NOEND

#define DATEVAL_NOEND   ((DateADT) PG_INT32_MAX)

Definition at line 37 of file date.h.

◆ MAX_TIME_PRECISION

#define MAX_TIME_PRECISION   6

Definition at line 45 of file date.h.

◆ PG_GETARG_DATEADT

#define PG_GETARG_DATEADT (   n)    DatumGetDateADT(PG_GETARG_DATUM(n))

Definition at line 89 of file date.h.

◆ PG_GETARG_TIMEADT

#define PG_GETARG_TIMEADT (   n)    DatumGetTimeADT(PG_GETARG_DATUM(n))

Definition at line 90 of file date.h.

◆ PG_GETARG_TIMETZADT_P

#define PG_GETARG_TIMETZADT_P (   n)    DatumGetTimeTzADTP(PG_GETARG_DATUM(n))

Definition at line 91 of file date.h.

◆ PG_RETURN_DATEADT

#define PG_RETURN_DATEADT (   x)    return DateADTGetDatum(x)

Definition at line 93 of file date.h.

◆ PG_RETURN_TIMEADT

#define PG_RETURN_TIMEADT (   x)    return TimeADTGetDatum(x)

Definition at line 94 of file date.h.

◆ PG_RETURN_TIMETZADT_P

#define PG_RETURN_TIMETZADT_P (   x)    return TimeTzADTPGetDatum(x)

Definition at line 95 of file date.h.

Typedef Documentation

◆ DateADT

typedef int32 DateADT

Definition at line 23 of file date.h.

◆ TimeADT

typedef int64 TimeADT

Definition at line 25 of file date.h.

Function Documentation

◆ AdjustTimeForTypmod()

void AdjustTimeForTypmod ( TimeADT time,
int32  typmod 
)

Definition at line 1644 of file date.c.

1645 {
1646  static const int64 TimeScales[MAX_TIME_PRECISION + 1] = {
1647  INT64CONST(1000000),
1648  INT64CONST(100000),
1649  INT64CONST(10000),
1650  INT64CONST(1000),
1651  INT64CONST(100),
1652  INT64CONST(10),
1653  INT64CONST(1)
1654  };
1655 
1656  static const int64 TimeOffsets[MAX_TIME_PRECISION + 1] = {
1657  INT64CONST(500000),
1658  INT64CONST(50000),
1659  INT64CONST(5000),
1660  INT64CONST(500),
1661  INT64CONST(50),
1662  INT64CONST(5),
1663  INT64CONST(0)
1664  };
1665 
1666  if (typmod >= 0 && typmod <= MAX_TIME_PRECISION)
1667  {
1668  if (*time >= INT64CONST(0))
1669  *time = ((*time + TimeOffsets[typmod]) / TimeScales[typmod]) *
1670  TimeScales[typmod];
1671  else
1672  *time = -((((-*time) + TimeOffsets[typmod]) / TimeScales[typmod]) *
1673  TimeScales[typmod]);
1674  }
1675 }
#define MAX_TIME_PRECISION
Definition: date.h:45

References MAX_TIME_PRECISION.

Referenced by 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 70 of file date.c.

71 {
72  if (typmod < 0)
73  ereport(ERROR,
74  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
75  errmsg("TIME(%d)%s precision must not be negative",
76  typmod, (istz ? " WITH TIME ZONE" : ""))));
77  if (typmod > MAX_TIME_PRECISION)
78  {
80  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
81  errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
82  typmod, (istz ? " WITH TIME ZONE" : ""),
84  typmod = MAX_TIME_PRECISION;
85  }
86 
87  return typmod;
88 }
int errcode(int sqlerrcode)
Definition: elog.c:858
int errmsg(const char *fmt,...)
Definition: elog.c:1069
#define WARNING
Definition: elog.h:36
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149

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

Referenced by anytime_typmodin(), and transformSQLValueFunction().

◆ date2timestamp_no_overflow()

double date2timestamp_no_overflow ( DateADT  dateVal)

Definition at line 719 of file date.c.

720 {
721  double result;
722 
723  if (DATE_IS_NOBEGIN(dateVal))
724  result = -DBL_MAX;
725  else if (DATE_IS_NOEND(dateVal))
726  result = DBL_MAX;
727  else
728  {
729  /* date is days since 2000, timestamp is microseconds since same... */
730  result = dateVal * (double) USECS_PER_DAY;
731  }
732 
733  return result;
734 }
#define USECS_PER_DAY
Definition: timestamp.h:130
#define DATE_IS_NOEND(j)
Definition: date.h:42
#define DATE_IS_NOBEGIN(j)
Definition: date.h:40

References DATE_IS_NOBEGIN, DATE_IS_NOEND, and USECS_PER_DAY.

Referenced by convert_timevalue_to_scalar().

◆ date2timestamp_opt_overflow()

Timestamp date2timestamp_opt_overflow ( DateADT  dateVal,
int *  overflow 
)

Definition at line 563 of file date.c.

564 {
565  Timestamp result;
566 
567  if (overflow)
568  *overflow = 0;
569 
570  if (DATE_IS_NOBEGIN(dateVal))
571  TIMESTAMP_NOBEGIN(result);
572  else if (DATE_IS_NOEND(dateVal))
573  TIMESTAMP_NOEND(result);
574  else
575  {
576  /*
577  * Since dates have the same minimum values as timestamps, only upper
578  * boundary need be checked for overflow.
579  */
580  if (dateVal >= (TIMESTAMP_END_JULIAN - POSTGRES_EPOCH_JDATE))
581  {
582  if (overflow)
583  {
584  *overflow = 1;
585  TIMESTAMP_NOEND(result);
586  return result;
587  }
588  else
589  {
590  ereport(ERROR,
591  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
592  errmsg("date out of range for timestamp")));
593  }
594  }
595 
596  /* date is days since 2000, timestamp is microseconds since same... */
597  result = dateVal * USECS_PER_DAY;
598  }
599 
600  return result;
601 }
int64 Timestamp
Definition: timestamp.h:38
#define TIMESTAMP_NOBEGIN(j)
Definition: timestamp.h:158
#define TIMESTAMP_END_JULIAN
Definition: timestamp.h:227
#define POSTGRES_EPOCH_JDATE
Definition: timestamp.h:209
#define TIMESTAMP_NOEND(j)
Definition: timestamp.h:163

References DATE_IS_NOBEGIN, DATE_IS_NOEND, ereport, errcode(), errmsg(), ERROR, POSTGRES_EPOCH_JDATE, TIMESTAMP_END_JULIAN, TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, and USECS_PER_DAY.

Referenced by date2timestamp(), and date_cmp_timestamp_internal().

◆ date2timestamptz_opt_overflow()

TimestampTz date2timestamptz_opt_overflow ( DateADT  dateVal,
int *  overflow 
)

Definition at line 623 of file date.c.

624 {
625  TimestampTz result;
626  struct pg_tm tt,
627  *tm = &tt;
628  int tz;
629 
630  if (overflow)
631  *overflow = 0;
632 
633  if (DATE_IS_NOBEGIN(dateVal))
634  TIMESTAMP_NOBEGIN(result);
635  else if (DATE_IS_NOEND(dateVal))
636  TIMESTAMP_NOEND(result);
637  else
638  {
639  /*
640  * Since dates have the same minimum values as timestamps, only upper
641  * boundary need be checked for overflow.
642  */
643  if (dateVal >= (TIMESTAMP_END_JULIAN - POSTGRES_EPOCH_JDATE))
644  {
645  if (overflow)
646  {
647  *overflow = 1;
648  TIMESTAMP_NOEND(result);
649  return result;
650  }
651  else
652  {
653  ereport(ERROR,
654  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
655  errmsg("date out of range for timestamp")));
656  }
657  }
658 
659  j2date(dateVal + POSTGRES_EPOCH_JDATE,
660  &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
661  tm->tm_hour = 0;
662  tm->tm_min = 0;
663  tm->tm_sec = 0;
665 
666  result = dateVal * USECS_PER_DAY + tz * USECS_PER_SEC;
667 
668  /*
669  * Since it is possible to go beyond allowed timestamptz range because
670  * of time zone, check for allowed timestamp range after adding tz.
671  */
672  if (!IS_VALID_TIMESTAMP(result))
673  {
674  if (overflow)
675  {
676  if (result < MIN_TIMESTAMP)
677  {
678  *overflow = -1;
679  TIMESTAMP_NOBEGIN(result);
680  }
681  else
682  {
683  *overflow = 1;
684  TIMESTAMP_NOEND(result);
685  }
686  }
687  else
688  {
689  ereport(ERROR,
690  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
691  errmsg("date out of range for timestamp")));
692  }
693  }
694  }
695 
696  return result;
697 }
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition: datetime.c:1587
void j2date(int jd, int *year, int *month, int *day)
Definition: datetime.c:313
int64 TimestampTz
Definition: timestamp.h:39
#define IS_VALID_TIMESTAMP(t)
Definition: timestamp.h:241
#define USECS_PER_SEC
Definition: timestamp.h:133
#define MIN_TIMESTAMP
Definition: timestamp.h:230
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(), ereport, errcode(), errmsg(), ERROR, 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 date2timestamptz(), and date_cmp_timestamptz_internal().

◆ date_cmp_timestamp_internal()

int32 date_cmp_timestamp_internal ( DateADT  dateVal,
Timestamp  dt2 
)

Definition at line 742 of file date.c.

743 {
744  Timestamp dt1;
745  int overflow;
746 
747  dt1 = date2timestamp_opt_overflow(dateVal, &overflow);
748  if (overflow > 0)
749  {
750  /* dt1 is larger than any finite timestamp, but less than infinity */
751  return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
752  }
753  Assert(overflow == 0); /* -1 case cannot occur */
754 
755  return timestamp_cmp_internal(dt1, dt2);
756 }
int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2)
Definition: timestamp.c:2125
#define TIMESTAMP_IS_NOEND(j)
Definition: timestamp.h:166
Timestamp date2timestamp_opt_overflow(DateADT dateVal, int *overflow)
Definition: date.c:563
Assert(fmt[strlen(fmt) - 1] !='\n')

References Assert(), date2timestamp_opt_overflow(), 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_internal()

int32 date_cmp_timestamptz_internal ( DateADT  dateVal,
TimestampTz  dt2 
)

Definition at line 822 of file date.c.

823 {
824  TimestampTz dt1;
825  int overflow;
826 
827  dt1 = date2timestamptz_opt_overflow(dateVal, &overflow);
828  if (overflow > 0)
829  {
830  /* dt1 is larger than any finite timestamp, but less than infinity */
831  return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
832  }
833  if (overflow < 0)
834  {
835  /* dt1 is less than any finite timestamp, but more than -infinity */
836  return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
837  }
838 
839  return timestamptz_cmp_internal(dt1, dt2);
840 }
#define TIMESTAMP_IS_NOBEGIN(j)
Definition: timestamp.h:161
TimestampTz date2timestamptz_opt_overflow(DateADT dateVal, int *overflow)
Definition: date.c:623
#define timestamptz_cmp_internal(dt1, dt2)
Definition: timestamp.h:131

References date2timestamptz_opt_overflow(), 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().

◆ DateADTGetDatum()

static Datum DateADTGetDatum ( DateADT  X)
inlinestatic

◆ DatumGetDateADT()

static DateADT DatumGetDateADT ( Datum  X)
inlinestatic

Definition at line 54 of file date.h.

55 {
56  return (DateADT) DatumGetInt32(X);
57 }
int32 DateADT
Definition: date.h:23
static int32 DatumGetInt32(Datum X)
Definition: postgres.h:202

References DatumGetInt32().

Referenced by compareDatetime(), convert_timevalue_to_scalar(), daterange_canonical(), gbt_num_compress(), JsonEncodeDateTime(), and map_sql_value_to_xml_value().

◆ DatumGetTimeADT()

static TimeADT DatumGetTimeADT ( Datum  X)
inlinestatic

Definition at line 60 of file date.h.

61 {
62  return (TimeADT) DatumGetInt64(X);
63 }
int64 TimeADT
Definition: date.h:25
static int64 DatumGetInt64(Datum X)
Definition: postgres.h:385

References DatumGetInt64().

Referenced by convert_timevalue_to_scalar(), gbt_num_compress(), and JsonEncodeDateTime().

◆ DatumGetTimeTzADTP()

static TimeTzADT* DatumGetTimeTzADTP ( Datum  X)
inlinestatic

Definition at line 66 of file date.h.

67 {
68  return (TimeTzADT *) DatumGetPointer(X);
69 }
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:312
Definition: date.h:28

References DatumGetPointer().

Referenced by convert_timevalue_to_scalar(), gbt_timetz_compress(), and JsonEncodeDateTime().

◆ EncodeSpecialDate()

void EncodeSpecialDate ( DateADT  dt,
char *  str 
)

Definition at line 293 of file date.c.

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

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

Referenced by date_out(), and JsonEncodeDateTime().

◆ float_time_overflows()

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

Definition at line 1450 of file date.c.

1451 {
1452  /* Range-check the fields individually. */
1453  if (hour < 0 || hour > HOURS_PER_DAY ||
1454  min < 0 || min >= MINS_PER_HOUR)
1455  return true;
1456 
1457  /*
1458  * "sec", being double, requires extra care. Cope with NaN, and round off
1459  * before applying the range check to avoid unexpected errors due to
1460  * imprecise input. (We assume rint() behaves sanely with infinities.)
1461  */
1462  if (isnan(sec))
1463  return true;
1464  sec = rint(sec * USECS_PER_SEC);
1465  if (sec < 0 || sec > SECS_PER_MINUTE * USECS_PER_SEC)
1466  return true;
1467 
1468  /*
1469  * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1470  * that the total time value doesn't exceed 24:00:00. This must match the
1471  * way that callers will convert the fields to a time.
1472  */
1473  if (((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1474  * USECS_PER_SEC) + (int64) sec) > USECS_PER_DAY)
1475  return true;
1476 
1477  return false;
1478 }
#define MINS_PER_HOUR
Definition: timestamp.h:128
#define SECS_PER_MINUTE
Definition: timestamp.h:127
#define HOURS_PER_DAY
Definition: timestamp.h:117

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

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

References date2j(), 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 341 of file date.c.

342 {
343  TimeTzADT *result;
344  struct pg_tm tt,
345  *tm = &tt;
346  fsec_t fsec;
347  int tz;
348 
349  GetCurrentTimeUsec(tm, &fsec, &tz);
350 
351  result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
352  tm2timetz(tm, fsec, tz, result);
353  AdjustTimeForTypmod(&(result->time), typmod);
354  return result;
355 }
void GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp)
Definition: datetime.c:389
int32 fsec_t
Definition: timestamp.h:41
int tm2timetz(struct pg_tm *tm, fsec_t fsec, int tz, TimeTzADT *result)
Definition: date.c:2254
void AdjustTimeForTypmod(TimeADT *time, int32 typmod)
Definition: date.c:1644
void * palloc(Size size)
Definition: mcxt.c:1226
TimeADT time
Definition: date.h:29

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

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLLocalTime()

TimeADT GetSQLLocalTime ( int32  typmod)

Definition at line 361 of file date.c.

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

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

Referenced by ExecEvalSQLValueFunction().

◆ time2tm()

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

Definition at line 1487 of file date.c.

1488 {
1489  tm->tm_hour = time / USECS_PER_HOUR;
1490  time -= tm->tm_hour * USECS_PER_HOUR;
1491  tm->tm_min = time / USECS_PER_MINUTE;
1492  time -= tm->tm_min * USECS_PER_MINUTE;
1493  tm->tm_sec = time / USECS_PER_SEC;
1494  time -= tm->tm_sec * USECS_PER_SEC;
1495  *fsec = time;
1496  return 0;
1497 }
#define USECS_PER_HOUR
Definition: timestamp.h:131
#define USECS_PER_MINUTE
Definition: timestamp.h:132

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_overflows()

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

Definition at line 1426 of file date.c.

1427 {
1428  /* Range-check the fields individually. */
1429  if (hour < 0 || hour > HOURS_PER_DAY ||
1430  min < 0 || min >= MINS_PER_HOUR ||
1431  sec < 0 || sec > SECS_PER_MINUTE ||
1432  fsec < 0 || fsec > USECS_PER_SEC)
1433  return true;
1434 
1435  /*
1436  * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1437  * that the total time value doesn't exceed 24:00:00.
1438  */
1439  if ((((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1440  + sec) * USECS_PER_SEC) + fsec) > USECS_PER_DAY)
1441  return true;
1442 
1443  return false;
1444 }

References HOURS_PER_DAY, MINS_PER_HOUR, SECS_PER_MINUTE, USECS_PER_DAY, and USECS_PER_SEC.

Referenced by DecodeDateTime(), and DecodeTimeOnly().

◆ TimeADTGetDatum()

static Datum TimeADTGetDatum ( TimeADT  X)
inlinestatic

Definition at line 78 of file date.h.

79 {
80  return Int64GetDatum(X);
81 }
Datum Int64GetDatum(int64 X)
Definition: fmgr.c:1778

References Int64GetDatum().

Referenced by ExecEvalSQLValueFunction(), gbt_num_fetch(), leftmostvalue_time(), and parse_datetime().

◆ timetz2tm()

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

Definition at line 2394 of file date.c.

2395 {
2396  TimeOffset trem = time->time;
2397 
2398  tm->tm_hour = trem / USECS_PER_HOUR;
2399  trem -= tm->tm_hour * USECS_PER_HOUR;
2400  tm->tm_min = trem / USECS_PER_MINUTE;
2401  trem -= tm->tm_min * USECS_PER_MINUTE;
2402  tm->tm_sec = trem / USECS_PER_SEC;
2403  *fsec = trem - tm->tm_sec * USECS_PER_SEC;
2404 
2405  if (tzp != NULL)
2406  *tzp = time->zone;
2407 
2408  return 0;
2409 }
int64 TimeOffset
Definition: timestamp.h:40
int32 zone
Definition: date.h:30

References 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().

◆ TimeTzADTPGetDatum()

static Datum TimeTzADTPGetDatum ( const TimeTzADT X)
inlinestatic

Definition at line 84 of file date.h.

85 {
86  return PointerGetDatum(X);
87 }
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:322

References PointerGetDatum().

Referenced by ExecEvalSQLValueFunction(), leftmostvalue_timetz(), and parse_datetime().

◆ tm2time()

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

Definition at line 1415 of file date.c.

1416 {
1417  *result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec)
1418  * USECS_PER_SEC) + fsec;
1419  return 0;
1420 }

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

2255 {
2256  result->time = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
2257  USECS_PER_SEC) + fsec;
2258  result->zone = tz;
2259 
2260  return 0;
2261 }

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().