diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index 99d65beac6b..24df3490827 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -400,6 +400,11 @@ BeginCopyTo(ParseState *pstate, RelationGetRelationName(rel)))); } + /* Temporary and unlogged relations are inaccessible during recovery. */ + if (rel != NULL && !RelationIsPermanent(rel) && RecoveryInProgress()) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access temporary or unlogged relations during recovery"))); /* Allocate workspace and zero all fields */ cstate = (CopyToStateData *) palloc0(sizeof(CopyToStateData)); diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl index 2a1bc81506b..e3d2159345e 100644 --- a/src/test/recovery/t/001_stream_rep.pl +++ b/src/test/recovery/t/001_stream_rep.pl @@ -6,7 +6,7 @@ use strict; use warnings; use PostgresNode; use TestLib; -use Test::More tests => 49; +use Test::More tests => 50; # Initialize primary node my $node_primary = get_new_node('primary'); @@ -62,6 +62,20 @@ $result = print "standby 2: $result\n"; is($result, qq(1002), 'check streamed content on standby 2'); +# Check that COPY TO rejects unlogged tables on standby +$node_primary->safe_psql( + 'postgres', q{ +CREATE UNLOGGED TABLE ultab (a int); +}); +$node_primary->wait_for_catchup($node_standby_1, 'replay', + $node_primary->lsn('flush')); +my ($copy_ret, $copy_stdout, $copy_stderr) = + $node_standby_1->psql('postgres', 'COPY ultab TO STDOUT'); +like( + $copy_stderr, + qr/cannot access temporary or unlogged relations during recovery/, + 'COPY TO of unlogged table on standby 1'); + # Check that only READ-only queries can run on standbys is($node_standby_1->psql('postgres', 'INSERT INTO tab_int VALUES (1)'), 3, 'read-only queries on standby 1');