diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index aae6adc15c..440b6aac4b 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1552,7 +1552,10 @@ exec_replication_command(const char *cmd_string) DestReceiver *dest = CreateDestReceiver(DestRemoteSimple); VariableShowStmt *n = (VariableShowStmt *) cmd_node; + /* syscache access needs a transaction environment */ + StartTransactionCommand(); GetPGVariable(n->name, dest); + CommitTransactionCommand(); } break; diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl index beb45551a2..f6659d3959 100644 --- a/src/test/recovery/t/001_stream_rep.pl +++ b/src/test/recovery/t/001_stream_rep.pl @@ -3,11 +3,14 @@ use strict; use warnings; use PostgresNode; use TestLib; -use Test::More tests => 26; +use Test::More tests => 32; # Initialize master node my $node_master = get_new_node('master'); -$node_master->init(allows_streaming => 1); +# A specific role is created to perform some tests related to replication, +# and it needs proper authentication configuration. +$node_master->init(allows_streaming => 1, + auth_extra => ['--create-role', 'repl_role']); $node_master->start; my $backup_name = 'my_backup'; @@ -117,6 +120,55 @@ test_target_session_attrs($node_master, $node_standby_1, $node_master, "any", test_target_session_attrs($node_standby_1, $node_master, $node_standby_1, "any", 0); +# Test for SHOW commands using a WAL sender connection with a replication +# role. +note "testing SHOW commands for replication connection"; + +$node_master->psql('postgres'," +CREATE ROLE repl_role REPLICATION LOGIN; +GRANT pg_read_all_settings TO repl_role;"); +my $master_host = $node_master->host; +my $master_port = $node_master->port; +my $connstr_common = "host=$master_host port=$master_port user=repl_role"; +my $connstr_rep = "$connstr_common replication=1"; +my $connstr_db = "$connstr_common replication=database dbname=postgres"; + +# Test SHOW ALL +my ($ret, $stdout, $stderr) = + $node_master->psql('postgres', 'SHOW ALL;', + on_error_die => 1, + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "SHOW ALL with replication role and physical replication"); +($ret, $stdout, $stderr) = + $node_master->psql('postgres', 'SHOW ALL;', + on_error_die => 1, + extra_params => [ '-d', $connstr_db ]); +ok($ret == 0, "SHOW ALL with replication role and logical replication"); + +# Test SHOW with a user-settable parameter +($ret, $stdout, $stderr) = + $node_master->psql('postgres', 'SHOW work_mem;', + on_error_die => 1, + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "SHOW with user-settable parameter, replication role and physical replication"); +($ret, $stdout, $stderr) = + $node_master->psql('postgres', 'SHOW work_mem;', + on_error_die => 1, + extra_params => [ '-d', $connstr_db ]); +ok($ret == 0, "SHOW with user-settable parameter, replication role and logical replication"); + +# Test SHOW with a superuser-settable parameter +($ret, $stdout, $stderr) = + $node_master->psql('postgres', 'SHOW primary_conninfo;', + on_error_die => 1, + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "SHOW with superuser-settable parameter, replication role and physical replication"); +($ret, $stdout, $stderr) = + $node_master->psql('postgres', 'SHOW primary_conninfo;', + on_error_die => 1, + extra_params => [ '-d', $connstr_db ]); +ok($ret == 0, "SHOW with superuser-settable parameter, replication role and logical replication"); + note "switching to physical replication slot"; # Switch to using a physical replication slot. We can do this without a new