aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2019-03-27 21:16:50 +1300
committerThomas Munro <tmunro@postgresql.org>2019-03-27 21:30:04 +1300
commitd2fd7f74ee61f41a3bd5daf2942b72cebd88f346 (patch)
tree931fb937a69857d64191d6a4fa34d878f69c2aab /src
parent1983af8e899389187026cb34c1ca9d89ea986120 (diff)
downloadpostgresql-d2fd7f74ee61f41a3bd5daf2942b72cebd88f346.tar.gz
postgresql-d2fd7f74ee61f41a3bd5daf2942b72cebd88f346.zip
Fix off-by-one error in txid_status().
The transaction ID returned by GetNextXidAndEpoch() is in the future, so we can't attempt to access its status or we might try to read a CLOG page that doesn't exist. The > vs >= confusion probably stemmed from the choice of a variable name containing the word "last" instead of "next", so fix that too. Back-patch to 10 where the function arrived. Author: Thomas Munro Discussion: https://postgr.es/m/CA%2BhUKG%2Buua_BV5cyfsioKVN2d61Lukg28ECsWTXKvh%3DBtN2DPA%40mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/txid.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/backend/utils/adt/txid.c b/src/backend/utils/adt/txid.c
index 791bbf84024..9958b1a55e8 100644
--- a/src/backend/utils/adt/txid.c
+++ b/src/backend/utils/adt/txid.c
@@ -113,9 +113,9 @@ TransactionIdInRecentPast(uint64 xid_with_epoch, TransactionId *extracted_xid)
uint32 xid_epoch = (uint32) (xid_with_epoch >> 32);
TransactionId xid = (TransactionId) xid_with_epoch;
uint32 now_epoch;
- TransactionId now_epoch_last_xid;
+ TransactionId now_epoch_next_xid;
- GetNextXidAndEpoch(&now_epoch_last_xid, &now_epoch);
+ GetNextXidAndEpoch(&now_epoch_next_xid, &now_epoch);
if (extracted_xid != NULL)
*extracted_xid = xid;
@@ -129,7 +129,7 @@ TransactionIdInRecentPast(uint64 xid_with_epoch, TransactionId *extracted_xid)
/* If the transaction ID is in the future, throw an error. */
if (xid_epoch > now_epoch
- || (xid_epoch == now_epoch && xid > now_epoch_last_xid))
+ || (xid_epoch == now_epoch && xid >= now_epoch_next_xid))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("transaction ID %s is in the future",
@@ -151,7 +151,7 @@ TransactionIdInRecentPast(uint64 xid_with_epoch, TransactionId *extracted_xid)
* CLOG entry is guaranteed to still exist.
*/
if (xid_epoch + 1 < now_epoch
- || (xid_epoch + 1 == now_epoch && xid < now_epoch_last_xid)
+ || (xid_epoch + 1 == now_epoch && xid < now_epoch_next_xid)
|| TransactionIdPrecedes(xid, ShmemVariableCache->oldestClogXid))
return false;