mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Fix snapshot management, take two.
Partially revert the previous patch I installed and replace it with a more general fix: any time a snapshot is pushed as Active, we need to ensure that it will not be modified in the future. This means that if the same snapshot is used as CurrentSnapshot, it needs to be copied separately. This affects serializable transactions only, because CurrentSnapshot has already been copied by RegisterSnapshot and so PushActiveSnapshot does not think it needs another copy. However, CommandCounterIncrement would modify CurrentSnapshot, whereas ActiveSnapshots must not have their command counters incremented. I say "partially" because the regression test I added for the previous bug has been kept. (This restores 8.3 behavior, because before snapmgr.c existed, any snapshot set as Active was copied.) Per bug report from Stuart Bishop in 6bc73d4c0910042358k3d1adff3qa36f8df75198ecea@mail.gmail.com
This commit is contained in:
@ -14,7 +14,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.80 2009/10/02 17:57:29 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.81 2009/10/07 16:27:18 alvherre Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -47,7 +47,6 @@ PerformCursorOpen(PlannedStmt *stmt, ParamListInfo params,
|
||||
DeclareCursorStmt *cstmt = (DeclareCursorStmt *) stmt->utilityStmt;
|
||||
Portal portal;
|
||||
MemoryContext oldContext;
|
||||
Snapshot snapshot;
|
||||
|
||||
if (cstmt == NULL || !IsA(cstmt, DeclareCursorStmt))
|
||||
elog(ERROR, "PerformCursorOpen called for non-cursor query");
|
||||
@ -119,18 +118,10 @@ PerformCursorOpen(PlannedStmt *stmt, ParamListInfo params,
|
||||
portal->cursorOptions |= CURSOR_OPT_NO_SCROLL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up snapshot for portal. Note that we need a fresh, independent copy
|
||||
* of the snapshot because we don't want it to be modified by future
|
||||
* CommandCounterIncrement calls. We do not register it, because
|
||||
* portalmem.c will take care of that internally.
|
||||
*/
|
||||
snapshot = CopySnapshot(GetActiveSnapshot());
|
||||
|
||||
/*
|
||||
* Start execution, inserting parameters if any.
|
||||
*/
|
||||
PortalStart(portal, params, snapshot);
|
||||
PortalStart(portal, params, GetActiveSnapshot());
|
||||
|
||||
Assert(portal->strategy == PORTAL_ONE_SELECT);
|
||||
|
||||
|
Reference in New Issue
Block a user