Fix error with CREATE PUBLICATION, wal_level=minimal, and new tables.
authorNoah Misch
Sat, 30 Jan 2021 08:11:38 +0000 (00:11 -0800)
committerNoah Misch
Sat, 30 Jan 2021 08:12:05 +0000 (00:12 -0800)
CREATE PUBLICATION has failed spuriously when applied to a permanent
relation created or rewritten in the current transaction.  Make the same
change to another site having the same semantic intent; the second
instance has no user-visible consequences.  Back-patch to v13, where
commit c6b92041d38512a4176ed76ad06f713d2e6c01a8 broke this.

Kyotaro Horiguchi

Discussion: https://postgr.es/m/20210113.160705.2225256954956139776[email protected]

src/backend/catalog/pg_publication.c
src/backend/optimizer/util/plancat.c
src/test/subscription/t/001_rep_changes.pl

index 09946be788de31192c585defc383fb2d30374399..61bed1d481b0bf465521f53c058d52ce4952f297 100644 (file)
@@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel)
                 errdetail("System tables cannot be added to publications.")));
 
    /* UNLOGGED and TEMP relations cannot be part of publication. */
-   if (!RelationNeedsWAL(targetrel))
+   if (targetrel->rd_rel->relpersistence != RELPERSISTENCE_PERMANENT)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                 errmsg("table \"%s\" cannot be replicated",
index 3c7f3087a8b526b1aebdc38445354337e7625712..8a0fed8ab6ed9fa3b94ecb6ddeded9493820caa6 100644 (file)
@@ -126,7 +126,8 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
    relation = table_open(relationObjectId, NoLock);
 
    /* Temporary and unlogged relations are inaccessible during recovery. */
-   if (!RelationNeedsWAL(relation) && RecoveryInProgress())
+   if (relation->rd_rel->relpersistence != RELPERSISTENCE_PERMANENT &&
+       RecoveryInProgress())
        ereport(ERROR,
                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                 errmsg("cannot access temporary or unlogged relations during recovery")));
index 0680f44a1aa5d95aec52a5a2351257a3ce1ba6b4..3d90f81e7e60decf701abd544cc931fe1190963c 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 use PostgresNode;
 use TestLib;
-use Test::More tests => 23;
+use Test::More tests => 24;
 
 # Initialize publisher node
 my $node_publisher = get_new_node('publisher');
@@ -358,3 +358,21 @@ is($result, qq(0), 'check replication origin was dropped on subscriber');
 
 $node_subscriber->stop('fast');
 $node_publisher->stop('fast');
+
+# CREATE PUBLICATION while wal_level=minimal should succeed, with a WARNING
+$node_publisher->append_conf(
+   'postgresql.conf', qq(
+wal_level=minimal
+max_wal_senders=0
+));
+$node_publisher->start;
+($result, my $retout, my $reterr) = $node_publisher->psql(
+   'postgres', qq{
+BEGIN;
+CREATE TABLE skip_wal();
+CREATE PUBLICATION tap_pub2 FOR TABLE skip_wal;
+ROLLBACK;
+});
+ok( $reterr =~
+     m/WARNING:  wal_level is insufficient to publish logical changes/,
+   'CREATE PUBLICATION while wal_level=minimal');