From 1585ff7387dbcc5657522b2ed87ffd58fd555ee9 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 23 Dec 2024 12:42:55 +0200 Subject: [PATCH] Don't allow GetTransactionSnapshot() in logical decoding A historic snapshot should only be used for catalog access, not general queries. We never call GetTransactionSnapshot() during logical decoding, which is good because it wouldn't be very sensible, so the code to deal with that was unreachable and untested. Turn it into an error, to avoid doing that in the future either. Discussion: https://www.postgresql.org/message-id/a868fe78-ddb4-4b0a-9b96-873d91d93cfd@iki.fi --- src/backend/utils/time/snapmgr.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index e002d0c1368..6eb29b99735 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -212,16 +212,12 @@ Snapshot GetTransactionSnapshot(void) { /* - * Return historic snapshot if doing logical decoding. We'll never need a - * non-historic transaction snapshot in this (sub-)transaction, so there's - * no need to be careful to set one up for later calls to - * GetTransactionSnapshot(). + * This should not be called while doing logical decoding. Historic + * snapshots are only usable for catalog access, not for general-purpose + * queries. */ if (HistoricSnapshotActive()) - { - Assert(!FirstSnapshotSet); - return HistoricSnapshot; - } + elog(ERROR, "cannot take query snapshot during logical decoding"); /* First call in transaction? */ if (!FirstSnapshotSet)