diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 32437202fe5..ef65cb99224 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -748,9 +748,16 @@ apply_handle_update(StringInfo s) target_rte = list_nth(estate->es_range_table, 0); for (i = 0; i < remoteslot->tts_tupleDescriptor->natts; i++) { - if (newtup.changed[i]) - target_rte->updatedCols = bms_add_member(target_rte->updatedCols, - i + 1 - FirstLowInvalidHeapAttributeNumber); + Form_pg_attribute att = TupleDescAttr(remoteslot->tts_tupleDescriptor, i); + int remoteattnum = rel->attrmap[i]; + + if (!att->attisdropped && remoteattnum >= 0) + { + if (newtup.changed[remoteattnum]) + target_rte->updatedCols = + bms_add_member(target_rte->updatedCols, + i + 1 - FirstLowInvalidHeapAttributeNumber); + } } PushActiveSnapshot(GetTransactionSnapshot()); diff --git a/src/test/subscription/t/003_constraints.pl b/src/test/subscription/t/003_constraints.pl index 62123792e6a..9f00d4d2dd5 100644 --- a/src/test/subscription/t/003_constraints.pl +++ b/src/test/subscription/t/003_constraints.pl @@ -19,14 +19,14 @@ $node_subscriber->start; $node_publisher->safe_psql('postgres', "CREATE TABLE tab_fk (bid int PRIMARY KEY);"); $node_publisher->safe_psql('postgres', - "CREATE TABLE tab_fk_ref (id int PRIMARY KEY, bid int REFERENCES tab_fk (bid));" + "CREATE TABLE tab_fk_ref (id int PRIMARY KEY, junk text, bid int REFERENCES tab_fk (bid));" ); -# Setup structure on subscriber +# Setup structure on subscriber; column order intentionally different $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_fk (bid int PRIMARY KEY);"); $node_subscriber->safe_psql('postgres', - "CREATE TABLE tab_fk_ref (id int PRIMARY KEY, bid int REFERENCES tab_fk (bid));" + "CREATE TABLE tab_fk_ref (id int PRIMARY KEY, bid int REFERENCES tab_fk (bid), junk text);" ); # Setup logical replication @@ -43,8 +43,10 @@ $node_publisher->wait_for_catchup($appname); $node_publisher->safe_psql('postgres', "INSERT INTO tab_fk (bid) VALUES (1);"); +# "junk" value is meant to be large enough to force out-of-line storage $node_publisher->safe_psql('postgres', - "INSERT INTO tab_fk_ref (id, bid) VALUES (1, 1);"); + "INSERT INTO tab_fk_ref (id, bid, junk) VALUES (1, 1, repeat(pi()::text,20000));" +); $node_publisher->wait_for_catchup($appname); @@ -127,7 +129,8 @@ $node_publisher->wait_for_catchup($appname); $result = $node_subscriber->safe_psql('postgres', "SELECT count(*), min(id), max(id) FROM tab_fk_ref;"); -is($result, qq(2|1|2), 'check column trigger applied on even for other column'); +is($result, qq(2|1|2), + 'check column trigger applied even on update for other column'); $node_subscriber->stop('fast'); $node_publisher->stop('fast');