Fix snapshot handling in logicalmsg_decode
authorTomas Vondra
Wed, 22 Feb 2023 14:24:09 +0000 (15:24 +0100)
committerTomas Vondra
Wed, 22 Feb 2023 14:24:18 +0000 (15:24 +0100)
commit7fe1aa991b622feaabfac5ed9c918fe8a1d598c9
tree6829021e1b81febeb9945d6122dc3ea164eb7176
parentd0460a31de6acc8bbb86e9e3d646f1113ebb0c20
Fix snapshot handling in logicalmsg_decode

Whe decoding a transactional logical message, logicalmsg_decode called
SnapBuildGetOrBuildSnapshot. But we may not have a consistent snapshot
yet at that point. We don't actually need the snapshot in this case
(during replay we'll have the snapshot from the transaction), so in
practice this is harmless. But in assert-enabled build this crashes.

Fixed by requesting the snapshot only in non-transactional case, where
we are guaranteed to have SNAPBUILD_CONSISTENT.

Backpatch to 11. The issue exists since 9.6.

Backpatch-through: 11
Reviewed-by: Andres Freund
Discussion: https://postgr.es/m/84d60912-6eab-9b84-5de3-41765a5449e8@enterprisedb.com
src/backend/replication/logical/decode.c
src/backend/replication/logical/reorderbuffer.c