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