Fix logical replication with lossy identity indexes.

A GiST index on a multirange stores only its bounding range, so different
multiranges can produce the same index key. However,
RelationFindReplTupleByIndex() and RelationFindDeletedTupleInfoByIndex()
assume that matches through a primary key or replica identity index are
exact and skip the equality check. This can cause updates or deletes to
target the wrong row, and conflict detection to report update_deleted
instead of update_missing.

Fix this by rechecking candidates when the index scan sets xs_recheck.
Compare only the index key columns, using the scan keys' equality
operators and collations to match the index's notion of key equality.

Backpatch to 18, where WITHOUT OVERLAPS was introduced. The change to
RelationFindDeletedTupleInfoByIndex() applies only to 19 and later, where
update_deleted conflict detection was added.

Reported-by: Andres Freund <[email protected]>
Author: Paul A. Jungwirth <[email protected]>
Author: Zhijie Hou <[email protected]>
Reviewed-by: Nisha Moond <[email protected]>
Reviewed-by: kedar anavardekar <[email protected]>
Reviewed-by: Amit Kapila <[email protected]>
Discussion: 
https://postgr.es/m/kcyaok346iwocfdourf2oojgtz7ggxmh2ugis7qqhggs4qfzc2@cu6pkox4rfwp
Discussion: 
https://postgr.es/m/e5nb5jbus2oa3pffmlo7pdvdckmchd54tqld4k3n6huyg5xxqn@7rounyvufjx6
Discussion: 
https://postgr.es/m/ca+renywztbc4getpzjm1kqrejrmowcgnn2naa7tpee17hfx...@mail.gmail.com
Backpatch-through: 18

Branch
------
REL_18_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/23fffd382ca06690fdce91bc4819a57017cb1dda

Modified Files
--------------
src/backend/executor/execReplication.c  | 60 ++++++++++++++++++++++++++--
src/test/subscription/t/034_temporal.pl | 71 +++++++++++++++++++++++++++++++++
2 files changed, 128 insertions(+), 3 deletions(-)

Reply via email to