aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-08-07 14:36:02 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-08-07 14:36:02 -0400
commit07a601eedab7c5fa4d62055fa3efacef2f38e446 (patch)
treea7cff4ff9db946e5f061b99e3c00cfce2f9dba4b /src
parentbcbecbce2fde3c6dfa9080db11663877808a007d (diff)
downloadpostgresql-07a601eedab7c5fa4d62055fa3efacef2f38e446.tar.gz
postgresql-07a601eedab7c5fa4d62055fa3efacef2f38e446.zip
Avoid crashing in GetOldestSnapshot() if there are no known snapshots.
The sole caller expects NULL to be returned in such a case, so make it so and document it. Per reports from Andreas Seltenreich and Regina Obe. This doesn't really fix their problem, as now their RETURNING queries will say "ERROR: no known snapshots", but in any case this function should not dump core in a reasonably-foreseeable situation. Report: <87vazemeda.fsf@credativ.de> Report: <20160807051854.1427.32414@wrigleys.postgresql.org>
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/time/snapmgr.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 4bddaed33ba..1ec9f70f0ee 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -399,14 +399,14 @@ GetLatestSnapshot(void)
/*
* GetOldestSnapshot
*
- * Get the oldest known snapshot, as judged by the LSN.
+ * Get the transaction's oldest known snapshot, as judged by the LSN.
+ * Will return NULL if there are no active or registered snapshots.
*/
Snapshot
GetOldestSnapshot(void)
{
Snapshot OldestRegisteredSnapshot = NULL;
XLogRecPtr RegisteredLSN = InvalidXLogRecPtr;
- XLogRecPtr ActiveLSN = InvalidXLogRecPtr;
if (!pairingheap_is_empty(&RegisteredSnapshots))
{
@@ -416,10 +416,12 @@ GetOldestSnapshot(void)
}
if (OldestActiveSnapshot != NULL)
- ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
+ {
+ XLogRecPtr ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
- if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
- return OldestActiveSnapshot->as_snap;
+ if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
+ return OldestActiveSnapshot->as_snap;
+ }
return OldestRegisteredSnapshot;
}