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

Go to the source code of this file.

Macros

#define PG_GETARG_TIMESTAMP(n)   DatumGetTimestamp(PG_GETARG_DATUM(n))
 
#define PG_GETARG_TIMESTAMPTZ(n)   DatumGetTimestampTz(PG_GETARG_DATUM(n))
 
#define PG_GETARG_INTERVAL_P(n)   DatumGetIntervalP(PG_GETARG_DATUM(n))
 
#define PG_RETURN_TIMESTAMP(x)   return TimestampGetDatum(x)
 
#define PG_RETURN_TIMESTAMPTZ(x)   return TimestampTzGetDatum(x)
 
#define PG_RETURN_INTERVAL_P(x)   return IntervalPGetDatum(x)
 
#define TIMESTAMP_MASK(b)   (1 << (b))
 
#define INTERVAL_MASK(b)   (1 << (b))
 
#define INTERVAL_FULL_RANGE   (0x7FFF)
 
#define INTERVAL_RANGE_MASK   (0x7FFF)
 
#define INTERVAL_FULL_PRECISION   (0xFFFF)
 
#define INTERVAL_PRECISION_MASK   (0xFFFF)
 
#define INTERVAL_TYPMOD(p, r)   ((((r) & INTERVAL_RANGE_MASK) << 16) | ((p) & INTERVAL_PRECISION_MASK))
 
#define INTERVAL_PRECISION(t)   ((t) & INTERVAL_PRECISION_MASK)
 
#define INTERVAL_RANGE(t)   (((t) >> 16) & INTERVAL_RANGE_MASK)
 
#define TimestampTzPlusMilliseconds(tz, ms)   ((tz) + ((ms) * (int64) 1000))
 
#define TimestampTzPlusSeconds(tz, s)   ((tz) + ((s) * (int64) 1000000))
 
#define timestamptz_cmp_internal(dt1, dt2)   timestamp_cmp_internal(dt1, dt2)
 

Functions

static Timestamp DatumGetTimestamp (Datum X)
 
static TimestampTz DatumGetTimestampTz (Datum X)
 
static IntervalDatumGetIntervalP (Datum X)
 
static Datum TimestampGetDatum (Timestamp X)
 
static Datum TimestampTzGetDatum (TimestampTz X)
 
static Datum IntervalPGetDatum (const Interval *X)
 
TimestampTz GetCurrentTimestamp (void)
 
void TimestampDifference (TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs)
 
long TimestampDifferenceMilliseconds (TimestampTz start_time, TimestampTz stop_time)
 
bool TimestampDifferenceExceeds (TimestampTz start_time, TimestampTz stop_time, int msec)
 
TimestampTz time_t_to_timestamptz (pg_time_t tm)
 
pg_time_t timestamptz_to_time_t (TimestampTz t)
 
const char * timestamptz_to_str (TimestampTz t)
 
int tm2timestamp (struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result)
 
int timestamp2tm (Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
 
void dt2time (Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
 
void interval2itm (Interval span, struct pg_itm *itm)
 
int itm2interval (struct pg_itm *itm, Interval *span)
 
int itmin2interval (struct pg_itm_in *itm_in, Interval *span)
 
Timestamp SetEpochTimestamp (void)
 
void GetEpochTime (struct pg_tm *tm)
 
int timestamp_cmp_internal (Timestamp dt1, Timestamp dt2)
 
TimestampTz timestamp2timestamptz_opt_overflow (Timestamp timestamp, int *overflow)
 
int32 timestamp_cmp_timestamptz_internal (Timestamp timestampVal, TimestampTz dt2)
 
int isoweek2j (int year, int week)
 
void isoweek2date (int woy, int *year, int *mon, int *mday)
 
void isoweekdate2date (int isoweek, int wday, int *year, int *mon, int *mday)
 
int date2isoweek (int year, int mon, int mday)
 
int date2isoyear (int year, int mon, int mday)
 
int date2isoyearday (int year, int mon, int mday)
 
bool TimestampTimestampTzRequiresRewrite (void)
 

Variables

PGDLLIMPORT TimestampTz PgStartTime
 
PGDLLIMPORT TimestampTz PgReloadTime
 

Macro Definition Documentation

◆ INTERVAL_FULL_PRECISION

#define INTERVAL_FULL_PRECISION   (0xFFFF)

Definition at line 78 of file timestamp.h.

◆ INTERVAL_FULL_RANGE

#define INTERVAL_FULL_RANGE   (0x7FFF)

Definition at line 76 of file timestamp.h.

◆ INTERVAL_MASK

#define INTERVAL_MASK (   b)    (1 << (b))

Definition at line 73 of file timestamp.h.

◆ INTERVAL_PRECISION

#define INTERVAL_PRECISION (   t)    ((t) & INTERVAL_PRECISION_MASK)

Definition at line 81 of file timestamp.h.

◆ INTERVAL_PRECISION_MASK

#define INTERVAL_PRECISION_MASK   (0xFFFF)

Definition at line 79 of file timestamp.h.

◆ INTERVAL_RANGE

#define INTERVAL_RANGE (   t)    (((t) >> 16) & INTERVAL_RANGE_MASK)

Definition at line 82 of file timestamp.h.

◆ INTERVAL_RANGE_MASK

#define INTERVAL_RANGE_MASK   (0x7FFF)

Definition at line 77 of file timestamp.h.

◆ INTERVAL_TYPMOD

#define INTERVAL_TYPMOD (   p,
 
)    ((((r) & INTERVAL_RANGE_MASK) << 16) | ((p) & INTERVAL_PRECISION_MASK))

Definition at line 80 of file timestamp.h.

◆ PG_GETARG_INTERVAL_P

#define PG_GETARG_INTERVAL_P (   n)    DatumGetIntervalP(PG_GETARG_DATUM(n))

Definition at line 65 of file timestamp.h.

◆ PG_GETARG_TIMESTAMP

#define PG_GETARG_TIMESTAMP (   n)    DatumGetTimestamp(PG_GETARG_DATUM(n))

Definition at line 63 of file timestamp.h.

◆ PG_GETARG_TIMESTAMPTZ

#define PG_GETARG_TIMESTAMPTZ (   n)    DatumGetTimestampTz(PG_GETARG_DATUM(n))

Definition at line 64 of file timestamp.h.

◆ PG_RETURN_INTERVAL_P

#define PG_RETURN_INTERVAL_P (   x)    return IntervalPGetDatum(x)

Definition at line 69 of file timestamp.h.

◆ PG_RETURN_TIMESTAMP

#define PG_RETURN_TIMESTAMP (   x)    return TimestampGetDatum(x)

Definition at line 67 of file timestamp.h.

◆ PG_RETURN_TIMESTAMPTZ

#define PG_RETURN_TIMESTAMPTZ (   x)    return TimestampTzGetDatum(x)

Definition at line 68 of file timestamp.h.

◆ TIMESTAMP_MASK

#define TIMESTAMP_MASK (   b)    (1 << (b))

Definition at line 72 of file timestamp.h.

◆ timestamptz_cmp_internal

#define timestamptz_cmp_internal (   dt1,
  dt2 
)    timestamp_cmp_internal(dt1, dt2)

Definition at line 127 of file timestamp.h.

◆ TimestampTzPlusMilliseconds

#define TimestampTzPlusMilliseconds (   tz,
  ms 
)    ((tz) + ((ms) * (int64) 1000))

Definition at line 85 of file timestamp.h.

◆ TimestampTzPlusSeconds

#define TimestampTzPlusSeconds (   tz,
 
)    ((tz) + ((s) * (int64) 1000000))

Definition at line 86 of file timestamp.h.

Function Documentation

◆ date2isoweek()

int date2isoweek ( int  year,
int  mon,
int  mday 
)

Definition at line 4518 of file timestamp.c.

4519 {
4520  float8 result;
4521  int day0,
4522  day4,
4523  dayn;
4524 
4525  /* current day */
4526  dayn = date2j(year, mon, mday);
4527 
4528  /* fourth day of current year */
4529  day4 = date2j(year, 1, 4);
4530 
4531  /* day0 == offset to first day of week (Monday) */
4532  day0 = j2day(day4 - 1);
4533 
4534  /*
4535  * We need the first week containing a Thursday, otherwise this day falls
4536  * into the previous year for purposes of counting weeks
4537  */
4538  if (dayn < day4 - day0)
4539  {
4540  day4 = date2j(year - 1, 1, 4);
4541 
4542  /* day0 == offset to first day of week (Monday) */
4543  day0 = j2day(day4 - 1);
4544  }
4545 
4546  result = (dayn - (day4 - day0)) / 7 + 1;
4547 
4548  /*
4549  * Sometimes the last few days in a year will fall into the first week of
4550  * the next year, so check for this.
4551  */
4552  if (result >= 52)
4553  {
4554  day4 = date2j(year + 1, 1, 4);
4555 
4556  /* day0 == offset to first day of week (Monday) */
4557  day0 = j2day(day4 - 1);
4558 
4559  if (dayn >= day4 - day0)
4560  result = (dayn - (day4 - day0)) / 7 + 1;
4561  }
4562 
4563  return (int) result;
4564 }
int j2day(int date)
Definition: datetime.c:346
int date2j(int year, int month, int day)
Definition: datetime.c:288
double float8
Definition: c.h:614

References date2j(), and j2day().

Referenced by DCH_to_char(), extract_date(), timestamp_part_common(), timestamp_trunc(), timestamptz_part_common(), and timestamptz_trunc_internal().

◆ date2isoyear()

int date2isoyear ( int  year,
int  mon,
int  mday 
)

Definition at line 4573 of file timestamp.c.

4574 {
4575  float8 result;
4576  int day0,
4577  day4,
4578  dayn;
4579 
4580  /* current day */
4581  dayn = date2j(year, mon, mday);
4582 
4583  /* fourth day of current year */
4584  day4 = date2j(year, 1, 4);
4585 
4586  /* day0 == offset to first day of week (Monday) */
4587  day0 = j2day(day4 - 1);
4588 
4589  /*
4590  * We need the first week containing a Thursday, otherwise this day falls
4591  * into the previous year for purposes of counting weeks
4592  */
4593  if (dayn < day4 - day0)
4594  {
4595  day4 = date2j(year - 1, 1, 4);
4596 
4597  /* day0 == offset to first day of week (Monday) */
4598  day0 = j2day(day4 - 1);
4599 
4600  year--;
4601  }
4602 
4603  result = (dayn - (day4 - day0)) / 7 + 1;
4604 
4605  /*
4606  * Sometimes the last few days in a year will fall into the first week of
4607  * the next year, so check for this.
4608  */
4609  if (result >= 52)
4610  {
4611  day4 = date2j(year + 1, 1, 4);
4612 
4613  /* day0 == offset to first day of week (Monday) */
4614  day0 = j2day(day4 - 1);
4615 
4616  if (dayn >= day4 - day0)
4617  year++;
4618  }
4619 
4620  return year;
4621 }

References date2j(), and j2day().

Referenced by date2isoyearday(), DCH_to_char(), extract_date(), timestamp_part_common(), and timestamptz_part_common().

◆ date2isoyearday()

int date2isoyearday ( int  year,
int  mon,
int  mday 
)

Definition at line 4630 of file timestamp.c.

4631 {
4632  return date2j(year, mon, mday) - isoweek2j(date2isoyear(year, mon, mday), 1) + 1;
4633 }
int isoweek2j(int year, int week)
Definition: timestamp.c:4467
int date2isoyear(int year, int mon, int mday)
Definition: timestamp.c:4573

References date2isoyear(), date2j(), and isoweek2j().

Referenced by DCH_to_char().

◆ DatumGetIntervalP()

◆ DatumGetTimestamp()

static Timestamp DatumGetTimestamp ( Datum  X)
inlinestatic

◆ DatumGetTimestampTz()

static TimestampTz DatumGetTimestampTz ( Datum  X)
inlinestatic

◆ dt2time()

void dt2time ( Timestamp  jd,
int *  hour,
int *  min,
int *  sec,
fsec_t fsec 
)

Definition at line 1811 of file timestamp.c.

1812 {
1813  TimeOffset time;
1814 
1815  time = jd;
1816 
1817  *hour = time / USECS_PER_HOUR;
1818  time -= (*hour) * USECS_PER_HOUR;
1819  *min = time / USECS_PER_MINUTE;
1820  time -= (*min) * USECS_PER_MINUTE;
1821  *sec = time / USECS_PER_SEC;
1822  *fsec = time - (*sec * USECS_PER_SEC);
1823 } /* dt2time() */
#define USECS_PER_HOUR
Definition: timestamp.h:131
#define USECS_PER_SEC
Definition: timestamp.h:133
#define USECS_PER_MINUTE
Definition: timestamp.h:132
int64 TimeOffset
Definition: timestamp.h:40

References USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by DecodeDateTime(), DecodeTimeOnly(), and timestamp2tm().

◆ GetCurrentTimestamp()

TimestampTz GetCurrentTimestamp ( void  )

Definition at line 1582 of file timestamp.c.

1583 {
1584  TimestampTz result;
1585  struct timeval tp;
1586 
1587  gettimeofday(&tp, NULL);
1588 
1589  result = (TimestampTz) tp.tv_sec -
1591  result = (result * USECS_PER_SEC) + tp.tv_usec;
1592 
1593  return result;
1594 }
#define UNIX_EPOCH_JDATE
Definition: timestamp.h:208
#define SECS_PER_DAY
Definition: timestamp.h:125
#define POSTGRES_EPOCH_JDATE
Definition: timestamp.h:209
int gettimeofday(struct timeval *tp, void *tzp)

References gettimeofday(), POSTGRES_EPOCH_JDATE, SECS_PER_DAY, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

Referenced by ApplyLauncherMain(), ApplyWorkerMain(), asyncQueueFillWarning(), autoprewarm_main(), AutoVacLauncherMain(), BackgroundWriterMain(), bbsink_copystream_archive_contents(), bbsink_copystream_end_archive(), bbsink_copystream_new(), bbsink_throttle_begin_backup(), check_log_duration(), CheckPointGuts(), CleanupBackgroundWorker(), clock_timestamp(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), CreateOverwriteContrecordRecord(), CreateRestartPoint(), DetermineSleepTime(), disable_timeout(), disable_timeouts(), do_analyze_rel(), do_start_bgworker(), do_start_worker(), enable_startup_progress_timeout(), enable_timeout_after(), enable_timeout_at(), enable_timeout_every(), enable_timeouts(), entry_reset(), get_role_password(), GetCurrentTransactionStopTimestamp(), GetReplicationApplyDelay(), GetSnapshotCurrentTimestamp(), handle_sig_alarm(), has_startup_progress_timeout_expired(), heap_vacuum_rel(), initialize_drandom_seed(), InitProcessGlobals(), KnownAssignedXidsCompress(), launcher_determine_sleep(), LockBufferForCleanup(), log_disconnections(), LogCheckpointEnd(), logicalrep_worker_launch(), LogicalRepApplyLoop(), maybe_start_bgworkers(), pa_send_data(), PerformWalRecovery(), pgfdw_cancel_query(), pgfdw_exec_cleanup_query(), pgfdw_get_cleanup_result(), pgss_shmem_startup(), pgstat_build_snapshot(), pgstat_report_activity(), pgstat_report_analyze(), pgstat_report_archiver(), pgstat_report_autovac(), pgstat_report_checksum_failures_in_db(), pgstat_report_vacuum(), pgstat_reset(), pgstat_reset_after_failure(), pgstat_reset_counters(), pgstat_reset_of_kind(), pgstat_reset_slru(), PostgresSingleUserMain(), PostmasterMain(), PrepareTransaction(), process_syncing_tables_for_apply(), ProcessConfigFileInternal(), ProcessPendingWrites(), ProcessRepliesIfAny(), ProcessStandbyReplyMessage(), ProcessWalSndrMessage(), ProcSleep(), rebuild_database_list(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommitPrepared(), recoveryApplyDelay(), reschedule_timeouts(), ResolveRecoveryConflictWithBufferPin(), ResolveRecoveryConflictWithLock(), ResolveRecoveryConflictWithVirtualXIDs(), send_feedback(), SetCurrentStatementStartTimestamp(), StartTransaction(), test_pattern(), throttle(), UpdateWorkerStats(), WaitExceedsMaxStandbyDelay(), WaitForWALToBecomeAvailable(), WalReceiverMain(), WalSndKeepalive(), WalSndLoop(), WalSndUpdateProgress(), WalSndWaitForWal(), WalSndWriteData(), XLogBackgroundFlush(), XLogFileRead(), XLogPrefetchResetStats(), XLogPrefetchShmemInit(), XLogRestorePoint(), XLogSendPhysical(), XLogWalRcvSendHSFeedback(), and XLogWalRcvSendReply().

◆ GetEpochTime()

void GetEpochTime ( struct pg_tm tm)

Definition at line 2091 of file timestamp.c.

2092 {
2093  struct pg_tm *t0;
2094  pg_time_t epoch = 0;
2095 
2096  t0 = pg_gmtime(&epoch);
2097 
2098  if (t0 == NULL)
2099  elog(ERROR, "could not convert epoch to timestamp: %m");
2100 
2101  tm->tm_year = t0->tm_year;
2102  tm->tm_mon = t0->tm_mon;
2103  tm->tm_mday = t0->tm_mday;
2104  tm->tm_hour = t0->tm_hour;
2105  tm->tm_min = t0->tm_min;
2106  tm->tm_sec = t0->tm_sec;
2107 
2108  tm->tm_year += 1900;
2109  tm->tm_mon++;
2110 }
#define ERROR
Definition: elog.h:39
static struct pg_tm tm
Definition: localtime.c:104
struct pg_tm * pg_gmtime(const pg_time_t *timep)
Definition: localtime.c:1389
int64 pg_time_t
Definition: pgtime.h:23
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
static const unsigned __int64 epoch

References elog(), epoch, ERROR, pg_gmtime(), tm, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, and pg_tm::tm_year.

Referenced by date_in(), PGTYPESdate_from_asc(), and SetEpochTimestamp().

◆ interval2itm()

void interval2itm ( Interval  span,
struct pg_itm itm 
)

Definition at line 1984 of file timestamp.c.

1985 {
1986  TimeOffset time;
1987  TimeOffset tfrac;
1988 
1989  itm->tm_year = span.month / MONTHS_PER_YEAR;
1990  itm->tm_mon = span.month % MONTHS_PER_YEAR;
1991  itm->tm_mday = span.day;
1992  time = span.time;
1993 
1994  tfrac = time / USECS_PER_HOUR;
1995  time -= tfrac * USECS_PER_HOUR;
1996  itm->tm_hour = tfrac;
1997  tfrac = time / USECS_PER_MINUTE;
1998  time -= tfrac * USECS_PER_MINUTE;
1999  itm->tm_min = (int) tfrac;
2000  tfrac = time / USECS_PER_SEC;
2001  time -= tfrac * USECS_PER_SEC;
2002  itm->tm_sec = (int) tfrac;
2003  itm->tm_usec = (int) time;
2004 }
#define MONTHS_PER_YEAR
Definition: timestamp.h:108
int32 day
Definition: timestamp.h:51
int32 month
Definition: timestamp.h:52
TimeOffset time
Definition: timestamp.h:49
int64 tm_hour
Definition: timestamp.h:70
int tm_year
Definition: timestamp.h:73
int tm_mon
Definition: timestamp.h:72
int tm_mday
Definition: timestamp.h:71
int tm_sec
Definition: timestamp.h:68
int tm_min
Definition: timestamp.h:69
int tm_usec
Definition: timestamp.h:67

References Interval::day, Interval::month, MONTHS_PER_YEAR, Interval::time, pg_itm::tm_hour, pg_itm::tm_mday, pg_itm::tm_min, pg_itm::tm_mon, pg_itm::tm_sec, pg_itm::tm_usec, pg_itm::tm_year, USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by interval_out(), interval_part_common(), interval_to_char(), and interval_trunc().

◆ IntervalPGetDatum()

◆ isoweek2date()

void isoweek2date ( int  woy,
int *  year,
int *  mon,
int *  mday 
)

Definition at line 4487 of file timestamp.c.

4488 {
4489  j2date(isoweek2j(*year, woy), year, mon, mday);
4490 }
void j2date(int jd, int *year, int *month, int *day)
Definition: datetime.c:313

References isoweek2j(), and j2date().

Referenced by do_to_timestamp(), timestamp_trunc(), and timestamptz_trunc_internal().

◆ isoweek2j()

int isoweek2j ( int  year,
int  week 
)

Definition at line 4467 of file timestamp.c.

4468 {
4469  int day0,
4470  day4;
4471 
4472  /* fourth day of current year */
4473  day4 = date2j(year, 1, 4);
4474 
4475  /* day0 == offset to first day of week (Monday) */
4476  day0 = j2day(day4 - 1);
4477 
4478  return ((week - 1) * 7) + (day4 - day0);
4479 }

References date2j(), and j2day().

Referenced by date2isoyearday(), do_to_timestamp(), isoweek2date(), and isoweekdate2date().

◆ isoweekdate2date()

void isoweekdate2date ( int  isoweek,
int  wday,
int *  year,
int *  mon,
int *  mday 
)

Definition at line 4500 of file timestamp.c.

4501 {
4502  int jday;
4503 
4504  jday = isoweek2j(*year, isoweek);
4505  /* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */
4506  if (wday > 1)
4507  jday += wday - 2;
4508  else
4509  jday += 6;
4510  j2date(jday, year, mon, mday);
4511 }

References isoweek2j(), and j2date().

Referenced by do_to_timestamp().

◆ itm2interval()

int itm2interval ( struct pg_itm itm,
Interval span 
)

Definition at line 2011 of file timestamp.c.

2012 {
2013  int64 total_months = (int64) itm->tm_year * MONTHS_PER_YEAR + itm->tm_mon;
2014 
2015  if (total_months > INT_MAX || total_months < INT_MIN)
2016  return -1;
2017  span->month = (int32) total_months;
2018  span->day = itm->tm_mday;
2020  &span->time))
2021  return -1;
2022  /* tm_min, tm_sec are 32 bits, so intermediate products can't overflow */
2023  if (pg_add_s64_overflow(span->time, itm->tm_min * USECS_PER_MINUTE,
2024  &span->time))
2025  return -1;
2026  if (pg_add_s64_overflow(span->time, itm->tm_sec * USECS_PER_SEC,
2027  &span->time))
2028  return -1;
2029  if (pg_add_s64_overflow(span->time, itm->tm_usec,
2030  &span->time))
2031  return -1;
2032  return 0;
2033 }
signed int int32
Definition: c.h:478
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:215
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:161
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:77

References Interval::day, if(), Interval::month, MONTHS_PER_YEAR, pg_add_s64_overflow(), pg_mul_s64_overflow(), Interval::time, pg_itm::tm_hour, pg_itm::tm_mday, pg_itm::tm_min, pg_itm::tm_mon, pg_itm::tm_sec, pg_itm::tm_usec, pg_itm::tm_year, USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

Referenced by interval_trunc(), timestamp_age(), and timestamptz_age().

◆ itmin2interval()

int itmin2interval ( struct pg_itm_in itm_in,
Interval span 
)

Definition at line 2040 of file timestamp.c.

2041 {
2042  int64 total_months = (int64) itm_in->tm_year * MONTHS_PER_YEAR + itm_in->tm_mon;
2043 
2044  if (total_months > INT_MAX || total_months < INT_MIN)
2045  return -1;
2046  span->month = (int32) total_months;
2047  span->day = itm_in->tm_mday;
2048  span->time = itm_in->tm_usec;
2049  return 0;
2050 }
int tm_mon
Definition: timestamp.h:86
int tm_year
Definition: timestamp.h:87
int tm_mday
Definition: timestamp.h:85
int64 tm_usec
Definition: timestamp.h:84

References Interval::day, if(), Interval::month, MONTHS_PER_YEAR, Interval::time, pg_itm_in::tm_mday, pg_itm_in::tm_mon, pg_itm_in::tm_usec, and pg_itm_in::tm_year.

Referenced by interval_in(), and pg_timezone_abbrevs().

◆ SetEpochTimestamp()

Timestamp SetEpochTimestamp ( void  )

Definition at line 2113 of file timestamp.c.

2114 {
2115  Timestamp dt;
2116  struct pg_tm tt,
2117  *tm = &tt;
2118 
2119  GetEpochTime(tm);
2120  /* we don't bother to test for failure ... */
2121  tm2timestamp(tm, 0, NULL, &dt);
2122 
2123  return dt;
2124 } /* SetEpochTimestamp() */
void GetEpochTime(struct pg_tm *tm)
Definition: timestamp.c:2091
int tm2timestamp(struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result)
Definition: timestamp.c:1934

References GetEpochTime(), tm, and tm2timestamp().

Referenced by dttofmtasc_replace(), PGTYPEStimestamp_from_asc(), timestamp_in(), timestamp_part_common(), timestamptz_in(), and timestamptz_part_common().

◆ time_t_to_timestamptz()

TimestampTz time_t_to_timestamptz ( pg_time_t  tm)

Definition at line 1748 of file timestamp.c.

1749 {
1750  TimestampTz result;
1751 
1752  result = (TimestampTz) tm -
1754  result *= USECS_PER_SEC;
1755 
1756  return result;
1757 }

References POSTGRES_EPOCH_JDATE, SECS_PER_DAY, tm, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

Referenced by pg_control_checkpoint(), pg_control_system(), pg_ls_dir_files(), and pg_stat_file().

◆ timestamp2timestamptz_opt_overflow()

TimestampTz timestamp2timestamptz_opt_overflow ( Timestamp  timestamp,
int *  overflow 
)

Definition at line 5569 of file timestamp.c.

5570 {
5571  TimestampTz result;
5572  struct pg_tm tt,
5573  *tm = &tt;
5574  fsec_t fsec;
5575  int tz;
5576 
5577  if (overflow)
5578  *overflow = 0;
5579 
5581  return timestamp;
5582 
5583  /* We don't expect this to fail, but check it pro forma */
5584  if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
5585  {
5587 
5588  result = dt2local(timestamp, -tz);
5589 
5590  if (IS_VALID_TIMESTAMP(result))
5591  {
5592  return result;
5593  }
5594  else if (overflow)
5595  {
5596  if (result < MIN_TIMESTAMP)
5597  {
5598  *overflow = -1;
5599  TIMESTAMP_NOBEGIN(result);
5600  }
5601  else
5602  {
5603  *overflow = 1;
5604  TIMESTAMP_NOEND(result);
5605  }
5606  return result;
5607  }
5608  }
5609 
5610  ereport(ERROR,
5611  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
5612  errmsg("timestamp out of range")));
5613 
5614  return 0;
5615 }
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition: datetime.c:1587
static Timestamp dt2local(Timestamp dt, int timezone)
Definition: timestamp.c:2059
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
Definition: timestamp.c:1838
int32 fsec_t
Definition: timestamp.h:41
#define TIMESTAMP_NOBEGIN(j)
Definition: timestamp.h:158
#define IS_VALID_TIMESTAMP(t)
Definition: timestamp.h:241
#define TIMESTAMP_NOT_FINITE(j)
Definition: timestamp.h:168
#define TIMESTAMP_NOEND(j)
Definition: timestamp.h:163
#define MIN_TIMESTAMP
Definition: timestamp.h:230
int errcode(int sqlerrcode)
Definition: elog.c:858
int errmsg(const char *fmt,...)
Definition: elog.c:1069
#define ereport(elevel,...)
Definition: elog.h:149
PGDLLIMPORT pg_tz * session_timezone
Definition: pgtz.c:28
int64 timestamp

References DetermineTimeZoneOffset(), dt2local(), ereport, errcode(), errmsg(), ERROR, IS_VALID_TIMESTAMP, MIN_TIMESTAMP, session_timezone, timestamp2tm(), TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, TIMESTAMP_NOT_FINITE, and tm.

Referenced by timestamp2timestamptz(), and timestamp_cmp_timestamptz_internal().

◆ timestamp2tm()

int timestamp2tm ( Timestamp  dt,
int *  tzp,
struct pg_tm tm,
fsec_t fsec,
const char **  tzn,
pg_tz attimezone 
)

Definition at line 1838 of file timestamp.c.

1839 {
1840  Timestamp date;
1841  Timestamp time;
1842  pg_time_t utime;
1843 
1844  /* Use session timezone if caller asks for default */
1845  if (attimezone == NULL)
1846  attimezone = session_timezone;
1847 
1848  time = dt;
1849  TMODULO(time, date, USECS_PER_DAY);
1850 
1851  if (time < INT64CONST(0))
1852  {
1853  time += USECS_PER_DAY;
1854  date -= 1;
1855  }
1856 
1857  /* add offset to go from J2000 back to standard Julian date */
1859 
1860  /* Julian day routine does not work for negative Julian days */
1861  if (date < 0 || date > (Timestamp) INT_MAX)
1862  return -1;
1863 
1864  j2date((int) date, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
1865  dt2time(time, &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
1866 
1867  /* Done if no TZ conversion wanted */
1868  if (tzp == NULL)
1869  {
1870  tm->tm_isdst = -1;
1871  tm->tm_gmtoff = 0;
1872  tm->tm_zone = NULL;
1873  if (tzn != NULL)
1874  *tzn = NULL;
1875  return 0;
1876  }
1877 
1878  /*
1879  * If the time falls within the range of pg_time_t, use pg_localtime() to
1880  * rotate to the local time zone.
1881  *
1882  * First, convert to an integral timestamp, avoiding possibly
1883  * platform-specific roundoff-in-wrong-direction errors, and adjust to
1884  * Unix epoch. Then see if we can convert to pg_time_t without loss. This
1885  * coding avoids hardwiring any assumptions about the width of pg_time_t,
1886  * so it should behave sanely on machines without int64.
1887  */
1888  dt = (dt - *fsec) / USECS_PER_SEC +
1890  utime = (pg_time_t) dt;
1891  if ((Timestamp) utime == dt)
1892  {
1893  struct pg_tm *tx = pg_localtime(&utime, attimezone);
1894 
1895  tm->tm_year = tx->tm_year + 1900;
1896  tm->tm_mon = tx->tm_mon + 1;
1897  tm->tm_mday = tx->tm_mday;
1898  tm->tm_hour = tx->tm_hour;
1899  tm->tm_min = tx->tm_min;
1900  tm->tm_sec = tx->tm_sec;
1901  tm->tm_isdst = tx->tm_isdst;
1902  tm->tm_gmtoff = tx->tm_gmtoff;
1903  tm->tm_zone = tx->tm_zone;
1904  *tzp = -tm->tm_gmtoff;
1905  if (tzn != NULL)
1906  *tzn = tm->tm_zone;
1907  }
1908  else
1909  {
1910  /*
1911  * When out of range of pg_time_t, treat as GMT
1912  */
1913  *tzp = 0;
1914  /* Mark this as *no* time zone available */
1915  tm->tm_isdst = -1;
1916  tm->tm_gmtoff = 0;
1917  tm->tm_zone = NULL;
1918  if (tzn != NULL)
1919  *tzn = NULL;
1920  }
1921 
1922  return 0;
1923 }
void dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
Definition: timestamp.c:1811
#define USECS_PER_DAY
Definition: timestamp.h:130
#define TMODULO(t, q, u)
Definition: datetime.h:248
struct pg_tm * pg_localtime(const pg_time_t *timep, const pg_tz *tz)
Definition: localtime.c:1344
long date
Definition: pgtypes_date.h:9
const char * tm_zone
Definition: pgtime.h:46
int tm_isdst
Definition: pgtime.h:44
long int tm_gmtoff
Definition: pgtime.h:45

References dt2time(), j2date(), pg_localtime(), POSTGRES_EPOCH_JDATE, SECS_PER_DAY, session_timezone, tm, pg_tm::tm_gmtoff, pg_tm::tm_hour, pg_tm::tm_isdst, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, pg_tm::tm_year, pg_tm::tm_zone, TMODULO, UNIX_EPOCH_JDATE, USECS_PER_DAY, and USECS_PER_SEC.

Referenced by DetermineTimeZoneAbbrevOffsetTS(), GetCurrentTimeUsec(), JsonEncodeDateTime(), make_timestamptz_at_timezone(), map_sql_value_to_xml_value(), PGTYPEStimestamp_add_interval(), PGTYPEStimestamp_fmt_asc(), PGTYPEStimestamp_to_asc(), timestamp2timestamptz_opt_overflow(), timestamp_age(), timestamp_date(), timestamp_out(), timestamp_part_common(), timestamp_pl_interval(), timestamp_recv(), timestamp_time(), timestamp_to_char(), timestamp_trunc(), timestamp_zone(), timestamptz2timestamp(), timestamptz_age(), timestamptz_date(), timestamptz_out(), timestamptz_part_common(), timestamptz_pl_interval_internal(), timestamptz_recv(), timestamptz_time(), timestamptz_timetz(), timestamptz_to_char(), timestamptz_to_str(), timestamptz_trunc_internal(), timestamptz_zone(), and timetz_zone().

◆ timestamp_cmp_internal()

int timestamp_cmp_internal ( Timestamp  dt1,
Timestamp  dt2 
)

◆ timestamp_cmp_timestamptz_internal()

int32 timestamp_cmp_timestamptz_internal ( Timestamp  timestampVal,
TimestampTz  dt2 
)

Definition at line 2248 of file timestamp.c.

2249 {
2250  TimestampTz dt1;
2251  int overflow;
2252 
2253  dt1 = timestamp2timestamptz_opt_overflow(timestampVal, &overflow);
2254  if (overflow > 0)
2255  {
2256  /* dt1 is larger than any finite timestamp, but less than infinity */
2257  return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
2258  }
2259  if (overflow < 0)
2260  {
2261  /* dt1 is less than any finite timestamp, but more than -infinity */
2262  return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
2263  }
2264 
2265  return timestamptz_cmp_internal(dt1, dt2);
2266 }
TimestampTz timestamp2timestamptz_opt_overflow(Timestamp timestamp, int *overflow)
Definition: timestamp.c:5569
#define TIMESTAMP_IS_NOEND(j)
Definition: timestamp.h:166
#define TIMESTAMP_IS_NOBEGIN(j)
Definition: timestamp.h:161
#define timestamptz_cmp_internal(dt1, dt2)
Definition: timestamp.h:127

References timestamp2timestamptz_opt_overflow(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, and timestamptz_cmp_internal.

Referenced by cmpTimestampToTimestampTz(), timestamp_cmp_timestamptz(), timestamp_eq_timestamptz(), timestamp_ge_timestamptz(), timestamp_gt_timestamptz(), timestamp_le_timestamptz(), timestamp_lt_timestamptz(), timestamp_ne_timestamptz(), timestamptz_cmp_timestamp(), timestamptz_eq_timestamp(), timestamptz_ge_timestamp(), timestamptz_gt_timestamp(), timestamptz_le_timestamp(), timestamptz_lt_timestamp(), and timestamptz_ne_timestamp().

◆ TimestampDifference()

void TimestampDifference ( TimestampTz  start_time,
TimestampTz  stop_time,
long *  secs,
int *  microsecs 
)

Definition at line 1667 of file timestamp.c.

1669 {
1670  TimestampTz diff = stop_time - start_time;
1671 
1672  if (diff <= 0)
1673  {
1674  *secs = 0;
1675  *microsecs = 0;
1676  }
1677  else
1678  {
1679  *secs = (long) (diff / USECS_PER_SEC);
1680  *microsecs = (int) (diff % USECS_PER_SEC);
1681  }
1682 }
static time_t start_time
Definition: pg_ctl.c:94

References start_time, and USECS_PER_SEC.

Referenced by check_log_duration(), has_startup_progress_timeout_expired(), heap_vacuum_rel(), launcher_determine_sleep(), log_disconnections(), LogRecoveryConflict(), pgstat_report_activity(), pgstat_update_dbstats(), ProcSleep(), and schedule_alarm().

◆ TimestampDifferenceExceeds()

◆ TimestampDifferenceMilliseconds()

long TimestampDifferenceMilliseconds ( TimestampTz  start_time,
TimestampTz  stop_time 
)

Definition at line 1703 of file timestamp.c.

1704 {
1705  TimestampTz diff;
1706 
1707  /* Deal with zero or negative elapsed time quickly. */
1708  if (start_time >= stop_time)
1709  return 0;
1710  /* To not fail with timestamp infinities, we must detect overflow. */
1711  if (pg_sub_s64_overflow(stop_time, start_time, &diff))
1712  return (long) INT_MAX;
1713  if (diff >= (INT_MAX * INT64CONST(1000) - 999))
1714  return (long) INT_MAX;
1715  else
1716  return (long) ((diff + 999) / 1000);
1717 }
static bool pg_sub_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:188

References pg_sub_s64_overflow(), and start_time.

Referenced by ApplyLauncherMain(), autoprewarm_main(), bbsink_copystream_archive_contents(), DetermineSleepTime(), do_analyze_rel(), GetReplicationApplyDelay(), GetReplicationTransferLatency(), LogCheckpointEnd(), pgfdw_get_cleanup_result(), recoveryApplyDelay(), WaitForWALToBecomeAvailable(), WalReceiverMain(), and WalSndComputeSleeptime().

◆ TimestampGetDatum()

static Datum TimestampGetDatum ( Timestamp  X)
inlinestatic

◆ TimestampTimestampTzRequiresRewrite()

bool TimestampTimestampTzRequiresRewrite ( void  )

Definition at line 5538 of file timestamp.c.

5539 {
5540  long offset;
5541 
5542  if (pg_get_timezone_offset(session_timezone, &offset) && offset == 0)
5543  return false;
5544  return true;
5545 }
bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff)
Definition: localtime.c:1851

References pg_get_timezone_offset(), and session_timezone.

Referenced by ATColumnChangeRequiresRewrite().

◆ timestamptz_to_str()

const char* timestamptz_to_str ( TimestampTz  t)

Definition at line 1790 of file timestamp.c.

1791 {
1792  static char buf[MAXDATELEN + 1];
1793  int tz;
1794  struct pg_tm tt,
1795  *tm = &tt;
1796  fsec_t fsec;
1797  const char *tzn;
1798 
1799  if (TIMESTAMP_NOT_FINITE(t))
1801  else if (timestamp2tm(t, &tz, tm, &fsec, &tzn, NULL) == 0)
1802  EncodeDateTime(tm, fsec, true, tz, tzn, USE_ISO_DATES, buf);
1803  else
1804  strlcpy(buf, "(timestamp out of range)", sizeof(buf));
1805 
1806  return buf;
1807 }
void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
Definition: datetime.c:4217
void EncodeSpecialTimestamp(Timestamp dt, char *str)
Definition: timestamp.c:1535
#define MAXDATELEN
Definition: datetime.h:200
#define USE_ISO_DATES
Definition: miscadmin.h:230
static char * buf
Definition: pg_test_fsync.c:67
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45

References buf, EncodeDateTime(), EncodeSpecialTimestamp(), MAXDATELEN, snprintf, strlcpy(), timestamp2tm(), TIMESTAMP_NOT_FINITE, timestamptz_to_time_t(), tm, USE_ISO_DATES, and USECS_PER_SEC.

Referenced by CreateRestartPoint(), getRecoveryStopReason(), InitWalRecovery(), PerformWalRecovery(), pg_decode_commit_prepared_txn(), pg_decode_commit_txn(), pg_decode_prepare_txn(), pg_decode_rollback_prepared_txn(), pg_decode_stream_commit(), pg_decode_stream_prepare(), ProcessStandbyHSFeedbackMessage(), ProcessStandbyReplyMessage(), ProcessWalSndrMessage(), recoveryStopsAfter(), recoveryStopsBefore(), xact_desc_abort(), xact_desc_commit(), xact_desc_prepare(), xlog_desc(), and xlogrecovery_redo().

◆ timestamptz_to_time_t()

pg_time_t timestamptz_to_time_t ( TimestampTz  t)

Definition at line 1770 of file timestamp.c.

1771 {
1772  pg_time_t result;
1773 
1774  result = (pg_time_t) (t / USECS_PER_SEC +
1776 
1777  return result;
1778 }

References POSTGRES_EPOCH_JDATE, SECS_PER_DAY, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

Referenced by DetermineTimeZoneAbbrevOffsetTS(), InitProcessGlobals(), and timestamptz_to_str().

◆ TimestampTzGetDatum()

◆ tm2timestamp()

int tm2timestamp ( struct pg_tm tm,
fsec_t  fsec,
int *  tzp,
Timestamp result 
)

Definition at line 1934 of file timestamp.c.

1935 {
1936  TimeOffset date;
1937  TimeOffset time;
1938 
1939  /* Prevent overflow in Julian-day routines */
1941  {
1942  *result = 0; /* keep compiler quiet */
1943  return -1;
1944  }
1945 
1947  time = time2t(tm->tm_hour, tm->tm_min, tm->tm_sec, fsec);
1948 
1949  *result = date * USECS_PER_DAY + time;
1950  /* check for major overflow */
1951  if ((*result - time) / USECS_PER_DAY != date)
1952  {
1953  *result = 0; /* keep compiler quiet */
1954  return -1;
1955  }
1956  /* check for just-barely overflow (okay except time-of-day wraps) */
1957  /* caution: we want to allow 1999-12-31 24:00:00 */
1958  if ((*result < 0 && date > 0) ||
1959  (*result > 0 && date < -1))
1960  {
1961  *result = 0; /* keep compiler quiet */
1962  return -1;
1963  }
1964  if (tzp != NULL)
1965  *result = dt2local(*result, -(*tzp));
1966 
1967  /* final range check catches just-out-of-range timestamps */
1968  if (!IS_VALID_TIMESTAMP(*result))
1969  {
1970  *result = 0; /* keep compiler quiet */
1971  return -1;
1972  }
1973 
1974  return 0;
1975 }
static TimeOffset time2t(const int hour, const int min, const int sec, const fsec_t fsec)
Definition: timestamp.c:2053
#define IS_VALID_JULIAN(y, m, d)
Definition: timestamp.h:201

References date2j(), dt2local(), IS_VALID_JULIAN, IS_VALID_TIMESTAMP, POSTGRES_EPOCH_JDATE, time2t(), 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, and USECS_PER_DAY.

Referenced by check_recovery_target_time(), parse_datetime(), PGTYPEStimestamp_add_interval(), PGTYPEStimestamp_current(), PGTYPEStimestamp_defmt_scan(), PGTYPEStimestamp_from_asc(), SetEpochTimestamp(), timestamp_in(), timestamp_pl_interval(), timestamp_trunc(), timestamp_zone(), timestamptz2timestamp(), timestamptz_in(), timestamptz_pl_interval_internal(), timestamptz_trunc_internal(), timestamptz_zone(), and to_timestamp().

Variable Documentation

◆ PgReloadTime

PGDLLIMPORT TimestampTz PgReloadTime
extern

Definition at line 56 of file timestamp.c.

Referenced by pg_conf_load_time(), and ProcessConfigFileInternal().

◆ PgStartTime

PGDLLIMPORT TimestampTz PgStartTime
extern

Definition at line 53 of file timestamp.c.

Referenced by pg_postmaster_start_time(), PostgresSingleUserMain(), and PostmasterMain().