Fix replica identity check for a partitioned table.
authorAmit Kapila <akapila@postgresql.org>
Tue, 16 Aug 2022 09:55:41 +0000 (15:25 +0530)
committerAmit Kapila <akapila@postgresql.org>
Tue, 16 Aug 2022 09:55:41 +0000 (15:25 +0530)
The current publisher code checks if UPDATE or DELETE can be executed with
the replica identity of the table even if it's a partitioned table. We can
skip checking the replica identity for partitioned tables because the
operations are actually performed on the leaf partitions (not the
partitioned table).

Reported-by: Brad Nicholson
Author: Hou Zhijie
Reviewed-by: Peter Smith, Amit Kapila
Backpatch-through: 13
Discussion: https://postgr.es/m/CAMMnM%3D8i5DohH%3DYKzV0_wYuYSYvuOJoL9F5nzXTc%2ByzsG1f6rg%40mail.gmail.com

src/backend/executor/execReplication.c
src/test/regress/expected/publication.out
src/test/regress/sql/publication.sql

index b000645d48b9f1d6c11a899ee718937e428835a4..6014f2e248292fc4768ebad3bea6a9be0a646b2d 100644 (file)
@@ -569,6 +569,13 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd)
 {
        PublicationDesc pubdesc;
 
+       /*
+        * Skip checking the replica identity for partitioned tables, because the
+        * operations are actually performed on the leaf partitions.
+        */
+       if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
+               return;
+
        /* We only need to do checks for UPDATE and DELETE. */
        if (cmd != CMD_UPDATE && cmd != CMD_DELETE)
                return;
index 428c1f16c7c6462ba505e7045c4856825a797db4..e6e082de2f58c8851892d51a3ada16431b8fb314 100644 (file)
@@ -214,6 +214,8 @@ ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted;
 Tables:
     "public.testpub_parted"
 
+-- works despite missing REPLICA IDENTITY, because no actual update happened
+UPDATE testpub_parted SET a = 1 WHERE false;
 -- should now fail, because parent's publication replicates updates
 UPDATE testpub_parted1 SET a = 1;
 ERROR:  cannot update table "testpub_parted1" because it does not have a replica identity and publishes updates
index 9eb86fd54f80f99b87ad87fae27f682b7c5130ad..a56387edee3d3497da856331882639d126e10e96 100644 (file)
@@ -119,6 +119,8 @@ UPDATE testpub_parted1 SET a = 1;
 -- only parent is listed as being in publication, not the partition
 ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted;
 \dRp+ testpub_forparted
+-- works despite missing REPLICA IDENTITY, because no actual update happened
+UPDATE testpub_parted SET a = 1 WHERE false;
 -- should now fail, because parent's publication replicates updates
 UPDATE testpub_parted1 SET a = 1;
 ALTER TABLE testpub_parted DETACH PARTITION testpub_parted1;