Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/func.sgml,v
retrieving revision 1.254
diff -c -c -r1.254 func.sgml
*** doc/src/sgml/func.sgml 13 Jun 2005 02:40:04 -0000 1.254
--- doc/src/sgml/func.sgml 14 Jun 2005 20:59:17 -0000
***************
*** 8120,8125 ****
--- 8120,8131 ----
+ pg_postmaster_start_time()
+ timestamp with time zone
+ postmaster> start time
+
+
+
user
name
equivalent to current_user
***************
*** 8217,8222 ****
--- 8223,8237 ----
+ pg_postmaster_start_time
+
+
+
+ pg_postmaster_start_time() returns the timestamp with time zone
+ when the postmaster> started.
+
+
+
version
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.452
diff -c -c -r1.452 postmaster.c
*** src/backend/postmaster/postmaster.c 9 Jun 2005 22:01:12 -0000 1.452
--- src/backend/postmaster/postmaster.c 14 Jun 2005 20:59:21 -0000
***************
*** 222,227 ****
--- 222,230 ----
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,335 ****
--- 333,339 ----
InheritableSocket pgStatPipe0;
InheritableSocket pgStatPipe1;
pid_t PostmasterPid;
+ TimestampTz StartTime;
#ifdef WIN32
HANDLE PostmasterHandle;
HANDLE initial_signal_pipe;
***************
*** 372,377 ****
--- 376,384 ----
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,919 ****
--- 921,932 ----
*/
StartupPID = StartupDataBase();
+ /*
+ * Get start up time
+ */
+ StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec);
+ StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec);
+
status = ServerLoop();
/*
***************
*** 3603,3608 ****
--- 3616,3622 ----
write_inheritable_socket(¶m->pgStatPipe1, pgStatPipe[1], childPid);
param->PostmasterPid = PostmasterPid;
+ param->StartTime = StartTime;
#ifdef WIN32
param->PostmasterHandle = PostmasterHandle;
***************
*** 3805,3810 ****
--- 3819,3825 ----
read_inheritable_socket(&pgStatPipe[1], ¶m->pgStatPipe1);
PostmasterPid = param->PostmasterPid;
+ StartTime = param->StartTime;
#ifdef WIN32
PostmasterHandle = param->PostmasterHandle;
Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.447
diff -c -c -r1.447 postgres.c
*** src/backend/tcop/postgres.c 3 Jun 2005 23:05:29 -0000 1.447
--- src/backend/tcop/postgres.c 14 Jun 2005 20:59:22 -0000
***************
*** 149,154 ****
--- 149,157 ----
#endif /* TCOP_DONTUSENEWLINE */
+ /* Backend startup time */
+ TimestampTz StartTime;
+
/* ----------------------------------------------------------------
* decls for routines only used in this file
* ----------------------------------------------------------------
***************
*** 2380,2385 ****
--- 2383,2391 ----
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)))
***************
*** 2970,2975 ****
--- 2976,2990 ----
pgstat_bestart();
/*
+ * Get stand-alone backend startup time
+ */
+ if (!IsUnderPostmaster)
+ {
+ StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec);
+ StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec);
+ }
+
+ /*
* POSTGRES main processing loop begins here
*
* If an exception is encountered, processing resumes here so we abort
Index: src/backend/utils/adt/timestamp.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.124
diff -c -c -r1.124 timestamp.c
*** src/backend/utils/adt/timestamp.c 26 May 2005 02:04:13 -0000 1.124
--- src/backend/utils/adt/timestamp.c 14 Jun 2005 20:59:24 -0000
***************
*** 938,943 ****
--- 938,949 ----
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)
{
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.366
diff -c -c -r1.366 pg_proc.h
*** src/include/catalog/pg_proc.h 13 Jun 2005 02:26:50 -0000 1.366
--- src/include/catalog/pg_proc.h 14 Jun 2005 20:59:29 -0000
***************
*** 3651,3656 ****
--- 3651,3660 ----
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
Index: src/include/utils/timestamp.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/utils/timestamp.h,v
retrieving revision 1.43
diff -c -c -r1.43 timestamp.h
*** src/include/utils/timestamp.h 25 May 2005 21:40:42 -0000 1.43
--- src/include/utils/timestamp.h 14 Jun 2005 20:59:30 -0000
***************
*** 256,261 ****
--- 256,265 ----
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);