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:36
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
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 5286 of file timestamp.c.

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

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

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 5398 of file timestamp.c.

5399{
5400 return date2j(year, mon, mday) - isoweek2j(date2isoyear(year, mon, mday), 1) + 1;
5401}
int isoweek2j(int year, int week)
Definition timestamp.c:5235
int date2isoyear(int year, int mon, int mday)
Definition timestamp.c:5341

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 1874 of file timestamp.c.

1875{
1876 TimeOffset time;
1877
1878 time = jd;
1879
1880 *hour = time / USECS_PER_HOUR;
1881 time -= (*hour) * USECS_PER_HOUR;
1882 *min = time / USECS_PER_MINUTE;
1883 time -= (*min) * USECS_PER_MINUTE;
1884 *sec = time / USECS_PER_SEC;
1885 *fsec = time - (*sec * USECS_PER_SEC);
1886} /* 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 1636 of file timestamp.c.

1637{
1638 TimestampTz result;
1639 struct timeval tp;
1640
1641 gettimeofday(&tp, NULL);
1642
1643 result = (TimestampTz) tp.tv_sec -
1645 result = (result * USECS_PER_SEC) + tp.tv_usec;
1646
1647 return result;
1648}
#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, 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(), KnownAssignedXidsCompress(), launch_sync_worker(), launcher_determine_sleep(), libpqsrv_cancel(), LockBufferForCleanup(), log_disconnections(), LogCheckpointEnd(), logicalrep_worker_launch(), LogicalRepApplyLoop(), maybe_start_bgworkers(), pa_send_data(), PerformAuthentication(), PerformWalRecovery(), pg_sleep(), pgfdw_abort_cleanup_begin(), pgfdw_cancel_query(), pgfdw_exec_cleanup_query(), pgfdw_finish_abort_cleanup(), 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_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(), 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 2159 of file timestamp.c.

2160{
2161 struct pg_tm *t0;
2162 pg_time_t epoch = 0;
2163
2164 t0 = pg_gmtime(&epoch);
2165
2166 if (t0 == NULL)
2167 elog(ERROR, "could not convert epoch to timestamp: %m");
2168
2169 tm->tm_year = t0->tm_year;
2170 tm->tm_mon = t0->tm_mon;
2171 tm->tm_mday = t0->tm_mday;
2172 tm->tm_hour = t0->tm_hour;
2173 tm->tm_min = t0->tm_min;
2174 tm->tm_sec = t0->tm_sec;
2175
2176 tm->tm_year += 1900;
2177 tm->tm_mon++;
2178}
#define elog(elevel,...)
Definition elog.h:226
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 1654 of file timestamp.c.

1655{
1656 TimestampTz ts;
1657
1659 if (typmod >= 0)
1660 AdjustTimestampForTypmod(&ts, typmod, NULL);
1661 return ts;
1662}
bool AdjustTimestampForTypmod(Timestamp *time, int32 typmod, Node *escontext)
Definition timestamp.c:359
TimestampTz GetCurrentTransactionStartTimestamp(void)
Definition xact.c:872

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

Referenced by ExecEvalSQLValueFunction().

◆ GetSQLLocalTimestamp()

Timestamp GetSQLLocalTimestamp ( int32  typmod)
extern

Definition at line 1668 of file timestamp.c.

1669{
1670 Timestamp ts;
1671
1673 if (typmod >= 0)
1674 AdjustTimestampForTypmod(&ts, typmod, NULL);
1675 return ts;
1676}
static Timestamp timestamptz2timestamp(TimestampTz timestamp)
Definition timestamp.c:6495

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

Referenced by ExecEvalSQLValueFunction().

◆ interval2itm()

void interval2itm ( Interval  span,
struct pg_itm itm 
)
extern

Definition at line 2038 of file timestamp.c.

2039{
2040 TimeOffset time;
2042
2043 itm->tm_year = span.month / MONTHS_PER_YEAR;
2044 itm->tm_mon = span.month % MONTHS_PER_YEAR;
2045 itm->tm_mday = span.day;
2046 time = span.time;
2047
2048 tfrac = time / USECS_PER_HOUR;
2049 time -= tfrac * USECS_PER_HOUR;
2050 itm->tm_hour = tfrac;
2051 tfrac = time / USECS_PER_MINUTE;
2052 time -= tfrac * USECS_PER_MINUTE;
2053 itm->tm_min = (int) tfrac;
2054 tfrac = time / USECS_PER_SEC;
2055 time -= tfrac * USECS_PER_SEC;
2056 itm->tm_sec = (int) tfrac;
2057 itm->tm_usec = (int) time;
2058}
#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 5255 of file timestamp.c.

5256{
5257 j2date(isoweek2j(*year, woy), year, mon, mday);
5258}
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 5235 of file timestamp.c.

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

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 5268 of file timestamp.c.

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

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

Referenced by do_to_timestamp().

◆ itm2interval()

int itm2interval ( struct pg_itm itm,
Interval span 
)
extern

Definition at line 2068 of file timestamp.c.

2069{
2070 int64 total_months = (int64) itm->tm_year * MONTHS_PER_YEAR + itm->tm_mon;
2071
2073 return -1;
2074 span->month = (int32) total_months;
2075 span->day = itm->tm_mday;
2077 &span->time))
2078 return -1;
2079 /* tm_min, tm_sec are 32 bits, so intermediate products can't overflow */
2080 if (pg_add_s64_overflow(span->time, itm->tm_min * USECS_PER_MINUTE,
2081 &span->time))
2082 return -1;
2083 if (pg_add_s64_overflow(span->time, itm->tm_sec * USECS_PER_SEC,
2084 &span->time))
2085 return -1;
2086 if (pg_add_s64_overflow(span->time, itm->tm_usec,
2087 &span->time))
2088 return -1;
2090 return -1;
2091 return 0;
2092}
int64_t int64
Definition c.h:615
int32_t int32
Definition c.h:614
#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 2106 of file timestamp.c.

2107{
2108 int64 total_months = (int64) itm_in->tm_year * MONTHS_PER_YEAR + itm_in->tm_mon;
2109
2111 return -1;
2112 span->month = (int32) total_months;
2113 span->day = itm_in->tm_mday;
2114 span->time = itm_in->tm_usec;
2115 return 0;
2116}

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 2181 of file timestamp.c.

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

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

◆ time_t_to_timestamptz()

TimestampTz time_t_to_timestamptz ( pg_time_t  tm)
extern

Definition at line 1811 of file timestamp.c.

1812{
1813 TimestampTz result;
1814
1815 result = (TimestampTz) tm -
1817 result *= USECS_PER_SEC;
1818
1819 return result;
1820}

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

TimestampTz timestamp2timestamptz_safe ( Timestamp  timestamp,
Node escontext 
)
extern

Definition at line 6439 of file timestamp.c.

6440{
6441 TimestampTz result;
6442 struct pg_tm tt,
6443 *tm = &tt;
6444 fsec_t fsec;
6445 int tz;
6446
6448 return timestamp;
6449
6450 /* timestamp2tm should not fail on valid timestamps, but cope */
6451 if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
6452 {
6454
6455 result = dt2local(timestamp, -tz);
6456
6457 if (IS_VALID_TIMESTAMP(result))
6458 return result;
6459 }
6460
6461 if (timestamp < 0)
6462 TIMESTAMP_NOBEGIN(result);
6463 else
6464 TIMESTAMP_NOEND(result);
6465
6466 ereturn(escontext, result,
6468 errmsg("timestamp out of range")));
6469}
int DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
Definition datetime.c:1605
static Timestamp dt2local(Timestamp dt, int timezone)
Definition timestamp.c:2125
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
Definition timestamp.c:1901
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:278
PGDLLIMPORT pg_tz * session_timezone
Definition pgtz.c:28
int64 timestamp

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

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

Definition at line 1901 of file timestamp.c.

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

2355{
2358
2360 if (escontext.error_occurred)
2361 {
2363 {
2364 /* dt1 is larger than any finite timestamp, but less than infinity */
2365 return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
2366 }
2368 {
2369 /* dt1 is less than any finite timestamp, but more than -infinity */
2370 return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
2371 }
2372 }
2373
2375}
TimestampTz timestamp2timestamptz_safe(Timestamp timestamp, Node *escontext)
Definition timestamp.c:6439
#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 1786 of file timestamp.c.

1789{
1790 long secs;
1791 int usecs;
1792
1793 /* Calculate the difference in seconds */
1795
1796 return (secs >= threshold_sec);
1797}
void TimestampDifference(TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs)
Definition timestamp.c:1712

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

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 1748 of file timestamp.c.

1749{
1751
1752 /* Deal with zero or negative elapsed time quickly. */
1753 if (start_time >= stop_time)
1754 return 0;
1755 /* To not fail with timestamp infinities, we must detect overflow. */
1757 return (long) INT_MAX;
1758 if (diff >= (INT_MAX * INT64CONST(1000) - 999))
1759 return (long) INT_MAX;
1760 else
1761 return (long) ((diff + 999) / 1000);
1762}
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(), libpqsrv_cancel(), LogCheckpointEnd(), 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 6408 of file timestamp.c.

6409{
6410 long offset;
6411
6412 if (pg_get_timezone_offset(session_timezone, &offset) && offset == 0)
6413 return false;
6414 return true;
6415}
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 6511 of file timestamp.c.

6512{
6513 Timestamp result;
6514 struct pg_tm tt,
6515 *tm = &tt;
6516 fsec_t fsec;
6517 int tz;
6518
6520 result = timestamp;
6521 else
6522 {
6523 if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
6524 {
6525 if (timestamp < 0)
6526 TIMESTAMP_NOBEGIN(result);
6527 else
6528 TIMESTAMP_NOEND(result);
6529
6530 ereturn(escontext, result,
6532 errmsg("timestamp out of range")));
6533 }
6534 if (tm2timestamp(tm, fsec, NULL, &result) != 0)
6535 {
6536 if (timestamp < 0)
6537 TIMESTAMP_NOBEGIN(result);
6538 else
6539 TIMESTAMP_NOEND(result);
6540
6541 ereturn(escontext, result,
6543 errmsg("timestamp out of range")));
6544 }
6545 }
6546 return result;
6547}

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

Referenced by cvt_timestamptz_timestamp(), and timestamptz2timestamp().

◆ timestamptz_to_str()

const char * timestamptz_to_str ( TimestampTz  t)
extern

Definition at line 1853 of file timestamp.c.

1854{
1855 static char buf[MAXDATELEN + 1];
1856 int tz;
1857 struct pg_tm tt,
1858 *tm = &tt;
1859 fsec_t fsec;
1860 const char *tzn;
1861
1862 if (TIMESTAMP_NOT_FINITE(t))
1864 else if (timestamp2tm(t, &tz, tm, &fsec, &tzn, NULL) == 0)
1865 EncodeDateTime(tm, fsec, true, tz, tzn, USE_ISO_DATES, buf);
1866 else
1867 strlcpy(buf, "(timestamp out of range)", sizeof(buf));
1868
1869 return buf;
1870}
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:1578
#define MAXDATELEN
Definition datetime.h:200
#define USE_ISO_DATES
Definition miscadmin.h:237
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, 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

Definition at line 1833 of file timestamp.c.

1834{
1835 pg_time_t result;
1836
1837 result = (pg_time_t) (t / USECS_PER_SEC +
1839
1840 return result;
1841}

References POSTGRES_EPOCH_JDATE, SECS_PER_DAY, UNIX_EPOCH_JDATE, and USECS_PER_SEC.

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

◆ TimestampTzGetDatum()

◆ tm2timestamp()

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

Definition at line 1997 of file timestamp.c.

1998{
2000 TimeOffset time;
2001
2002 /* Prevent overflow in Julian-day routines */
2004 {
2005 *result = 0; /* keep compiler quiet */
2006 return -1;
2007 }
2008
2010 time = time2t(tm->tm_hour, tm->tm_min, tm->tm_sec, fsec);
2011
2013 pg_add_s64_overflow(*result, time, result)))
2014 {
2015 *result = 0; /* keep compiler quiet */
2016 return -1;
2017 }
2018 if (tzp != NULL)
2019 *result = dt2local(*result, -(*tzp));
2020
2021 /* final range check catches just-out-of-range timestamps */
2022 if (!IS_VALID_TIMESTAMP(*result))
2023 {
2024 *result = 0; /* keep compiler quiet */
2025 return -1;
2026 }
2027
2028 return 0;
2029}
static TimeOffset time2t(const int hour, const int min, const int sec, const fsec_t fsec)
Definition timestamp.c:2119
#define unlikely(x)
Definition c.h:432
#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, 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().