Commit 07a601ee authored by Tom Lane's avatar Tom Lane

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>
parent bcbecbce
...@@ -399,14 +399,14 @@ GetLatestSnapshot(void) ...@@ -399,14 +399,14 @@ GetLatestSnapshot(void)
/* /*
* GetOldestSnapshot * 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 Snapshot
GetOldestSnapshot(void) GetOldestSnapshot(void)
{ {
Snapshot OldestRegisteredSnapshot = NULL; Snapshot OldestRegisteredSnapshot = NULL;
XLogRecPtr RegisteredLSN = InvalidXLogRecPtr; XLogRecPtr RegisteredLSN = InvalidXLogRecPtr;
XLogRecPtr ActiveLSN = InvalidXLogRecPtr;
if (!pairingheap_is_empty(&RegisteredSnapshots)) if (!pairingheap_is_empty(&RegisteredSnapshots))
{ {
...@@ -416,10 +416,12 @@ GetOldestSnapshot(void) ...@@ -416,10 +416,12 @@ GetOldestSnapshot(void)
} }
if (OldestActiveSnapshot != NULL) if (OldestActiveSnapshot != NULL)
ActiveLSN = OldestActiveSnapshot->as_snap->lsn; {
XLogRecPtr ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN) if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
return OldestActiveSnapshot->as_snap; return OldestActiveSnapshot->as_snap;
}
return OldestRegisteredSnapshot; return OldestRegisteredSnapshot;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment