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);