Fix snapshot handling in logicalmsg_decode
authorTomas Vondra <[email protected]>
Wed, 22 Feb 2023 14:24:09 +0000 (15:24 +0100)
committerTomas Vondra <[email protected]>
Wed, 22 Feb 2023 14:50:37 +0000 (15:50 +0100)
commit497f863f05982c193c12a115f00be6efa7214b29
tree6b99ad5b4d42d2a5d70e9b25996e971eb221fba6
parent52dbd9f845987ff3a6f97d30b3bebb13fdb4b2b4
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