mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Have logical replication subscriber fire column triggers
The logical replication apply worker did not fire per-column update triggers because the updatedCols bitmap in the RTE was not populated. This fixes that. Reviewed-by: Euler Taveira <euler@timbira.com.br> Discussion: https://www.postgresql.org/message-id/flat/21673e2d-597c-6afe-637e-e8b10425b240%402ndquadrant.com
This commit is contained in:
@ -691,6 +691,7 @@ apply_handle_update(StringInfo s)
|
||||
bool has_oldtup;
|
||||
TupleTableSlot *localslot;
|
||||
TupleTableSlot *remoteslot;
|
||||
RangeTblEntry *target_rte;
|
||||
bool found;
|
||||
MemoryContext oldctx;
|
||||
|
||||
@ -721,6 +722,21 @@ apply_handle_update(StringInfo s)
|
||||
&estate->es_tupleTable);
|
||||
EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1);
|
||||
|
||||
/*
|
||||
* Populate updatedCols so that per-column triggers can fire. This could
|
||||
* include more columns than were actually changed on the publisher
|
||||
* because the logical replication protocol doesn't contain that
|
||||
* information. But it would for example exclude columns that only exist
|
||||
* on the subscriber, since we are not touching those.
|
||||
*/
|
||||
target_rte = list_nth(estate->es_range_table, 0);
|
||||
for (int i = 0; i < remoteslot->tts_tupleDescriptor->natts; i++)
|
||||
{
|
||||
if (newtup.changed[i])
|
||||
target_rte->updatedCols = bms_add_member(target_rte->updatedCols,
|
||||
i + 1 - FirstLowInvalidHeapAttributeNumber);
|
||||
}
|
||||
|
||||
PushActiveSnapshot(GetTransactionSnapshot());
|
||||
ExecOpenIndices(estate->es_result_relation_info, false);
|
||||
|
||||
|
Reference in New Issue
Block a user