]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Ignore generated columns during apply of update/delete.
authorAmit Kapila <akapila@postgresql.org>
Thu, 23 Mar 2023 06:16:16 +0000 (11:46 +0530)
committerAmit Kapila <akapila@postgresql.org>
Thu, 23 Mar 2023 06:16:16 +0000 (11:46 +0530)
We fail to apply updates and deletes when the REPLICA IDENTITY FULL is
used for the table having generated columns. We didn't use to ignore
generated columns while doing tuple comparison among the tuples from
the publisher and subscriber during apply of updates and deletes.

Author: Onder Kalaci
Reviewed-by: Shi yu, Amit Kapila
Backpatch-through: 12
Discussion: https://postgr.es/m/CACawEhVQC9WoofunvXg12aXtbqKnEgWxoRx3+v8q32AWYsdpGg@mail.gmail.com

src/backend/executor/execReplication.c
src/test/subscription/t/100_bugs.pl

index f37119670e945a680f19660e4eaad93d63bb2f8a..125f1367d1a651274c7f17ab3f0b929a01e08f09 100644 (file)
@@ -246,9 +246,10 @@ tuples_equal(TupleTableSlot *slot1, TupleTableSlot *slot2,
                att = TupleDescAttr(slot1->tts_tupleDescriptor, attrnum);
 
                /*
-                * Ignore dropped columns as the publisher doesn't send those
+                * Ignore dropped and generated columns as the publisher doesn't send
+                * those
                 */
-               if (att->attisdropped)
+               if (att->attisdropped || att->attgenerated)
                        continue;
 
                /*
index e8ad45f4263540443e82da07792926b5fd3d4bff..61c9f538e3d6a6126db82901f3ecb18bb47606ba 100644 (file)
@@ -299,8 +299,8 @@ is( $node_subscriber->safe_psql(
 $node_publisher->stop('fast');
 $node_subscriber->stop('fast');
 
-# The bug was that when the REPLICA IDENTITY FULL is used with dropped columns,
-# we fail to apply updates and deletes
+# The bug was that when the REPLICA IDENTITY FULL is used with dropped or
+# generated columns, we fail to apply updates and deletes
 my $node_publisher_d_cols =
   PostgreSQL::Test::Cluster->new('node_publisher_d_cols');
 $node_publisher_d_cols->init(allows_streaming => 'logical');
@@ -315,14 +315,18 @@ $node_publisher_d_cols->safe_psql(
        'postgres', qq(
        CREATE TABLE dropped_cols (a int, b_drop int, c int);
        ALTER TABLE dropped_cols REPLICA IDENTITY FULL;
-       CREATE PUBLICATION pub_dropped_cols FOR TABLE dropped_cols;
+       CREATE TABLE generated_cols (a int, b_gen int GENERATED ALWAYS AS (5 * a) STORED, c int);
+       ALTER TABLE generated_cols REPLICA IDENTITY FULL;
+       CREATE PUBLICATION pub_dropped_cols FOR TABLE dropped_cols, generated_cols;
        -- some initial data
        INSERT INTO dropped_cols VALUES (1, 1, 1);
+       INSERT INTO generated_cols (a, c) VALUES (1, 1);
 ));
 
 $node_subscriber_d_cols->safe_psql(
        'postgres', qq(
         CREATE TABLE dropped_cols (a int, b_drop int, c int);
+        CREATE TABLE generated_cols (a int, b_gen int GENERATED ALWAYS AS (5 * a) STORED, c int);
 ));
 
 my $publisher_connstr_d_cols =
@@ -344,6 +348,7 @@ $node_subscriber_d_cols->safe_psql(
 $node_publisher_d_cols->safe_psql(
        'postgres', qq(
                UPDATE dropped_cols SET a = 100;
+               UPDATE generated_cols SET a = 100;
 ));
 $node_publisher_d_cols->wait_for_catchup('sub_dropped_cols');
 
@@ -352,6 +357,11 @@ is( $node_subscriber_d_cols->safe_psql(
        qq(1),
        'replication with RI FULL and dropped columns');
 
+is( $node_subscriber_d_cols->safe_psql(
+               'postgres', "SELECT count(*) FROM generated_cols WHERE a = 100"),
+       qq(1),
+       'replication with RI FULL and generated columns');
+
 $node_publisher_d_cols->stop('fast');
 $node_subscriber_d_cols->stop('fast');