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

1665{
1666 static const int64 TimeScales[MAX_TIME_PRECISION + 1] = {
1667 INT64CONST(1000000),
1668 INT64CONST(100000),
1669 INT64CONST(10000),
1670 INT64CONST(1000),
1671 INT64CONST(100),
1672 INT64CONST(10),
1673 INT64CONST(1)
1674 };
1675
1676 static const int64 TimeOffsets[MAX_TIME_PRECISION + 1] = {
1677 INT64CONST(500000),
1678 INT64CONST(50000),
1679 INT64CONST(5000),
1680 INT64CONST(500),
1681 INT64CONST(50),
1682 INT64CONST(5),
1683 INT64CONST(0)
1684 };
1685
1686 if (typmod >= 0 && typmod <= MAX_TIME_PRECISION)
1687 {
1688 if (*time >= INT64CONST(0))
1689 *time = ((*time + TimeOffsets[typmod]) / TimeScales[typmod]) *
1690 TimeScales[typmod];
1691 else
1692 *time = -((((-*time) + TimeOffsets[typmod]) / TimeScales[typmod]) *
1693 TimeScales[typmod]);
1694 }
1695}
#define INT64CONST(x)
Definition: c.h:502
int64_t int64
Definition: c.h:485
#define MAX_TIME_PRECISION
Definition: date.h:45

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

72{
73 if (typmod < 0)
75 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
76 errmsg("TIME(%d)%s precision must not be negative",
77 typmod, (istz ? " WITH TIME ZONE" : ""))));
78 if (typmod > MAX_TIME_PRECISION)
79 {
81 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
82 errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
83 typmod, (istz ? " WITH TIME ZONE" : ""),
85 typmod = MAX_TIME_PRECISION;
86 }
87
88 return typmod;
89}
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#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(), executeDateTimeMethod(), and transformSQLValueFunction().

◆ date2timestamp_no_overflow()

double date2timestamp_no_overflow ( DateADT  dateVal)

Definition at line 739 of file date.c.

740{
741 double result;
742
743 if (DATE_IS_NOBEGIN(dateVal))
744 result = -DBL_MAX;
745 else if (DATE_IS_NOEND(dateVal))
746 result = DBL_MAX;
747 else
748 {
749 /* date is days since 2000, timestamp is microseconds since same... */
750 result = dateVal * (double) USECS_PER_DAY;
751 }
752
753 return result;
754}
#define USECS_PER_DAY
Definition: timestamp.h:131
#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 583 of file date.c.

584{
585 Timestamp result;
586
587 if (overflow)
588 *overflow = 0;
589
590 if (DATE_IS_NOBEGIN(dateVal))
591 TIMESTAMP_NOBEGIN(result);
592 else if (DATE_IS_NOEND(dateVal))
593 TIMESTAMP_NOEND(result);
594 else
595 {
596 /*
597 * Since dates have the same minimum values as timestamps, only upper
598 * boundary need be checked for overflow.
599 */
601 {
602 if (overflow)
603 {
604 *overflow = 1;
605 TIMESTAMP_NOEND(result);
606 return result;
607 }
608 else
609 {
611 (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
612 errmsg("date out of range for timestamp")));
613 }
614 }
615
616 /* date is days since 2000, timestamp is microseconds since same... */
617 result = dateVal * USECS_PER_DAY;
618 }
619
620 return result;
621}
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

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

644{
645 TimestampTz result;
646 struct pg_tm tt,
647 *tm = &tt;
648 int tz;
649
650 if (overflow)
651 *overflow = 0;
652
653 if (DATE_IS_NOBEGIN(dateVal))
654 TIMESTAMP_NOBEGIN(result);
655 else if (DATE_IS_NOEND(dateVal))
656 TIMESTAMP_NOEND(result);
657 else
658 {
659 /*
660 * Since dates have the same minimum values as timestamps, only upper
661 * boundary need be checked for overflow.
662 */
664 {
665 if (overflow)
666 {
667 *overflow = 1;
668 TIMESTAMP_NOEND(result);
669 return result;
670 }
671 else
672 {
674 (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
675 errmsg("date out of range for timestamp")));
676 }
677 }
678
680 &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
681 tm->tm_hour = 0;
682 tm->tm_min = 0;
683 tm->tm_sec = 0;
685
686 result = dateVal * USECS_PER_DAY + tz * USECS_PER_SEC;
687
688 /*
689 * Since it is possible to go beyond allowed timestamptz range because
690 * of time zone, check for allowed timestamp range after adding tz.
691 */
692 if (!IS_VALID_TIMESTAMP(result))
693 {
694 if (overflow)
695 {
696 if (result < MIN_TIMESTAMP)
697 {
698 *overflow = -1;
699 TIMESTAMP_NOBEGIN(result);
700 }
701 else
702 {
703 *overflow = 1;
704 TIMESTAMP_NOEND(result);
705 }
706 }
707 else
708 {
710 (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
711 errmsg("date out of range for timestamp")));
712 }
713 }
714 }
715
716 return result;
717}
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition: datetime.c:1595
void j2date(int jd, int *year, int *month, int *day)
Definition: datetime.c:321
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(), 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 762 of file date.c.

763{
764 Timestamp dt1;
765 int overflow;
766
767 dt1 = date2timestamp_opt_overflow(dateVal, &overflow);
768 if (overflow > 0)
769 {
770 /* dt1 is larger than any finite timestamp, but less than infinity */
771 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
772 }
773 Assert(overflow == 0); /* -1 case cannot occur */
774
775 return timestamp_cmp_internal(dt1, dt2);
776}
int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2)
Definition: timestamp.c:2191
#define Assert(condition)
Definition: c.h:815
#define TIMESTAMP_IS_NOEND(j)
Definition: timestamp.h:167
Timestamp date2timestamp_opt_overflow(DateADT dateVal, int *overflow)
Definition: date.c:583

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

843{
844 TimestampTz dt1;
845 int overflow;
846
847 dt1 = date2timestamptz_opt_overflow(dateVal, &overflow);
848 if (overflow > 0)
849 {
850 /* dt1 is larger than any finite timestamp, but less than infinity */
851 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
852 }
853 if (overflow < 0)
854 {
855 /* dt1 is less than any finite timestamp, but more than -infinity */
856 return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
857 }
858
859 return timestamptz_cmp_internal(dt1, dt2);
860}
#define TIMESTAMP_IS_NOBEGIN(j)
Definition: timestamp.h:162
TimestampTz date2timestamptz_opt_overflow(DateADT dateVal, int *overflow)
Definition: date.c:643
#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:207

References DatumGetInt32().

Referenced by compareDatetime(), convert_timevalue_to_scalar(), daterange_canonical(), executeDateTimeMethod(), 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:390

References DatumGetInt64().

Referenced by convert_timevalue_to_scalar(), executeDateTimeMethod(), 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:317
Definition: date.h:28

References DatumGetPointer().

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

◆ EncodeSpecialDate()

void EncodeSpecialDate ( DateADT  dt,
char *  str 
)

Definition at line 301 of file date.c.

302{
303 if (DATE_IS_NOBEGIN(dt))
304 strcpy(str, EARLY);
305 else if (DATE_IS_NOEND(dt))
306 strcpy(str, LATE);
307 else /* shouldn't happen */
308 elog(ERROR, "invalid argument for EncodeSpecialDate");
309}
#define elog(elevel,...)
Definition: elog.h:225
const char * str
#define EARLY
Definition: datetime.h:39
#define LATE
Definition: datetime.h:40

References DATE_IS_NOBEGIN, DATE_IS_NOEND, EARLY, elog, ERROR, LATE, and str.

Referenced by date_out(), and JsonEncodeDateTime().

◆ float_time_overflows()

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

Definition at line 1470 of file date.c.

1471{
1472 /* Range-check the fields individually. */
1473 if (hour < 0 || hour > HOURS_PER_DAY ||
1474 min < 0 || min >= MINS_PER_HOUR)
1475 return true;
1476
1477 /*
1478 * "sec", being double, requires extra care. Cope with NaN, and round off
1479 * before applying the range check to avoid unexpected errors due to
1480 * imprecise input. (We assume rint() behaves sanely with infinities.)
1481 */
1482 if (isnan(sec))
1483 return true;
1484 sec = rint(sec * USECS_PER_SEC);
1485 if (sec < 0 || sec > SECS_PER_MINUTE * USECS_PER_SEC)
1486 return true;
1487
1488 /*
1489 * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1490 * that the total time value doesn't exceed 24:00:00. This must match the
1491 * way that callers will convert the fields to a time.
1492 */
1493 if (((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1494 * USECS_PER_SEC) + (int64) sec) > USECS_PER_DAY)
1495 return true;
1496
1497 return false;
1498}
#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 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 316 of file date.c.

317{
318 struct pg_tm tm;
319
320 static int cache_year = 0;
321 static int cache_mon = 0;
322 static int cache_mday = 0;
323 static DateADT cache_date;
324
326
327 /*
328 * date2j involves several integer divisions; moreover, unless our session
329 * lives across local midnight, we don't really have to do it more than
330 * once. So it seems worth having a separate cache here.
331 */
332 if (tm.tm_year != cache_year ||
333 tm.tm_mon != cache_mon ||
334 tm.tm_mday != cache_mday)
335 {
337 cache_year = tm.tm_year;
338 cache_mon = tm.tm_mon;
339 cache_mday = tm.tm_mday;
340 }
341
342 return cache_date;
343}
void GetCurrentDateTime(struct pg_tm *tm)
Definition: datetime.c:376
int date2j(int year, int month, int day)
Definition: datetime.c:296

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

350{
351 TimeTzADT *result;
352 struct pg_tm tt,
353 *tm = &tt;
354 fsec_t fsec;
355 int tz;
356
357 GetCurrentTimeUsec(tm, &fsec, &tz);
358
359 result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
360 tm2timetz(tm, fsec, tz, result);
361 AdjustTimeForTypmod(&(result->time), typmod);
362 return result;
363}
void GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp)
Definition: datetime.c:397
int32 fsec_t
Definition: timestamp.h:41
int tm2timetz(struct pg_tm *tm, fsec_t fsec, int tz, TimeTzADT *result)
Definition: date.c:2282
void AdjustTimeForTypmod(TimeADT *time, int32 typmod)
Definition: date.c:1664
void * palloc(Size size)
Definition: mcxt.c:1317
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 369 of file date.c.

370{
371 TimeADT result;
372 struct pg_tm tt,
373 *tm = &tt;
374 fsec_t fsec;
375 int tz;
376
377 GetCurrentTimeUsec(tm, &fsec, &tz);
378
379 tm2time(tm, fsec, &result);
380 AdjustTimeForTypmod(&result, typmod);
381 return result;
382}
int tm2time(struct pg_tm *tm, fsec_t fsec, TimeADT *result)
Definition: date.c:1435

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

Referenced by ExecEvalSQLValueFunction().

◆ time2tm()

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

Definition at line 1507 of file date.c.

1508{
1509 tm->tm_hour = time / USECS_PER_HOUR;
1510 time -= tm->tm_hour * USECS_PER_HOUR;
1511 tm->tm_min = time / USECS_PER_MINUTE;
1512 time -= tm->tm_min * USECS_PER_MINUTE;
1513 tm->tm_sec = time / USECS_PER_SEC;
1514 time -= tm->tm_sec * USECS_PER_SEC;
1515 *fsec = time;
1516 return 0;
1517}
#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_overflows()

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

Definition at line 1446 of file date.c.

1447{
1448 /* Range-check the fields individually. */
1449 if (hour < 0 || hour > HOURS_PER_DAY ||
1450 min < 0 || min >= MINS_PER_HOUR ||
1451 sec < 0 || sec > SECS_PER_MINUTE ||
1452 fsec < 0 || fsec > USECS_PER_SEC)
1453 return true;
1454
1455 /*
1456 * Because we allow, eg, hour = 24 or sec = 60, we must check separately
1457 * that the total time value doesn't exceed 24:00:00.
1458 */
1459 if ((((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
1460 + sec) * USECS_PER_SEC) + fsec) > USECS_PER_DAY)
1461 return true;
1462
1463 return false;
1464}

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:1807

References Int64GetDatum().

Referenced by ExecEvalSQLValueFunction(), executeDateTimeMethod(), 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 2422 of file date.c.

2423{
2424 TimeOffset trem = time->time;
2425
2426 tm->tm_hour = trem / USECS_PER_HOUR;
2427 trem -= tm->tm_hour * USECS_PER_HOUR;
2428 tm->tm_min = trem / USECS_PER_MINUTE;
2429 trem -= tm->tm_min * USECS_PER_MINUTE;
2430 tm->tm_sec = trem / USECS_PER_SEC;
2431 *fsec = trem - tm->tm_sec * USECS_PER_SEC;
2432
2433 if (tzp != NULL)
2434 *tzp = time->zone;
2435
2436 return 0;
2437}
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:327

References PointerGetDatum().

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

◆ tm2time()

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

Definition at line 1435 of file date.c.

1436{
1437 *result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec)
1438 * USECS_PER_SEC) + fsec;
1439 return 0;
1440}

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

2283{
2284 result->time = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
2285 USECS_PER_SEC) + fsec;
2286 result->zone = tz;
2287
2288 return 0;
2289}

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