diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 22baa22aa6..43df7d595c 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,5 +1,5 @@ @@ -8119,6 +8119,12 @@ select current_date + s.a as dates from generate_series(0,14,7) as s(a); session user name + + pg_postmaster_start_time() + timestamp with time zone + postmaster start time + + user name @@ -8216,6 +8222,15 @@ SET search_path TO schema , schema, .. Unix-domain socket. + + pg_postmaster_start_time + + + + pg_postmaster_start_time() returns the timestamp with time zone + when the postmaster started. + + version diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index af28bf652f..03057dbcb2 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.452 2005/06/09 22:01:12 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.453 2005/06/14 21:04:39 momjian Exp $ * * NOTES * @@ -222,6 +222,9 @@ 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 @@ -330,6 +333,7 @@ typedef struct InheritableSocket pgStatPipe0; InheritableSocket pgStatPipe1; pid_t PostmasterPid; + TimestampTz StartTime; #ifdef WIN32 HANDLE PostmasterHandle; HANDLE initial_signal_pipe; @@ -372,6 +376,9 @@ 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]); @@ -914,6 +921,12 @@ PostmasterMain(int argc, char *argv[]) */ StartupPID = StartupDataBase(); + /* + * Get start up time + */ + StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec); + StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec); + status = ServerLoop(); /* @@ -3603,6 +3616,7 @@ save_backend_variables(BackendParameters *param, Port *port, write_inheritable_socket(¶m->pgStatPipe1, pgStatPipe[1], childPid); param->PostmasterPid = PostmasterPid; + param->StartTime = StartTime; #ifdef WIN32 param->PostmasterHandle = PostmasterHandle; @@ -3805,6 +3819,7 @@ restore_backend_variables(BackendParameters *param, Port *port) read_inheritable_socket(&pgStatPipe[1], ¶m->pgStatPipe1); PostmasterPid = param->PostmasterPid; + StartTime = param->StartTime; #ifdef WIN32 PostmasterHandle = param->PostmasterHandle; diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 58b1ffbce9..f1c65bacc4 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.447 2005/06/03 23:05:29 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.448 2005/06/14 21:04:40 momjian Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -149,6 +149,9 @@ 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 * ---------------------------------------------------------------- @@ -2380,6 +2383,9 @@ 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))) @@ -2969,6 +2975,15 @@ PostgresMain(int argc, char *argv[], const char *username) */ pgstat_bestart(); + /* + * Get stand-alone backend startup time + */ + if (!IsUnderPostmaster) + { + StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec); + StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec); + } + /* * POSTGRES main processing loop begins here * diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 27e0523f49..37308d7451 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.124 2005/05/26 02:04:13 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.125 2005/06/14 21:04:40 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -938,6 +938,12 @@ now(PG_FUNCTION_ARGS) PG_RETURN_TIMESTAMPTZ(result); } +Datum +pgsql_postmaster_start_time(PG_FUNCTION_ARGS) +{ + PG_RETURN_TIMESTAMPTZ(StartTime); +} + void dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec) { diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index bc5d8afefa..c06c4a7d41 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.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/catalog/pg_proc.h,v 1.366 2005/06/13 02:26:50 tgl Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.367 2005/06/14 21:04:41 momjian Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -3651,6 +3651,10 @@ DESCR("convert boolean to int4"); DATA(insert OID = 2559 ( lastval PGNSP PGUID 12 f f t f v 0 20 "" _null_ _null_ _null_ lastval - _null_ )); DESCR("current value from last used sequence"); +/* start time function */ +DATA(insert OID = 2560 ( pg_postmaster_start_time PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ pgsql_postmaster_start_time - _null_ )); +DESCR("postmaster start time"); + /* * Symbolic values for provolatile column: these indicate whether the result diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index cfd5e1458c..782b75ec8d 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.43 2005/05/25 21:40:42 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.44 2005/06/14 21:04:42 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -256,6 +256,10 @@ extern Datum timestamptz_part(PG_FUNCTION_ARGS); extern Datum now(PG_FUNCTION_ARGS); +extern Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS); + +extern TimestampTz StartTime; + /* Internal routines (not fmgr-callable) */ extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt);