From b5f7cff84f57a189ed5c9dd59efe8d2568649d0d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 29 Jun 2005 22:51:57 +0000 Subject: [PATCH] Clean up the rather historically encumbered interface to now() and current time: provide a GetCurrentTimestamp() function that returns current time in the form of a TimestampTz, instead of separate time_t and microseconds fields. This is what all the callers really want anyway, and it eliminates low-level dependencies on AbsoluteTime, which is a deprecated datatype that will have to disappear eventually. --- contrib/btree_gist/btree_ts.c | 3 + contrib/spi/timetravel.c | 2 + src/backend/access/transam/xact.c | 35 +++-------- src/backend/access/transam/xlog.c | 3 +- src/backend/bootstrap/bootparse.y | 3 +- src/backend/bootstrap/bootscanner.l | 3 +- src/backend/libpq/crypt.c | 12 +--- src/backend/postmaster/pgstat.c | 11 ++-- src/backend/postmaster/postmaster.c | 20 +++---- src/backend/tcop/postgres.c | 15 +---- src/backend/utils/adt/datetime.c | 38 +++++++++++- src/backend/utils/adt/nabstime.c | 91 +---------------------------- src/backend/utils/adt/pgstatfuncs.c | 32 +++------- src/backend/utils/adt/selfuncs.c | 3 +- src/backend/utils/adt/timestamp.c | 46 +++++++++++---- src/include/access/xact.h | 7 +-- src/include/pgstat.h | 10 ++-- src/include/utils/nabstime.h | 4 +- src/include/utils/timestamp.h | 10 +++- 19 files changed, 135 insertions(+), 213 deletions(-) diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c index 3d5defe3db0..37f72d3a516 100644 --- a/contrib/btree_gist/btree_ts.c +++ b/contrib/btree_gist/btree_ts.c @@ -1,6 +1,9 @@ #include "btree_gist.h" #include "btree_utils_num.h" +#include "utils/datetime.h" + + typedef struct { Timestamp lower; diff --git a/contrib/spi/timetravel.c b/contrib/spi/timetravel.c index ba4838af659..0eae24a5769 100644 --- a/contrib/spi/timetravel.c +++ b/contrib/spi/timetravel.c @@ -8,6 +8,8 @@ #include "executor/spi.h" /* this is what you need to work with SPI */ #include "commands/trigger.h" /* -"- and triggers */ #include "miscadmin.h" /* for GetPgUserName() */ +#include "utils/nabstime.h" + #include /* tolower () */ #define ABSTIMEOID 702 /* it should be in pg_type.h */ diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index a5d53d3e145..1df9cfa7ba0 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.208 2005/06/28 05:08:51 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.209 2005/06/29 22:51:53 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -168,12 +168,11 @@ static SubTransactionId currentSubTransactionId; static CommandId currentCommandId; /* - * These vars hold the value of now(), ie, the transaction start time. + * This is the value of now(), ie, the transaction start time. * This does not change as we enter and exit subtransactions, so we don't * keep it inside the TransactionState stack. */ -static AbsoluteTime xactStartTime; /* integer part */ -static int xactStartTimeUsec; /* microsecond part */ +static TimestampTz xactStartTimestamp; /* * GID to be used for preparing the current transaction. This is also @@ -420,28 +419,15 @@ GetCurrentCommandId(void) return currentCommandId; } - /* - * GetCurrentTransactionStartTime + * GetCurrentTransactionStartTimestamp */ -AbsoluteTime -GetCurrentTransactionStartTime(void) +TimestampTz +GetCurrentTransactionStartTimestamp(void) { - return xactStartTime; + return xactStartTimestamp; } - -/* - * GetCurrentTransactionStartTimeUsec - */ -AbsoluteTime -GetCurrentTransactionStartTimeUsec(int *msec) -{ - *msec = xactStartTimeUsec; - return xactStartTime; -} - - /* * GetCurrentTransactionNestLevel * @@ -1391,7 +1377,7 @@ StartTransaction(void) /* * set now() */ - xactStartTime = GetCurrentAbsoluteTimeUsec(&(xactStartTimeUsec)); + xactStartTimestamp = GetCurrentTimestamp(); /* * initialize current transaction state fields @@ -1633,8 +1619,6 @@ PrepareTransaction(void) TransactionId xid = GetCurrentTransactionId(); GlobalTransaction gxact; TimestampTz prepared_at; - AbsoluteTime PreparedSec; /* integer part */ - int PreparedUSec; /* microsecond part */ ShowTransactionState("PrepareTransaction"); @@ -1697,8 +1681,7 @@ PrepareTransaction(void) */ s->state = TRANS_PREPARE; - PreparedSec = GetCurrentAbsoluteTimeUsec(&PreparedUSec); - prepared_at = AbsoluteTimeUsecToTimestampTz(PreparedSec, PreparedUSec); + prepared_at = GetCurrentTimestamp(); /* Tell bufmgr and smgr to prepare for commit */ BufmgrCommit(); diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 3a55a521c17..93f8d75e6cc 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.203 2005/06/19 21:34:01 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.204 2005/06/29 22:51:53 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -43,6 +43,7 @@ #include "storage/spin.h" #include "utils/builtins.h" #include "utils/guc.h" +#include "utils/nabstime.h" #include "utils/relcache.h" diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y index 1945c4074d9..fc42ba83af3 100644 --- a/src/backend/bootstrap/bootparse.y +++ b/src/backend/bootstrap/bootparse.y @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.76 2005/04/14 01:38:15 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.77 2005/06/29 22:51:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -47,7 +47,6 @@ #include "storage/off.h" #include "storage/smgr.h" #include "tcop/dest.h" -#include "utils/nabstime.h" #include "utils/rel.h" #define atooid(x) ((Oid) strtoul((x), NULL, 10)) diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l index 2cec26078af..5c2fce29f0e 100644 --- a/src/backend/bootstrap/bootscanner.l +++ b/src/backend/bootstrap/bootscanner.l @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.39 2005/03/11 19:13:42 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.40 2005/06/29 22:51:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -34,7 +34,6 @@ #include "storage/fd.h" #include "storage/itemptr.h" #include "storage/off.h" -#include "utils/nabstime.h" #include "utils/rel.h" /* Not needed now that this file is compiled as part of bootparse. */ diff --git a/src/backend/libpq/crypt.c b/src/backend/libpq/crypt.c index d9c95d1b9ac..297db1eea91 100644 --- a/src/backend/libpq/crypt.c +++ b/src/backend/libpq/crypt.c @@ -9,7 +9,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/libpq/crypt.c,v 1.63 2005/06/28 05:08:56 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/crypt.c,v 1.64 2005/06/29 22:51:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -25,7 +25,7 @@ #include "miscadmin.h" #include "storage/fd.h" #include "nodes/pg_list.h" -#include "utils/nabstime.h" +#include "utils/timestamp.h" int @@ -149,19 +149,13 @@ md5_crypt_verify(const Port *port, const char *role, char *client_pass) else { TimestampTz vuntil; - AbsoluteTime sec; - int usec; - TimestampTz curtime; vuntil = DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in, CStringGetDatum(valuntil), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1))); - sec = GetCurrentAbsoluteTimeUsec(&usec); - curtime = AbsoluteTimeUsecToTimestampTz(sec, usec); - - if (vuntil < curtime) + if (vuntil < GetCurrentTimestamp()) retval = STATUS_ERROR; else retval = STATUS_OK; diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index b429275d9f6..86b873ab36b 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -13,7 +13,7 @@ * * Copyright (c) 2001-2005, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.97 2005/06/28 05:08:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.98 2005/06/29 22:51:55 tgl Exp $ * ---------- */ #include "postgres.h" @@ -2026,10 +2026,8 @@ pgstat_add_backend(PgStat_MsgHdr *msg) /* Put this new backend into the slot */ beentry->procpid = msg->m_procpid; - beentry->start_sec = - GetCurrentAbsoluteTimeUsec(&beentry->start_usec); - beentry->activity_start_sec = 0; - beentry->activity_start_usec = 0; + beentry->start_timestamp = GetCurrentTimestamp(); + beentry->activity_start_timestamp = 0; beentry->activity[0] = '\0'; /* @@ -2665,8 +2663,7 @@ pgstat_recv_activity(PgStat_MsgActivity *msg, int len) StrNCpy(entry->activity, msg->m_what, PGSTAT_ACTIVITY_SIZE); - entry->activity_start_sec = - GetCurrentAbsoluteTimeUsec(&entry->activity_start_usec); + entry->activity_start_timestamp = GetCurrentTimestamp(); } diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 27b28b89f54..c1ac2ed5977 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.455 2005/06/28 05:08:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.456 2005/06/29 22:51:55 tgl Exp $ * * NOTES * @@ -118,6 +118,7 @@ #include "storage/proc.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" +#include "utils/datetime.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/ps_status.h" @@ -222,9 +223,6 @@ static bool FatalError = false; /* T if recovering from backend crash */ bool ClientAuthInProgress = false; /* T during new-client * authentication */ -/* Backend startup time */ -TimestampTz StartTime; - /* * State for assigning random salts and cancel keys. * Also, the global MyCancelKey passes the cancel key assigned to a given @@ -333,7 +331,7 @@ typedef struct InheritableSocket pgStatPipe0; InheritableSocket pgStatPipe1; pid_t PostmasterPid; - TimestampTz StartTime; + TimestampTz PgStartTime; #ifdef WIN32 HANDLE PostmasterHandle; HANDLE initial_signal_pipe; @@ -376,9 +374,6 @@ PostmasterMain(int argc, char *argv[]) char *userDoption = NULL; int i; - AbsoluteTime StartTimeSec; /* integer part */ - int StartTimeUSec; /* microsecond part */ - /* This will call exit() if strdup() fails. */ progname = get_progname(argv[0]); @@ -922,10 +917,9 @@ PostmasterMain(int argc, char *argv[]) StartupPID = StartupDataBase(); /* - * Get start up time + * Remember postmaster startup time */ - StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec); - StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec); + PgStartTime = GetCurrentTimestamp(); status = ServerLoop(); @@ -3613,7 +3607,7 @@ save_backend_variables(BackendParameters *param, Port *port, write_inheritable_socket(¶m->pgStatPipe1, pgStatPipe[1], childPid); param->PostmasterPid = PostmasterPid; - param->StartTime = StartTime; + param->PgStartTime = PgStartTime; #ifdef WIN32 param->PostmasterHandle = PostmasterHandle; @@ -3816,7 +3810,7 @@ restore_backend_variables(BackendParameters *param, Port *port) read_inheritable_socket(&pgStatPipe[1], ¶m->pgStatPipe1); PostmasterPid = param->PostmasterPid; - StartTime = param->StartTime; + PgStartTime = param->PgStartTime; #ifdef WIN32 PostmasterHandle = param->PostmasterHandle; diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index a676edd9a97..534e4796611 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.450 2005/06/22 17:45:45 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.451 2005/06/29 22:51:55 tgl Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -149,9 +149,6 @@ static int UseNewLine = 0; /* Use EOF as query delimiters */ #endif /* TCOP_DONTUSENEWLINE */ -/* Backend startup time */ -TimestampTz StartTime; - /* ---------------------------------------------------------------- * decls for routines only used in this file * ---------------------------------------------------------------- @@ -2373,9 +2370,6 @@ PostgresMain(int argc, char *argv[], const char *username) sigjmp_buf local_sigjmp_buf; volatile bool send_rfq = true; - AbsoluteTime StartTimeSec; /* integer part */ - int StartTimeUSec; /* microsecond part */ - #define PendingConfigOption(name,val) \ (guc_names = lappend(guc_names, pstrdup(name)), \ guc_values = lappend(guc_values, pstrdup(val))) @@ -2966,13 +2960,10 @@ PostgresMain(int argc, char *argv[], const char *username) pgstat_bestart(); /* - * Get stand-alone backend startup time + * Remember stand-alone backend startup time */ if (!IsUnderPostmaster) - { - StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec); - StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec); - } + PgStartTime = GetCurrentTimestamp(); /* * POSTGRES main processing loop begins here diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 260c8abb341..6ac81b2fa56 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.150 2005/05/27 21:31:23 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.151 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,6 +20,7 @@ #include #include +#include "access/xact.h" #include "miscadmin.h" #include "utils/datetime.h" #include "utils/guc.h" @@ -674,6 +675,41 @@ j2day(int date) } /* j2day() */ +/* + * GetCurrentDateTime() + * + * Get the transaction start time ("now()") broken down as a struct pg_tm. + */ +void +GetCurrentDateTime(struct pg_tm * tm) +{ + int tz; + fsec_t fsec; + + timestamp2tm(GetCurrentTransactionStartTimestamp(), &tz, tm, &fsec, + NULL, NULL); + /* Note: don't pass NULL tzp to timestamp2tm; affects behavior */ +} + +/* + * GetCurrentTimeUsec() + * + * Get the transaction start time ("now()") broken down as a struct pg_tm, + * including fractional seconds and timezone offset. + */ +void +GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) +{ + int tz; + + timestamp2tm(GetCurrentTransactionStartTimestamp(), &tz, tm, fsec, + NULL, NULL); + /* Note: don't pass NULL tzp to timestamp2tm; affects behavior */ + if (tzp != NULL) + *tzp = tz; +} + + /* TrimTrailingZeros() * ... resulting from printing numbers with full precision. */ diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index d712d9f8b46..dfbb982521f 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.133 2005/06/15 00:34:08 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.134 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -27,7 +27,7 @@ #include "miscadmin.h" #include "pgtime.h" #include "utils/builtins.h" -#include "utils/timestamp.h" +#include "utils/nabstime.h" #define MIN_DAYNUM -24856 /* December 13, 1901 */ #define MAX_DAYNUM 24854 /* January 18, 2038 */ @@ -99,84 +99,6 @@ GetCurrentAbsoluteTime(void) } -/* - * GetCurrentAbsoluteTimeUsec() - * - * Get the current system time (relative to Unix epoch), including fractional - * seconds expressed as microseconds. - */ -AbsoluteTime -GetCurrentAbsoluteTimeUsec(int *usec) -{ - time_t now; - struct timeval tp; - - gettimeofday(&tp, NULL); - now = tp.tv_sec; - *usec = tp.tv_usec; - return (AbsoluteTime) now; -} - - -/* - * AbsoluteTimeUsecToTimestampTz() - * - * Convert system time including microseconds to TimestampTz representation. - */ -TimestampTz -AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec) -{ - TimestampTz result; - -#ifdef HAVE_INT64_TIMESTAMP - result = ((sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY)) - * USECS_PER_SEC) + usec; -#else - result = sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY) - + (usec / 1000000.0); -#endif - - return result; -} - - -/* - * GetCurrentDateTime() - * - * Get the transaction start time ("now()") broken down as a struct pg_tm. - */ -void -GetCurrentDateTime(struct pg_tm * tm) -{ - int tz; - - abstime2tm(GetCurrentTransactionStartTime(), &tz, tm, NULL); -} - -/* - * GetCurrentTimeUsec() - * - * Get the transaction start time ("now()") broken down as a struct pg_tm, - * including fractional seconds and timezone offset. - */ -void -GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) -{ - int tz; - int usec; - - abstime2tm(GetCurrentTransactionStartTimeUsec(&usec), &tz, tm, NULL); - /* Note: don't pass NULL tzp to abstime2tm; affects behavior */ - if (tzp != NULL) - *tzp = tz; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = usec; -#else - *fsec = usec / 1000000.0; -#endif -} - - void abstime2tm(AbsoluteTime _time, int *tzp, struct pg_tm * tm, char **tzn) { @@ -458,15 +380,6 @@ abstime_cmp_internal(AbsoluteTime a, AbsoluteTime b) if (b == INVALID_ABSTIME) return -1; /* non-INVALID < INVALID */ -#if 0 - /* CURRENT is no longer stored internally... */ - /* XXX this is broken, should go away: */ - if (a == CURRENT_ABSTIME) - a = GetCurrentTransactionStartTime(); - if (b == CURRENT_ABSTIME) - b = GetCurrentTransactionStartTime(); -#endif - if (a > b) return 1; else if (a == b) diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 870513fb9d5..b1bd11c9c20 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.23 2005/06/28 05:09:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.24 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -341,13 +341,9 @@ pg_stat_get_backend_activity(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS) { - PgStat_StatBeEntry *beentry; - int32 beid; - AbsoluteTime sec; - int usec; + int32 beid = PG_GETARG_INT32(0); TimestampTz result; - - beid = PG_GETARG_INT32(0); + PgStat_StatBeEntry *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); @@ -355,31 +351,24 @@ pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS) if (!superuser() && beentry->userid != GetUserId()) PG_RETURN_NULL(); - sec = beentry->activity_start_sec; - usec = beentry->activity_start_usec; + result = beentry->activity_start_timestamp; /* * No time recorded for start of current query -- this is the case if * the user hasn't enabled query-level stats collection. */ - if (sec == 0 && usec == 0) + if (result == 0) PG_RETURN_NULL(); - result = AbsoluteTimeUsecToTimestampTz(sec, usec); - PG_RETURN_TIMESTAMPTZ(result); } Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS) { - PgStat_StatBeEntry *beentry; - int32 beid; - AbsoluteTime sec; - int usec; + int32 beid = PG_GETARG_INT32(0); TimestampTz result; - - beid = PG_GETARG_INT32(0); + PgStat_StatBeEntry *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); @@ -387,14 +376,11 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS) if (!superuser() && beentry->userid != GetUserId()) PG_RETURN_NULL(); - sec = beentry->start_sec; - usec = beentry->start_usec; + result = beentry->start_timestamp; - if (sec == 0 && usec == 0) + if (result == 0) /* probably can't happen? */ PG_RETURN_NULL(); - result = AbsoluteTimeUsecToTimestampTz(sec, usec); - PG_RETURN_TIMESTAMPTZ(result); } diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 204d37bf415..e8120d4e7b9 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.182 2005/06/13 23:14:48 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.183 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -105,6 +105,7 @@ #include "utils/datum.h" #include "utils/int8.h" #include "utils/lsyscache.h" +#include "utils/nabstime.h" #include "utils/pg_locale.h" #include "utils/selfuncs.h" #include "utils/syscache.h" diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 035a422bfcc..f9f4ec24b1a 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.126 2005/06/15 00:34:09 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.127 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,6 +28,8 @@ #include "parser/scansup.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/datetime.h" + /* * gcc's -ffast-math switch breaks routines that expect exact results from @@ -38,6 +40,10 @@ #endif +/* Set at postmaster start */ +TimestampTz PgStartTime; + + #ifdef HAVE_INT64_TIMESTAMP static int64 time2t(const int hour, const int min, const int sec, const fsec_t fsec); @@ -927,21 +933,39 @@ EncodeSpecialTimestamp(Timestamp dt, char *str) Datum now(PG_FUNCTION_ARGS) { - TimestampTz result; - AbsoluteTime sec; - int usec; - - sec = GetCurrentTransactionStartTimeUsec(&usec); - - result = AbsoluteTimeUsecToTimestampTz(sec, usec); - - PG_RETURN_TIMESTAMPTZ(result); + PG_RETURN_TIMESTAMPTZ(GetCurrentTransactionStartTimestamp()); } Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS) { - PG_RETURN_TIMESTAMPTZ(StartTime); + PG_RETURN_TIMESTAMPTZ(PgStartTime); +} + +/* + * GetCurrentTimestamp -- get the current operating system time + * + * Result is in the form of a TimestampTz value, and is expressed to the + * full precision of the gettimeofday() syscall + */ +TimestampTz +GetCurrentTimestamp(void) +{ + TimestampTz result; + struct timeval tp; + + gettimeofday(&tp, NULL); + + result = tp.tv_sec - + ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); + +#ifdef HAVE_INT64_TIMESTAMP + result = (result * USECS_PER_SEC) + tp.tv_usec; +#else + result = result + (tp.tv_usec / 1000000.0); +#endif + + return result; } void diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 0c6b5580688..ae5722ecb4b 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.77 2005/06/17 22:32:48 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.78 2005/06/29 22:51:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,7 +17,7 @@ #include "access/xlog.h" #include "storage/relfilenode.h" #include "nodes/pg_list.h" -#include "utils/nabstime.h" +#include "utils/timestamp.h" /* @@ -140,8 +140,7 @@ extern TransactionId GetCurrentTransactionId(void); extern TransactionId GetCurrentTransactionIdIfAny(void); extern SubTransactionId GetCurrentSubTransactionId(void); extern CommandId GetCurrentCommandId(void); -extern AbsoluteTime GetCurrentTransactionStartTime(void); -extern AbsoluteTime GetCurrentTransactionStartTimeUsec(int *usec); +extern TimestampTz GetCurrentTransactionStartTimestamp(void); extern int GetCurrentTransactionNestLevel(void); extern bool TransactionIdIsCurrentTransactionId(TransactionId xid); extern void CommandCounterIncrement(void); diff --git a/src/include/pgstat.h b/src/include/pgstat.h index b6015f536c0..5612d912909 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -5,7 +5,7 @@ * * Copyright (c) 2001-2005, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.31 2005/06/28 05:09:04 tgl Exp $ + * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.32 2005/06/29 22:51:57 tgl Exp $ * ---------- */ #ifndef PGSTAT_H @@ -13,8 +13,8 @@ #include "libpq/pqcomm.h" #include "utils/hsearch.h" -#include "utils/nabstime.h" #include "utils/rel.h" +#include "utils/timestamp.h" /* ---------- * The types of backend/postmaster -> collector messages @@ -233,10 +233,8 @@ typedef struct PgStat_StatBeEntry { /* An entry is non-empty iff procpid > 0 */ int procpid; - AbsoluteTime start_sec; - int start_usec; - AbsoluteTime activity_start_sec; - int activity_start_usec; + TimestampTz start_timestamp; + TimestampTz activity_start_timestamp; char activity[PGSTAT_ACTIVITY_SIZE]; /* diff --git a/src/include/utils/nabstime.h b/src/include/utils/nabstime.h index 4c7f1fe2d42..200004517b7 100644 --- a/src/include/utils/nabstime.h +++ b/src/include/utils/nabstime.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/nabstime.h,v 1.45 2004/12/31 22:03:46 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/utils/nabstime.h,v 1.46 2005/06/29 22:51:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -162,8 +162,6 @@ extern Datum timeofday(PG_FUNCTION_ARGS); /* non-fmgr-callable support routines */ extern AbsoluteTime GetCurrentAbsoluteTime(void); -extern AbsoluteTime GetCurrentAbsoluteTimeUsec(int *usec); -extern TimestampTz AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec); extern void abstime2tm(AbsoluteTime time, int *tzp, struct pg_tm * tm, char **tzn); #endif /* NABSTIME_H */ diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index 7475dacbe7c..1cd591326c7 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.45 2005/06/15 00:34:10 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.46 2005/06/29 22:51:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -156,6 +156,10 @@ typedef double fsec_t; #define INTERVAL_RANGE(t) (((t) >> 16) & INTERVAL_RANGE_MASK) +/* Set at postmaster start */ +extern TimestampTz PgStartTime; + + /* * timestamp.c prototypes */ @@ -258,10 +262,10 @@ extern Datum now(PG_FUNCTION_ARGS); extern Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS); -extern TimestampTz StartTime; - /* Internal routines (not fmgr-callable) */ +extern TimestampTz GetCurrentTimestamp(void); + extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt); extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, char **tzn, pg_tz *attimezone);