mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03:00
Fix construction of updated-columns bitmap in logical replication.
Commitb9c130a1f
failed to apply the publisher-to-subscriber column mapping while checking which columns were updated. Perhaps less significantly, it didn't exclude dropped columns either. This could result in an incorrect updated-columns bitmap and thus wrong decisions about whether to fire column-specific triggers on the subscriber while applying updates. In HEAD (since commit9de77b545
), it could also result in accesses off the end of the colstatus array, as detected by buildfarm member skink. Fix the logic, and adjust 003_constraints.pl so that the problem is exposed in unpatched code. In HEAD, also add some assertions to check that we don't access off the ends of these newly variable-sized arrays. Back-patch to v10, asb9c130a1f
was. Discussion: https://postgr.es/m/CAH2-Wz=79hKQ4++c5A060RYbjTHgiYTHz=fw6mptCtgghH2gJA@mail.gmail.com
This commit is contained in:
@ -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());
|
||||
|
Reference in New Issue
Block a user