1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-12 21:01:52 +03:00

Revert patch for taking fewer snapshots.

This reverts commit d573e239f0, "Take fewer
snapshots".  While that seemed like a good idea at the time, it caused
execution to use a snapshot that had been acquired before locking any of
the tables mentioned in the query.  This created user-visible anomalies
that were not present in any prior release of Postgres, as reported by
Tomas Vondra.  While this whole area could do with a redesign (since there
are related cases that have anomalies anyway), it doesn't seem likely that
any future patch would be reasonably back-patchable; and we don't want 9.2
to exhibit a behavior that's subtly unlike either past or future releases.
Hence, revert to prior code while we rethink the problem.
This commit is contained in:
Tom Lane
2012-11-26 15:55:43 -05:00
parent d3237e04ca
commit 532994299e
7 changed files with 32 additions and 46 deletions

View File

@ -447,18 +447,17 @@ FetchStatementTargetList(Node *stmt)
* currently only honored for PORTAL_ONE_SELECT portals). Most callers
* should simply pass zero.
*
* The use_active_snapshot parameter is currently used only for
* PORTAL_ONE_SELECT portals. If it is true, the active snapshot will
* be used when starting up the executor; if false, a new snapshot will
* be taken. This is used both for cursors and to avoid taking an entirely
* new snapshot when it isn't necessary.
* The caller can optionally pass a snapshot to be used; pass InvalidSnapshot
* for the normal behavior of setting a new snapshot. This parameter is
* presently ignored for non-PORTAL_ONE_SELECT portals (it's only intended
* to be used for cursors).
*
* On return, portal is ready to accept PortalRun() calls, and the result
* tupdesc (if any) is known.
*/
void
PortalStart(Portal portal, ParamListInfo params,
int eflags, bool use_active_snapshot)
int eflags, Snapshot snapshot)
{
Portal saveActivePortal;
ResourceOwner saveResourceOwner;
@ -500,8 +499,8 @@ PortalStart(Portal portal, ParamListInfo params,
case PORTAL_ONE_SELECT:
/* Must set snapshot before starting executor. */
if (use_active_snapshot)
PushActiveSnapshot(GetActiveSnapshot());
if (snapshot)
PushActiveSnapshot(snapshot);
else
PushActiveSnapshot(GetTransactionSnapshot());