diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/executor/execReplication.c | 10 | ||||
-rw-r--r-- | src/test/subscription/t/100_bugs.pl | 55 |
2 files changed, 63 insertions, 2 deletions
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index c4bc69f1e55..f2bf72b5ffc 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -289,6 +289,14 @@ tuples_equal(TupleTableSlot *slot1, TupleTableSlot *slot2, Form_pg_attribute att; TypeCacheEntry *typentry; + att = TupleDescAttr(slot1->tts_tupleDescriptor, attrnum); + + /* + * Ignore dropped columns as the publisher doesn't send those + */ + if (att->attisdropped) + continue; + /* * If one value is NULL and other is not, then they are certainly not * equal @@ -302,8 +310,6 @@ tuples_equal(TupleTableSlot *slot1, TupleTableSlot *slot2, if (slot1->tts_isnull[attrnum] || slot2->tts_isnull[attrnum]) continue; - att = TupleDescAttr(slot1->tts_tupleDescriptor, attrnum); - typentry = eq[attrnum]; if (typentry == NULL) { diff --git a/src/test/subscription/t/100_bugs.pl b/src/test/subscription/t/100_bugs.pl index 036576acab5..549a1b5fe3b 100644 --- a/src/test/subscription/t/100_bugs.pl +++ b/src/test/subscription/t/100_bugs.pl @@ -370,6 +370,61 @@ $result = $node_subscriber->safe_psql('postgres', "SELECT * FROM sch2.t1"); is( $result, qq(1 3), 'check data in subscriber sch2.t1 after schema rename'); +# Again, drop replication state but not tables. +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_sch"); +$node_publisher->safe_psql('postgres', "DROP PUBLICATION tap_pub_sch"); + +$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 +$node_publisher->rotate_logfile(); +$node_publisher->start(); + +$node_subscriber->rotate_logfile(); +$node_subscriber->start(); + +$node_publisher->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; + -- some initial data + INSERT INTO dropped_cols VALUES (1, 1, 1); +)); + +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE TABLE dropped_cols (a int, b_drop int, c int); +)); + +$publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION sub_dropped_cols CONNECTION '$publisher_connstr' PUBLICATION pub_dropped_cols" +); +$node_subscriber->wait_for_subscription_sync; + +$node_publisher->safe_psql( + 'postgres', qq( + ALTER TABLE dropped_cols DROP COLUMN b_drop; +)); +$node_subscriber->safe_psql( + 'postgres', qq( + ALTER TABLE dropped_cols DROP COLUMN b_drop; +)); + +$node_publisher->safe_psql( + 'postgres', qq( + UPDATE dropped_cols SET a = 100; +)); +$node_publisher->wait_for_catchup('sub_dropped_cols'); + +is( $node_subscriber->safe_psql( + 'postgres', "SELECT count(*) FROM dropped_cols WHERE a = 100"), + qq(1), + 'replication with RI FULL and dropped columns'); + $node_publisher->stop('fast'); $node_subscriber->stop('fast'); |