Re: transction_timestamp() inside of procedures

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Bruce Momjian <bruce@momjian.us>, Peter Eisentraut <peter_e@gmx.net>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2018-09-25T21:50:02Z
Lists: pgsql-hackers
Hi,

On 2018-09-20 19:40:40 -0400, Bruce Momjian wrote:
> This function shows that only clock_timestamp() advances inside a
> procedure, not statement_timestamp() or transaction_timestamp():
> 
> 	CREATE OR REPLACE PROCEDURE test_timestamp () AS $$
> 	DECLARE
> 	        str TEXT;
> 	BEGIN
> 	        WHILE TRUE LOOP
> 	                -- clock_timestamp() is updated on every loop
> 	                SELECT clock_timestamp() INTO str;
> 	                RAISE NOTICE 'clock       %', str;
> 	                SELECT statement_timestamp() INTO str;
> 	                RAISE NOTICE 'statement   %', str;
> 	                SELECT transaction_timestamp() INTO str;
> 	                RAISE NOTICE 'transaction %', str;
> 	                COMMIT;
> 	
> 	                PERFORM pg_sleep(2);
> 	        END LOOP;
> 	END
> 	$$ LANGUAGE plpgsql;
> 
> 	CALL test_timestamp();
> 	NOTICE:  clock       2018-09-20 19:38:22.575794-04
> 	NOTICE:  statement   2018-09-20 19:38:22.575685-04
> 	NOTICE:  transaction 2018-09-20 19:38:22.575685-04
> 
> -->	NOTICE:  clock       2018-09-20 19:38:24.578027-04
> 	NOTICE:  statement   2018-09-20 19:38:22.575685-04
> 	NOTICE:  transaction 2018-09-20 19:38:22.575685-04
> 
> This surprised me since I expected a new timestamp after commit.  Is
> this something we want to change or document?  Are there other
> per-transaction behaviors we should adjust?

ISTM this is an issue that belongs on the open items list. Peter, could
you comment?

Greetings,

Andres Freund


Commits

  1. Advance transaction timestamp for intra-procedure transactions.