v3-0001-Ignore-generated-columns-REL_14-REL_13.patch
application/octet-stream
Filename: v3-0001-Ignore-generated-columns-REL_14-REL_13.patch
Type: application/octet-stream
Part: 4
Patch
Format: format-patch
Series: patch v3-0001
Subject: Ignore generated columns when REPLICA IDENTITY FULL
| File | + | − |
|---|---|---|
| src/backend/executor/execReplication.c | 3 | 2 |
| src/test/subscription/t/100_bugs.pl | 10 | 2 |
From 30770630d8b96af2b3bc3253c64603dad5f87207 Mon Sep 17 00:00:00 2001
From: Cloud User
<pguser@citustestclustervm0.qn5vgvlwtv0erjkuazj1o4q4gb.bx.internal.cloudapp.net>
Date: Fri, 17 Mar 2023 15:17:13 +0000
Subject: [PATCH v3] Ignore generated columns when REPLICA IDENTITY FULL
Generated columns are filled with NULL values on slot_store_data()
but not on table_scan_getnextslot(). With this commit, we skip
such columns while checking tuple equality.
---
src/backend/executor/execReplication.c | 5 +++--
src/test/subscription/t/100_bugs.pl | 12 ++++++++++--
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c
index c505cb1df1..672f2fa986 100644
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -244,10 +244,11 @@ tuples_equal(TupleTableSlot *slot1, TupleTableSlot *slot2,
TypeCacheEntry *typentry;
/*
- * Ignore dropped columns as the publisher doesn't send those
+ * Ignore dropped and generated columns as the publisher doesn't
+ * send those
*/
att = TupleDescAttr(slot1->tts_tupleDescriptor, attrnum);
- if (att->attisdropped)
+ if (att->attisdropped || att->attgenerated)
continue;
/*
diff --git a/src/test/subscription/t/100_bugs.pl b/src/test/subscription/t/100_bugs.pl
index 146a1732f6..0b696bb7a8 100644
--- a/src/test/subscription/t/100_bugs.pl
+++ b/src/test/subscription/t/100_bugs.pl
@@ -6,7 +6,7 @@ use strict;
use warnings;
use PostgresNode;
use TestLib;
-use Test::More tests => 8;
+use Test::More tests => 9;
# Bug #15114
@@ -313,14 +313,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 = $node_publisher_d_cols->connstr . ' dbname=postgres';
@@ -341,12 +345,16 @@ $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');
is($node_subscriber_d_cols->safe_psql('postgres', "SELECT count(*) FROM dropped_cols WHERE a = 100"),
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');
--
2.31.1