Index: doc/src/sgml/func.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/func.sgml,v retrieving revision 1.313 diff -c -c -r1.313 func.sgml *** doc/src/sgml/func.sgml 10 Mar 2006 20:15:25 -0000 1.313 --- doc/src/sgml/func.sgml 23 Apr 2006 02:26:19 -0000 *************** *** 5303,5308 **** --- 5303,5317 ---- now + transaction_timestamp + + + statement_timestamp + + + clock_timestamp + + timeofday *************** *** 5358,5364 **** current_timestamp timestamp with time zone ! Date and time; see --- 5367,5373 ---- current_timestamp timestamp with time zone ! Date and time of start of current transaction; see *************** *** 5474,5481 **** now() timestamp with time zone ! Current date and time (equivalent to ! current_timestamp); see --- 5483,5518 ---- now() timestamp with time zone ! Date and time of start of current transaction (equivalent to ! CURRENT_TIMESTAMP); see ! ! ! ! ! ! ! transaction_timestamp() ! timestamp with time zone ! Date and time of start of current transaction (equivalent to ! CURRENT_TIMESTAMP); see ! ! ! ! ! ! ! statement_timestamp() ! timestamp with time zone ! Date and time of start of current statement; see ! ! ! ! ! ! ! clock_timestamp() ! timestamp with time zone ! Current date and time (changes during statement execution); see *************** *** 5484,5490 **** timeofday() text ! Current date and time; see --- 5521,5528 ---- timeofday() text ! Current date and time (like clock_timestamp), but as a Unix-style text value; ! see *************** *** 6072,6078 **** ! Current Date/Time date --- 6110,6116 ---- ! Date/Time of Transaction Start date *************** *** 6085,6092 **** ! The following functions are available to obtain the current date and/or ! time: CURRENT_DATE CURRENT_TIME --- 6123,6130 ---- ! The following functions are available to obtain the date and/or ! time of the start of the current transaction: CURRENT_DATE CURRENT_TIME *************** *** 6147,6158 **** - The function now() is the traditional - PostgreSQL equivalent to - CURRENT_TIMESTAMP. - - - It is important to know that CURRENT_TIMESTAMP and related functions return the start time of the current transaction; their values do not --- 6185,6190 ---- *************** *** 6160,6185 **** the intent is to allow a single transaction to have a consistent notion of the current time, so that multiple modifications within the same transaction bear the same ! time stamp. ! ! ! Other database systems may advance these values more ! frequently. ! ! ! There is also the function timeofday() which ! returns the wall-clock time and advances during transactions. For ! historical reasons timeofday() returns a ! text string rather than a timestamp ! value: ! ! SELECT timeofday(); ! Result: Sat Feb 17 19:07:32.000126 2001 EST ! --- 6192,6222 ---- the intent is to allow a single transaction to have a consistent notion of the current time, so that multiple modifications within the same transaction bear the same ! time stamp. Consider using statement_timestamp or ! clock_timestamp if you need something that changes ! more frequently. ! ! CURRENT_TIMESTAMP might not be the ! transaction start time on other database systems. ! For this reason, and for completeness, ! transaction_timestamp is provided. ! The function now() is the traditional ! PostgreSQL equivalent to ! the SQL-standard CURRENT_TIMESTAMP. ! ! STATEMENT_TIMESTAMP is the time the statement ! arrived at the server from the client. It is not the time ! the command started execution. If multiple commands were ! sent as a single query string to the server, each command ! has the same STATEMENT_TIMESTAMP because they ! all arrived at the same time. Also, commands executed ! by server-side functions have a STATEMENT_TIMESTAMP ! based on the time the client sent the query that triggered ! the function, not the time the function was executed. Index: src/backend/access/transam/xact.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/access/transam/xact.c,v retrieving revision 1.219 diff -c -c -r1.219 xact.c *** src/backend/access/transam/xact.c 29 Mar 2006 21:17:37 -0000 1.219 --- src/backend/access/transam/xact.c 23 Apr 2006 02:26:21 -0000 *************** *** 172,177 **** --- 172,178 ---- * keep it inside the TransactionState stack. */ static TimestampTz xactStartTimestamp; + static TimestampTz stmtStartTimestamp; /* * GID to be used for preparing the current transaction. This is also *************** *** 428,433 **** --- 429,452 ---- } /* + * GetCurrentStatementStartTimestamp + */ + TimestampTz + GetCurrentStatementStartTimestamp(void) + { + return stmtStartTimestamp; + } + + /* + * SetCurrentStatementStartTimestamp + */ + void + SetCurrentStatementStartTimestamp(void) + { + stmtStartTimestamp = GetCurrentTimestamp(); + } + + /* * GetCurrentTransactionNestLevel * * Note: this will return zero when not inside any transaction, one when *************** *** 1367,1375 **** XactLockTableInsert(s->transactionId); /* ! * set now() */ ! xactStartTimestamp = GetCurrentTimestamp(); /* * initialize current transaction state fields --- 1386,1394 ---- XactLockTableInsert(s->transactionId); /* ! * now() and statement_timestamp() should be the same time */ ! xactStartTimestamp = stmtStartTimestamp; /* * initialize current transaction state fields Index: src/backend/tcop/postgres.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/tcop/postgres.c,v retrieving revision 1.485 diff -c -c -r1.485 postgres.c *** src/backend/tcop/postgres.c 22 Apr 2006 01:26:00 -0000 1.485 --- src/backend/tcop/postgres.c 23 Apr 2006 02:26:24 -0000 *************** *** 2000,2006 **** /* ! * Convenience routines for starting/committing a single command. */ static void start_xact_command(void) --- 2000,2008 ---- /* ! * Check if the newly-arrived query string needs to have an implicit ! * transaction started. Also set statement_timestamp() and optionally ! * statement_timeout. */ static void start_xact_command(void) *************** *** 2009,2014 **** --- 2011,2018 ---- { ereport(DEBUG3, (errmsg_internal("StartTransactionCommand"))); + + SetCurrentStatementStartTimestamp(); StartTransactionCommand(); /* Set statement timeout running, if any */ Index: src/backend/utils/adt/timestamp.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v retrieving revision 1.162 diff -c -c -r1.162 timestamp.c *** src/backend/utils/adt/timestamp.c 6 Mar 2006 22:49:16 -0000 1.162 --- src/backend/utils/adt/timestamp.c 23 Apr 2006 02:26:26 -0000 *************** *** 920,925 **** --- 920,937 ---- } Datum + statement_timestamp(PG_FUNCTION_ARGS) + { + PG_RETURN_TIMESTAMPTZ(GetCurrentStatementStartTimestamp()); + } + + Datum + clock_timestamp(PG_FUNCTION_ARGS) + { + PG_RETURN_TIMESTAMPTZ(GetCurrentTimestamp()); + } + + Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS) { PG_RETURN_TIMESTAMPTZ(PgStartTime); Index: src/include/access/xact.h =================================================================== RCS file: /cvsroot/pgsql/src/include/access/xact.h,v retrieving revision 1.81 diff -c -c -r1.81 xact.h *** src/include/access/xact.h 24 Mar 2006 04:32:13 -0000 1.81 --- src/include/access/xact.h 23 Apr 2006 02:26:27 -0000 *************** *** 141,146 **** --- 141,148 ---- extern SubTransactionId GetCurrentSubTransactionId(void); extern CommandId GetCurrentCommandId(void); extern TimestampTz GetCurrentTransactionStartTimestamp(void); + extern TimestampTz GetCurrentStatementStartTimestamp(void); + extern void SetCurrentStatementStartTimestamp(void); extern int GetCurrentTransactionNestLevel(void); extern bool TransactionIdIsCurrentTransactionId(TransactionId xid); extern void CommandCounterIncrement(void); Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /cvsroot/pgsql/src/include/catalog/pg_proc.h,v retrieving revision 1.405 diff -c -c -r1.405 pg_proc.h *** src/include/catalog/pg_proc.h 5 Apr 2006 22:11:55 -0000 1.405 --- src/include/catalog/pg_proc.h 23 Apr 2006 02:26:33 -0000 *************** *** 1614,1619 **** --- 1614,1625 ---- DESCR("convert time with time zone and date to timestamp with time zone"); DATA(insert OID = 1299 ( now PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ now - _null_ )); DESCR("current transaction time"); + DATA(insert OID = 2647 ( transaction_timestamp PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ now - _null_ )); + DESCR("current transaction time"); + DATA(insert OID = 2648 ( statement_timestamp PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ statement_timestamp - _null_ )); + DESCR("current statement time"); + DATA(insert OID = 2649 ( clock_timestamp PGNSP PGUID 12 f f t f v 0 1184 "" _null_ _null_ _null_ clock_timestamp - _null_ )); + DESCR("current clock time"); /* OIDS 1300 - 1399 */ Index: src/include/utils/timestamp.h =================================================================== RCS file: /cvsroot/pgsql/src/include/utils/timestamp.h,v retrieving revision 1.59 diff -c -c -r1.59 timestamp.h *** src/include/utils/timestamp.h 6 Mar 2006 22:49:17 -0000 1.59 --- src/include/utils/timestamp.h 23 Apr 2006 02:26:36 -0000 *************** *** 284,289 **** --- 284,291 ---- extern Datum timestamptz_part(PG_FUNCTION_ARGS); extern Datum now(PG_FUNCTION_ARGS); + extern Datum statement_timestamp(PG_FUNCTION_ARGS); + extern Datum clock_timestamp(PG_FUNCTION_ARGS); extern Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS);