]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
049_wait_for_lsn.pl: create function and procedure at once
authorAlexander Korotkov <akorotkov@postgresql.org>
Mon, 20 Apr 2026 10:05:55 +0000 (13:05 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Mon, 20 Apr 2026 10:05:55 +0000 (13:05 +0300)
Create the PL/pgSQL function and procedure for the top-level WAIT FOR
checks in a single transaction, then wait once for standby replay before
running both tests.  Also revise some surrounding comments.

This avoids an extra 'wait_for_catchup()' on the delayed standby without
changing the test coverage.

Discussion: https://postgr.es/m/CABPTF7WZ1yuYz8V%3Dxsbghg8e7qaAm5MpyNw6BthWcbN7%2BP6biw%40mail.gmail.com
Author: Xuneng Zhou <xunengzhou@gmail.com>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
src/test/recovery/t/049_wait_for_lsn.pl

index 8358c57f7b7b83127db62758722839dc3fd73833..0e74175f9ebbc57f665f857c1b6c93af6d3810ab 100644 (file)
@@ -172,8 +172,8 @@ ok($output eq "timeout", "WAIT FOR returns correct status after timeout");
 
 # 5. Check mode validation: standby modes error on primary, primary mode errors
 # on standby, and primary_flush works on primary.  Also check that WAIT FOR
-# triggers an error if called within another function or inside a transaction
-# with an isolation level higher than READ COMMITTED.
+# triggers an error if called within a function, procedure, anonymous DO block,
+# or inside a transaction with an isolation level higher than READ COMMITTED.
 
 # Test standby_flush on primary - should error
 $node_primary->psql(
@@ -200,6 +200,8 @@ ok( $stderr =~
        "get an error when running in a transaction with an isolation level higher than REPEATABLE READ"
 );
 
+# Test wrapping WAIT FOR into function, procedure, and anonymous DO block --
+# should error
 $node_primary->safe_psql(
        'postgres', qq[
 CREATE FUNCTION pg_wal_replay_wait_wrap(target_lsn pg_lsn) RETURNS void AS \$\$
@@ -208,18 +210,7 @@ CREATE FUNCTION pg_wal_replay_wait_wrap(target_lsn pg_lsn) RETURNS void AS \$\$
   END
 \$\$
 LANGUAGE plpgsql;
-]);
-
-$node_primary->wait_for_catchup($node_standby);
-$node_standby->psql(
-       'postgres',
-       "SELECT pg_wal_replay_wait_wrap('${lsn3}');",
-       stderr => \$stderr);
-ok($stderr =~ /WAIT FOR can only be executed as a top-level statement/,
-       "get an error when running within a function");
 
-$node_primary->safe_psql(
-       'postgres', qq[
 CREATE PROCEDURE pg_wal_replay_wait_proc(target_lsn pg_lsn) AS \$\$
   BEGIN
     EXECUTE format('WAIT FOR LSN %L;', target_lsn);
@@ -229,6 +220,13 @@ LANGUAGE plpgsql;
 ]);
 
 $node_primary->wait_for_catchup($node_standby);
+$node_standby->psql(
+       'postgres',
+       "SELECT pg_wal_replay_wait_wrap('${lsn3}');",
+       stderr => \$stderr);
+ok($stderr =~ /WAIT FOR can only be executed as a top-level statement/,
+       "get an error when running within a function");
+
 $node_standby->psql(
        'postgres',
        "CALL pg_wal_replay_wait_proc('${lsn3}');",