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 17 Mar 2006 20:04:27 -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 --- 6177,6182 ---- *************** *** 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 ! --- 6184,6202 ---- 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. Index: src/backend/access/transam/xact.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/access/transam/xact.c,v retrieving revision 1.217 diff -c -c -r1.217 xact.c *** src/backend/access/transam/xact.c 5 Mar 2006 15:58:22 -0000 1.217 --- src/backend/access/transam/xact.c 17 Mar 2006 20:04:29 -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,460 ---- } /* + * GetCurrentStatementStartTimestamp + */ + TimestampTz + GetCurrentStatementStartTimestamp(void) + { + return stmtStartTimestamp; + } + + /* + * SetCurrentStatementStartTimestamp + */ + void + SetCurrentStatementStartTimestamp(void) + { + TransactionState s = CurrentTransactionState; + + /* + * If it is a single-statement transaction, transaction_timestamp() + * and statement_timestamp() should be identical, so only set + * stmtStartTimestamp in the multi-statement case. + */ + if (s->blockState == TBLOCK_INPROGRESS) + 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 --- 1394,1402 ---- XactLockTableInsert(s->transactionId); /* ! * set now() and statement_timestamp(), should be the same time */ ! xactStartTimestamp = stmtStartTimestamp = GetCurrentTimestamp(); /* * initialize current transaction state fields Index: src/backend/tcop/postgres.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/tcop/postgres.c,v retrieving revision 1.482 diff -c -c -r1.482 postgres.c *** src/backend/tcop/postgres.c 14 Mar 2006 22:48:21 -0000 1.482 --- src/backend/tcop/postgres.c 17 Mar 2006 20:04:30 -0000 *************** *** 1997,2002 **** --- 1997,2004 ---- (errmsg_internal("StartTransactionCommand"))); StartTransactionCommand(); + SetCurrentStatementStartTimestamp(); + /* Set statement timeout running, if any */ if (StatementTimeout > 0) enable_sig_alarm(StatementTimeout, true); 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 17 Mar 2006 20:04:33 -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.80 diff -c -c -r1.80 xact.h *** src/include/access/xact.h 5 Mar 2006 15:58:54 -0000 1.80 --- src/include/access/xact.h 17 Mar 2006 20:04:34 -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.404 diff -c -c -r1.404 pg_proc.h *** src/include/catalog/pg_proc.h 10 Mar 2006 20:15:26 -0000 1.404 --- src/include/catalog/pg_proc.h 17 Mar 2006 20:04:42 -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 = 2597 ( transaction_timestamp PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ now - _null_ )); + DESCR("current transaction time"); + DATA(insert OID = 2598 ( 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 = 2599 ( 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 17 Mar 2006 20:04:43 -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);