PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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)
 
static uint64 TimestampDifferenceMicroseconds (TimestampTz start_time, TimestampTz stop_time)
 
int32 anytimestamp_typmod_check (bool istz, int32 typmod)
 
TimestampTz GetCurrentTimestamp (void)
 
TimestampTz GetSQLCurrentTimestamp (int32 typmod)
 
Timestamp GetSQLLocalTimestamp (int32 typmod)
 
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)
 
bool TimestampDifferenceExceedsSeconds (TimestampTz start_time, TimestampTz stop_time, int threshold_sec)
 
TimestampTz time_t_to_timestamptz (pg_time_t tm)
 
pg_time_t timestamptz_to_time_t (TimestampTz t)
 
const chartimestamptz_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_safe (Timestamp timestamp, Node *escontext)
 
Timestamp timestamptz2timestamp_safe (TimestampTz timestamp, Node *escontext)
 
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 143 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

◆ anytimestamp_typmod_check()

int32 anytimestamp_typmod_check ( bool  istz,
int32  typmod 
)
extern

Definition at line 116 of file timestamp.c.

117{
118 if (typmod < 0)
121 errmsg("TIMESTAMP(%d)%s precision must not be negative",
122 typmod, (istz ? " WITH TIME ZONE" : ""))));
123 if (typmod > MAX_TIMESTAMP_PRECISION)
124 {
127 errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
128 typmod, (istz ? " WITH TIME ZONE" : ""),
131 }
132
133 return typmod;
134}
#define MAX_TIMESTAMP_PRECISION
Definition timestamp.h:92
int errcode(int sqlerrcode)
Definition elog.c:874
#define WARNING
Definition elog.h:37
#define ERROR
Definition elog.h:40
#define ereport(elevel,...)
Definition elog.h:152
static char * errmsg
static int fb(int x)

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

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

◆ date2isoweek()

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

Definition at line 5289 of file timestamp.c.

5290{
5291 int day0,
5292 day4,
5293 dayn,
5294 week;
5295
5296 /* current day */
5297 dayn = date2j(year, mon, mday);
5298
5299 /* fourth day of current year */
5300 day4 = date2j(year, 1, 4);
5301
5302 /* day0 == offset to first day of week (Monday) */
5303 day0 = j2day(day4 - 1);
5304
5305 /*
5306 * We need the first week containing a Thursday, otherwise this day falls
5307 * into the previous year for purposes of counting weeks
5308 */
5309 if (dayn < day4 - day0)
5310 {
5311 day4 = date2j(year - 1, 1, 4);
5312
5313 /* day0 == offset to first day of week (Monday) */
5314 day0 = j2day(day4 - 1);
5315 }
5316
5317 week = (dayn - (day4 - day0)) / 7 + 1;
5318
5319 /*
5320 * Sometimes the last few days in a year will fall into the first week of
5321 * the next year, so check for this.
5322 */
5323 if (week >= 52)
5324 {
5325 day4 = date2j(year + 1, 1, 4);
5326
5327 /* day0 == offset to first day of week (Monday) */
5328 day0 = j2day(day4 - 1);
5329
5330 if (dayn >= day4 - day0)
5331 week = (dayn - (day4 - day0)) / 7 + 1;
5332 }
5333
5334 return week;
5335}
int j2day(int date)
Definition datetime.c:355
int date2j(int year, int month, int day)
Definition datetime.c:297

References date2j(), fb(), 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 
)
extern

Definition at line 5344 of file timestamp.c.

5345{
5346 int day0,
5347 day4,
5348 dayn,
5349 week;
5350
5351 /* current day */
5352 dayn = date2j(year, mon, mday);
5353
5354 /* fourth day of current year */
5355 day4 = date2j(year, 1, 4);
5356
5357 /* day0 == offset to first day of week (Monday) */
5358 day0 = j2day(day4 - 1);
5359
5360 /*
5361 * We need the first week containing a Thursday, otherwise this day falls
5362 * into the previous year for purposes of counting weeks
5363 */
5364 if (dayn < day4 - day0)
5365 {
5366 day4 = date2j(year - 1, 1, 4);
5367
5368 /* day0 == offset to first day of week (Monday) */
5369 day0 = j2day(day4 - 1);
5370
5371 year--;
5372 }
5373
5374 week = (dayn - (day4 - day0)) / 7 + 1;
5375
5376 /*
5377 * Sometimes the last few days in a year will fall into the first week of
5378 * the next year, so check for this.
5379 */
5380 if (week >= 52)
5381 {
5382 day4 = date2j(year + 1, 1, 4);
5383
5384 /* day0 == offset to first day of week (Monday) */
5385 day0 = j2day(day4 - 1);
5386
5387 if (dayn >= day4 - day0)
5388 year++;
5389 }
5390
5391 return year;
5392}

References date2j(), fb(), 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 
)
extern

Definition at line 5401 of file timestamp.c.

5402{
5403 return date2j(year, mon, mday) - isoweek2j(date2isoyear(year, mon, mday), 1) + 1;
5404}
int isoweek2j(int year, int week)
Definition timestamp.c:5238
int date2isoyear(int year, int mon, int mday)
Definition timestamp.c:5344

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

Referenced by DCH_to_char().

◆ DatumGetIntervalP()

◆ DatumGetTimestamp()

◆ DatumGetTimestampTz()

◆ dt2time()

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

Definition at line 1877 of file timestamp.c.

1878{
1879 TimeOffset time;
1880
1881 time = jd;
1882
1883 *hour = time / USECS_PER_HOUR;
1884 time -= (*hour) * USECS_PER_HOUR;
1885 *min = time / USECS_PER_MINUTE;
1886 time -= (*min) * USECS_PER_MINUTE;
1887 *sec = time / USECS_PER_SEC;
1888 *fsec = time - (*sec * USECS_PER_SEC);
1889} /* dt2time() */
#define USECS_PER_HOUR
Definition timestamp.h:132
#define USECS_PER_SEC
Definition timestamp.h:134
#define USECS_PER_MINUTE
Definition timestamp.h:133
int64 TimeOffset
Definition timestamp.h:40

References fb(), USECS_PER_HOUR, USECS_PER_MINUTE, and USECS_PER_SEC.

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

◆ GetCurrentTimestamp()

TimestampTz GetCurrentTimestamp ( void  )
extern

Definition at line 1639 of file timestamp.c.

1640{
1642 struct timeval tp;
1643
1644 gettimeofday(&tp, NULL);
1645
1646 result = (TimestampTz) tp.tv_sec -
1648 result = (result * USECS_PER_SEC) + tp.tv_usec;
1649
1650 return result;
1651}
uint32 result
#define UNIX_EPOCH_JDATE
Definition timestamp.h:234
#define SECS_PER_DAY
Definition timestamp.h:126
#define POSTGRES_EPOCH_JDATE
Definition timestamp.h:235
int gettimeofday(struct timeval *tp, void *tzp)

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

Referenced by ApplyLauncherMain(), asyncQueueFillWarning(), autoprewarm_main(), AutoVacLauncherMain(), BackendStartup(), BackgroundWriterMain(), bbsink_copystream_archive_contents(), bbsink_copystream_end_archive(), bbsink_copystream_new(), bbsink_throttle_begin_backup(), check_log_duration(), CheckPointGuts(), CleanupBackend(), clock_timestamp(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), CreateOverwriteContrecordRecord(), CreateRestartPoint(), dblink_cancel_query(), DetermineSleepTime(), disable_timeout(), disable_timeouts(), do_analyze_rel(), do_start_worker(), enable_startup_progress_timeout(), enable_timeout_after(), enable_timeout_at(), enable_timeout_every(), enable_timeouts(), entry_alloc(), entry_reset(), get_candidate_xid(), get_role_password(), GetCurrentTransactionStopTimestamp(), GetReplicationApplyDelay(), handle_sig_alarm(), has_startup_progress_timeout_expired(), heap_vacuum_rel(), initialize_prng(), InitProcessGlobals(), InvalidatePossiblyObsoleteSlot(), IoWorkerMain(), KnownAssignedXidsCompress(), launch_sync_worker(), launcher_determine_sleep(), libpqsrv_cancel(), LockBufferForCleanup(), log_disconnections(), LogCheckpointEnd(), logicalrep_worker_launch(), LogicalRepApplyLoop(), maybe_start_bgworkers(), maybe_start_io_workers(), pa_send_data(), PerformAuthentication(), PerformWalRecovery(), pg_promote(), pg_sleep(), pg_stash_advice_worker_main(), pgfdw_abort_cleanup_begin(), pgfdw_cancel_query(), pgfdw_exec_cleanup_query(), pgfdw_finish_abort_cleanup(), pgfdw_get_cleanup_result(), pgss_shmem_init(), pgstat_build_snapshot(), pgstat_report_activity(), pgstat_report_analyze(), pgstat_report_archiver(), pgstat_report_autovac(), pgstat_report_checksum_failures_in_db(), pgstat_report_replslotsync(), pgstat_report_stat(), pgstat_report_vacuum(), pgstat_reset(), pgstat_reset_after_failure(), pgstat_reset_counters(), pgstat_reset_of_kind(), pgstat_reset_slru(), PostgresMain(), PostgresSingleUserMain(), postmaster_child_launch(), PostmasterMain(), PrepareTransaction(), ProcessConfigFileInternal(), ProcessPendingWrites(), ProcessRepliesIfAny(), ProcessStandbyPSRequestMessage(), ProcessStandbyReplyMessage(), ProcessWalSndrMessage(), ProcSleep(), rebuild_database_list(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommitPrepared(), recoveryApplyDelay(), ReplicationSlotRelease(), request_publisher_status(), reschedule_timeouts(), ResolveRecoveryConflictWithBufferPin(), ResolveRecoveryConflictWithLock(), ResolveRecoveryConflictWithVirtualXIDs(), RestoreSlotFromDisk(), send_feedback(), SetCurrentStatementStartTimestamp(), SetupApplyOrSyncWorker(), should_stop_conflict_info_retention(), StartBackgroundWorker(), StartTransaction(), test_pattern(), test_random(), test_random_operations(), throttle(), update_synced_slots_inactive_since(), UpdateWorkerStats(), wait_for_local_flush(), WaitExceedsMaxStandbyDelay(), WaitForLSN(), WaitForWalSummarization(), WaitForWALToBecomeAvailable(), WalReceiverMain(), WalSndCheckShutdownTimeout(), WalSndKeepalive(), WalSndLoop(), WalSndUpdateProgress(), WalSndWaitForWal(), WalSndWriteData(), XLogBackgroundFlush(), XLogFileRead(), XLogPrefetchResetStats(), XLogPrefetchShmemInit(), XLogRestorePoint(), XLogSendPhysical(), XLogWalRcvSendHSFeedback(), and XLogWalRcvSendReply().

◆ GetEpochTime()

void GetEpochTime ( struct pg_tm tm)
extern

Definition at line 2162 of file timestamp.c.

2163{
2164 struct pg_tm *t0;
2165 pg_time_t epoch = 0;
2166
2167 t0 = pg_gmtime(&epoch);
2168
2169 if (t0 == NULL)
2170 elog(ERROR, "could not convert epoch to timestamp: %m");
2171
2172 tm->tm_year = t0->tm_year;
2173 tm->tm_mon = t0->tm_mon;
2174 tm->tm_mday = t0->tm_mday;
2175 tm->tm_hour = t0->tm_hour;
2176 tm->tm_min = t0->tm_min;
2177 tm->tm_sec = t0->tm_sec;
2178
2179 tm->tm_year += 1900;
2180 tm->tm_mon++;
2181}
#define elog(elevel,...)
Definition elog.h:228
static struct pg_tm tm
Definition localtime.c:104
int64 pg_time_t
Definition pgtime.h:23
struct pg_tm * pg_gmtime(const pg_time_t *timep)
Definition localtime.c:1390
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, fb(), 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(), SetEpochTimestamp(), and SetEpochTimestamp().

◆ GetSQLCurrentTimestamp()

TimestampTz GetSQLCurrentTimestamp ( int32  typmod)
extern

Definition at line 1657 of file timestamp.c.

1658{
1659 TimestampTz ts;
1660
1662 if (typmod >= 0)
1663 AdjustTimestampForTypmod(&ts, typmod, NULL);
1664 return ts;
1665}
bool AdjustTimestampForTypmod(Timestamp *time, int32 typmod, Node *escontext)
Definition timestamp.c:360
TimestampTz GetCurrentTransactionStartTimestamp(void)
Definition xact.c:872

References AdjustTimestampForTypmod(), fb(), and GetCurrentTransactionStartTimestamp().

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLLocalTimestamp()

Timestamp GetSQLLocalTimestamp ( int32  typmod)
extern

Definition at line 1671 of file timestamp.c.

1672{
1673 Timestamp ts;
1674
1676 if (typmod >= 0)
1677 AdjustTimestampForTypmod(&ts, typmod, NULL);
1678 return ts;
1679}
static Timestamp timestamptz2timestamp(TimestampTz timestamp)
Definition timestamp.c:6508

References AdjustTimestampForTypmod(), fb(), GetCurrentTransactionStartTimestamp(), and timestamptz2timestamp().

Referenced by ExecEvalSQLValueFunction().

◆ interval2itm()

void interval2itm ( Interval  span,
struct pg_itm itm 
)
extern

Definition at line 2041 of file timestamp.c.

2042{
2043 TimeOffset time;
2045
2046 itm->tm_year = span.month / MONTHS_PER_YEAR;
2047 itm->tm_mon = span.month % MONTHS_PER_YEAR;
2048 itm->tm_mday = span.day;
2049 time = span.time;
2050
2051 tfrac = time / USECS_PER_HOUR;
2052 time -= tfrac * USECS_PER_HOUR;
2053 itm->tm_hour = tfrac;
2054 tfrac = time / USECS_PER_MINUTE;
2055 time -= tfrac * USECS_PER_MINUTE;
2056 itm->tm_min = (int) tfrac;
2057 tfrac = time / USECS_PER_SEC;
2058 time -= tfrac * USECS_PER_SEC;
2059 itm->tm_sec = (int) tfrac;
2060 itm->tm_usec = (int) time;
2061}
#define MONTHS_PER_YEAR
Definition timestamp.h:108

References fb(), MONTHS_PER_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 
)
extern

Definition at line 5258 of file timestamp.c.

5259{
5260 j2date(isoweek2j(*year, woy), year, mon, mday);
5261}
void j2date(int jd, int *year, int *month, int *day)
Definition datetime.c:322

References fb(), isoweek2j(), and j2date().

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

◆ isoweek2j()

int isoweek2j ( int  year,
int  week 
)
extern

Definition at line 5238 of file timestamp.c.

5239{
5240 int day0,
5241 day4;
5242
5243 /* fourth day of current year */
5244 day4 = date2j(year, 1, 4);
5245
5246 /* day0 == offset to first day of week (Monday) */
5247 day0 = j2day(day4 - 1);
5248
5249 return ((week - 1) * 7) + (day4 - day0);
5250}

References date2j(), fb(), and j2day().

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

◆ isoweekdate2date()

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

Definition at line 5271 of file timestamp.c.

5272{
5273 int jday;
5274
5275 jday = isoweek2j(*year, isoweek);
5276 /* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */
5277 if (wday > 1)
5278 jday += wday - 2;
5279 else
5280 jday += 6;
5281 j2date(jday, year, mon, mday);
5282}

References fb(), isoweek2j(), and j2date().

Referenced by do_to_timestamp().

◆ itm2interval()

int itm2interval ( struct pg_itm itm,
Interval span 
)
extern

Definition at line 2071 of file timestamp.c.

2072{
2073 int64 total_months = (int64) itm->tm_year * MONTHS_PER_YEAR + itm->tm_mon;
2074
2076 return -1;
2077 span->month = (int32) total_months;
2078 span->day = itm->tm_mday;
2080 &span->time))
2081 return -1;
2082 /* tm_min, tm_sec are 32 bits, so intermediate products can't overflow */
2083 if (pg_add_s64_overflow(span->time, itm->tm_min * USECS_PER_MINUTE,
2084 &span->time))
2085 return -1;
2086 if (pg_add_s64_overflow(span->time, itm->tm_sec * USECS_PER_SEC,
2087 &span->time))
2088 return -1;
2089 if (pg_add_s64_overflow(span->time, itm->tm_usec,
2090 &span->time))
2091 return -1;
2093 return -1;
2094 return 0;
2095}
int64_t int64
Definition c.h:621
int32_t int32
Definition c.h:620
#define INTERVAL_NOT_FINITE(i)
Definition timestamp.h:195
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
Definition int.h:293
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
Definition int.h:235

References fb(), INTERVAL_NOT_FINITE, MONTHS_PER_YEAR, pg_add_s64_overflow(), pg_mul_s64_overflow(), 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 
)
extern

Definition at line 2109 of file timestamp.c.

2110{
2111 int64 total_months = (int64) itm_in->tm_year * MONTHS_PER_YEAR + itm_in->tm_mon;
2112
2114 return -1;
2115 span->month = (int32) total_months;
2116 span->day = itm_in->tm_mday;
2117 span->time = itm_in->tm_usec;
2118 return 0;
2119}

References fb(), and MONTHS_PER_YEAR.

Referenced by interval_in(), pg_timezone_abbrevs_abbrevs(), pg_timezone_abbrevs_zone(), and pg_timezone_names().

◆ SetEpochTimestamp()

Timestamp SetEpochTimestamp ( void  )
extern

Definition at line 2184 of file timestamp.c.

2185{
2186 Timestamp dt;
2187 struct pg_tm tt,
2188 *tm = &tt;
2189
2191 /* we don't bother to test for failure ... */
2192 tm2timestamp(tm, 0, NULL, &dt);
2193
2194 return dt;
2195} /* SetEpochTimestamp() */
void GetEpochTime(struct pg_tm *tm)
Definition timestamp.c:2162
int tm2timestamp(struct tm *tm, fsec_t fsec, int *tzp, timestamp *result)
Definition timestamp.c:37

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

◆ time_t_to_timestamptz()

TimestampTz time_t_to_timestamptz ( pg_time_t  tm)
extern

◆ timestamp2timestamptz_safe()

TimestampTz timestamp2timestamptz_safe ( Timestamp  timestamp,
Node escontext 
)
extern

Definition at line 6447 of file timestamp.c.

6448{
6450 struct pg_tm tt,
6451 *tm = &tt;
6452 fsec_t fsec;
6453 int tz;
6454
6456 return timestamp;
6457
6458 /* timestamp2tm should not fail on valid timestamps, but cope */
6459 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
6460 {
6462
6463 result = dt2local(timestamp, -tz);
6464
6466 return result;
6467 }
6468
6469 if (timestamp < 0)
6471 else
6473
6474 ereturn(escontext, result,
6476 errmsg("timestamp out of range")));
6477}
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition datetime.c:1605
static Timestamp dt2local(Timestamp dt, int timezone)
Definition timestamp.c:2128
int32 fsec_t
Definition timestamp.h:41
#define TIMESTAMP_NOBEGIN(j)
Definition timestamp.h:159
#define IS_VALID_TIMESTAMP(t)
Definition timestamp.h:267
#define TIMESTAMP_NOT_FINITE(j)
Definition timestamp.h:169
#define TIMESTAMP_NOEND(j)
Definition timestamp.h:164
#define ereturn(context, dummy_value,...)
Definition elog.h:280
static int timestamp2tm(timestamp dt, int *tzp, struct tm *tm, fsec_t *fsec, const char **tzn)
Definition timestamp.c:88
PGDLLIMPORT pg_tz * session_timezone
Definition pgtz.c:28
int64 timestamp

References DetermineTimeZoneOffset(), dt2local(), ereturn, errcode(), errmsg, fb(), IS_VALID_TIMESTAMP, result, session_timezone, timestamp2tm(), TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, TIMESTAMP_NOT_FINITE, and tm.

Referenced by cvt_timestamp_timestamptz(), timestamp2timestamptz(), timestamp_cmp_timestamptz_internal(), and timestamp_timestamptz().

◆ timestamp2tm()

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

Definition at line 1904 of file timestamp.c.

1905{
1907 Timestamp time;
1909
1910 /* Use session timezone if caller asks for default */
1911 if (attimezone == NULL)
1912 attimezone = session_timezone;
1913
1914 time = dt;
1915 TMODULO(time, date, USECS_PER_DAY);
1916
1917 if (time < INT64CONST(0))
1918 {
1919 time += USECS_PER_DAY;
1920 date -= 1;
1921 }
1922
1923 /* add offset to go from J2000 back to standard Julian date */
1925
1926 /* Julian day routine does not work for negative Julian days */
1928 return -1;
1929
1930 j2date((int) date, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
1931 dt2time(time, &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
1932
1933 /* Done if no TZ conversion wanted */
1934 if (tzp == NULL)
1935 {
1936 tm->tm_isdst = -1;
1937 tm->tm_gmtoff = 0;
1938 tm->tm_zone = NULL;
1939 if (tzn != NULL)
1940 *tzn = NULL;
1941 return 0;
1942 }
1943
1944 /*
1945 * If the time falls within the range of pg_time_t, use pg_localtime() to
1946 * rotate to the local time zone.
1947 *
1948 * First, convert to an integral timestamp, avoiding possibly
1949 * platform-specific roundoff-in-wrong-direction errors, and adjust to
1950 * Unix epoch. Then see if we can convert to pg_time_t without loss. This
1951 * coding avoids hardwiring any assumptions about the width of pg_time_t,
1952 * so it should behave sanely on machines without int64.
1953 */
1954 dt = (dt - *fsec) / USECS_PER_SEC +
1956 utime = (pg_time_t) dt;
1957 if ((Timestamp) utime == dt)
1958 {
1959 struct pg_tm *tx = pg_localtime(&utime, attimezone);
1960
1961 tm->tm_year = tx->tm_year + 1900;
1962 tm->tm_mon = tx->tm_mon + 1;
1963 tm->tm_mday = tx->tm_mday;
1964 tm->tm_hour = tx->tm_hour;
1965 tm->tm_min = tx->tm_min;
1966 tm->tm_sec = tx->tm_sec;
1967 tm->tm_isdst = tx->tm_isdst;
1968 tm->tm_gmtoff = tx->tm_gmtoff;
1969 tm->tm_zone = tx->tm_zone;
1970 *tzp = -tm->tm_gmtoff;
1971 if (tzn != NULL)
1972 *tzn = tm->tm_zone;
1973 }
1974 else
1975 {
1976 /*
1977 * When out of range of pg_time_t, treat as GMT
1978 */
1979 *tzp = 0;
1980 /* Mark this as *no* time zone available */
1981 tm->tm_isdst = -1;
1982 tm->tm_gmtoff = 0;
1983 tm->tm_zone = NULL;
1984 if (tzn != NULL)
1985 *tzn = NULL;
1986 }
1987
1988 return 0;
1989}
void dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
Definition timestamp.c:1877
#define INT64CONST(x)
Definition c.h:630
#define USECS_PER_DAY
Definition timestamp.h:131
#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:1345
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(), fb(), INT64CONST, 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(), executeDateTimeMethod(), GetCurrentTimeUsec(), JsonEncodeDateTime(), map_sql_value_to_xml_value(), pg_get_role_ddl_internal(), pg_timezone_names(), timestamp2date_safe(), timestamp_time(), timestamp_to_char(), timestamptz2date_safe(), timestamptz_time(), timestamptz_timetz(), timestamptz_to_char(), and timetz_zone().

◆ timestamp_cmp_internal()

int timestamp_cmp_internal ( Timestamp  dt1,
Timestamp  dt2 
)
extern

◆ timestamp_cmp_timestamptz_internal()

int32 timestamp_cmp_timestamptz_internal ( Timestamp  timestampVal,
TimestampTz  dt2 
)
extern

Definition at line 2357 of file timestamp.c.

2358{
2361
2363 if (escontext.error_occurred)
2364 {
2366 {
2367 /* dt1 is larger than any finite timestamp, but less than infinity */
2368 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
2369 }
2371 {
2372 /* dt1 is less than any finite timestamp, but more than -infinity */
2373 return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
2374 }
2375 }
2376
2378}
TimestampTz timestamp2timestamptz_safe(Timestamp timestamp, Node *escontext)
Definition timestamp.c:6447
#define TIMESTAMP_IS_NOEND(j)
Definition timestamp.h:167
#define TIMESTAMP_IS_NOBEGIN(j)
Definition timestamp.h:162
Definition nodes.h:135
#define timestamptz_cmp_internal(dt1, dt2)
Definition timestamp.h:143

References ErrorSaveContext::error_occurred, fb(), timestamp2timestamptz_safe(), 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 
)
extern

◆ TimestampDifferenceExceeds()

◆ TimestampDifferenceExceedsSeconds()

bool TimestampDifferenceExceedsSeconds ( TimestampTz  start_time,
TimestampTz  stop_time,
int  threshold_sec 
)
extern

Definition at line 1789 of file timestamp.c.

1792{
1793 long secs;
1794 int usecs;
1795
1796 /* Calculate the difference in seconds */
1798
1799 return (secs >= threshold_sec);
1800}
void TimestampDifference(TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs)
Definition timestamp.c:1715

References fb(), start_time, and TimestampDifference().

Referenced by DetermineSlotInvalidationCause().

◆ TimestampDifferenceMicroseconds()

static uint64 TimestampDifferenceMicroseconds ( TimestampTz  start_time,
TimestampTz  stop_time 
)
inlinestatic

Definition at line 90 of file timestamp.h.

92{
93 if (start_time >= stop_time)
94 return 0;
95 return (uint64) stop_time - start_time;
96}
uint64_t uint64
Definition c.h:625

References fb(), and start_time.

Referenced by get_role_password(), and PostgresMain().

◆ TimestampDifferenceMilliseconds()

long TimestampDifferenceMilliseconds ( TimestampTz  start_time,
TimestampTz  stop_time 
)
extern

Definition at line 1751 of file timestamp.c.

1752{
1754
1755 /* Deal with zero or negative elapsed time quickly. */
1756 if (start_time >= stop_time)
1757 return 0;
1758 /* To not fail with timestamp infinities, we must detect overflow. */
1760 return (long) INT_MAX;
1761 if (diff >= (INT_MAX * INT64CONST(1000) - 999))
1762 return (long) INT_MAX;
1763 else
1764 return (long) ((diff + 999) / 1000);
1765}
static bool pg_sub_s64_overflow(int64 a, int64 b, int64 *result)
Definition int.h:262

References fb(), INT64CONST, pg_sub_s64_overflow(), and start_time.

Referenced by ApplyLauncherMain(), autoprewarm_main(), bbsink_copystream_archive_contents(), DetermineSleepTime(), do_analyze_rel(), GetReplicationApplyDelay(), GetReplicationTransferLatency(), IoWorkerMain(), libpqsrv_cancel(), LogCheckpointEnd(), pg_stash_advice_worker_main(), pgfdw_get_cleanup_result(), pgstat_report_analyze(), pgstat_report_vacuum(), recoveryApplyDelay(), wait_for_local_flush(), WaitForLSN(), WaitForWalSummarization(), WaitForWALToBecomeAvailable(), WalReceiverMain(), and WalSndComputeSleeptime().

◆ TimestampGetDatum()

◆ TimestampTimestampTzRequiresRewrite()

bool TimestampTimestampTzRequiresRewrite ( void  )
extern

Definition at line 6411 of file timestamp.c.

6412{
6413 long offset;
6414
6415 if (pg_get_timezone_offset(session_timezone, &offset) && offset == 0)
6416 return false;
6417 return true;
6418}
bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff)
Definition localtime.c:1966

References pg_get_timezone_offset(), and session_timezone.

Referenced by ATColumnChangeRequiresRewrite().

◆ timestamptz2timestamp_safe()

Timestamp timestamptz2timestamp_safe ( TimestampTz  timestamp,
Node escontext 
)
extern

Definition at line 6524 of file timestamp.c.

6525{
6527 struct pg_tm tt,
6528 *tm = &tt;
6529 fsec_t fsec;
6530 int tz;
6531
6533 result = timestamp;
6534 else
6535 {
6536 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
6537 {
6538 if (timestamp < 0)
6540 else
6542
6543 ereturn(escontext, result,
6545 errmsg("timestamp out of range")));
6546 }
6547 if (tm2timestamp(tm, fsec, NULL, &result) != 0)
6548 {
6549 if (timestamp < 0)
6551 else
6553
6554 ereturn(escontext, result,
6556 errmsg("timestamp out of range")));
6557 }
6558 }
6559 return result;
6560}

References ereturn, errcode(), errmsg, fb(), result, timestamp2tm(), TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, TIMESTAMP_NOT_FINITE, tm, and tm2timestamp().

Referenced by cvt_timestamptz_timestamp(), timestamptz2timestamp(), and timestamptz_timestamp().

◆ timestamptz_to_str()

const char * timestamptz_to_str ( TimestampTz  t)
extern

Definition at line 1856 of file timestamp.c.

1857{
1858 static char buf[MAXDATELEN + 1];
1859 int tz;
1860 struct pg_tm tt,
1861 *tm = &tt;
1862 fsec_t fsec;
1863 const char *tzn;
1864
1865 if (TIMESTAMP_NOT_FINITE(t))
1867 else if (timestamp2tm(t, &tz, tm, &fsec, &tzn, NULL) == 0)
1868 EncodeDateTime(tm, fsec, true, tz, tzn, USE_ISO_DATES, buf);
1869 else
1870 strlcpy(buf, "(timestamp out of range)", sizeof(buf));
1871
1872 return buf;
1873}
void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
Definition datetime.c:4465
void EncodeSpecialTimestamp(Timestamp dt, char *str)
Definition timestamp.c:1581
#define MAXDATELEN
Definition datetime.h:200
#define USE_ISO_DATES
Definition miscadmin.h:240
static char buf[DEFAULT_XLOG_SEG_SIZE]
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition strlcpy.c:45

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

Referenced by CreateRestartPoint(), errdetail_apply_conflict(), 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)
extern

◆ TimestampTzGetDatum()

◆ tm2timestamp()

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

Definition at line 2000 of file timestamp.c.

2001{
2003 TimeOffset time;
2004
2005 /* Prevent overflow in Julian-day routines */
2007 {
2008 *result = 0; /* keep compiler quiet */
2009 return -1;
2010 }
2011
2013 time = time2t(tm->tm_hour, tm->tm_min, tm->tm_sec, fsec);
2014
2017 {
2018 *result = 0; /* keep compiler quiet */
2019 return -1;
2020 }
2021 if (tzp != NULL)
2022 *result = dt2local(*result, -(*tzp));
2023
2024 /* final range check catches just-out-of-range timestamps */
2026 {
2027 *result = 0; /* keep compiler quiet */
2028 return -1;
2029 }
2030
2031 return 0;
2032}
static TimeOffset time2t(const int hour, const int min, const int sec, const fsec_t fsec)
Definition timestamp.c:2122
#define unlikely(x)
Definition c.h:438
#define IS_VALID_JULIAN(y, m, d)
Definition timestamp.h:227

References date2j(), dt2local(), fb(), IS_VALID_JULIAN, IS_VALID_TIMESTAMP, pg_add_s64_overflow(), pg_mul_s64_overflow(), POSTGRES_EPOCH_JDATE, result, 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, unlikely, and USECS_PER_DAY.

Referenced by check_recovery_target_time(), parse_datetime(), PGTYPEStimestamp_defmt_scan(), and to_timestamp().

Variable Documentation

◆ PgReloadTime

PGDLLIMPORT TimestampTz PgReloadTime
extern

Definition at line 48 of file timestamp.c.

Referenced by pg_conf_load_time(), and ProcessConfigFileInternal().

◆ PgStartTime

PGDLLIMPORT TimestampTz PgStartTime
extern

Definition at line 45 of file timestamp.c.

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