diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index 89086aa..497657e 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -121,7 +121,7 @@ PerformCursorOpen(PlannedStmt *stmt, ParamListInfo params, /* * Start execution, inserting parameters if any. */ - PortalStart(portal, params, GetActiveSnapshot()); + PortalStart(portal, params, true); Assert(portal->strategy == PORTAL_ONE_SELECT); diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index a949215..dd0e837 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -278,7 +278,7 @@ ExecuteQuery(ExecuteStmt *stmt, const char *queryString, /* * Run the portal to completion. */ - PortalStart(portal, paramLI, GetActiveSnapshot()); + PortalStart(portal, paramLI, true); (void) PortalRun(portal, FETCH_ALL, false, dest, dest, completionTag); diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 688279c..7af3abf 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -1126,7 +1126,6 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, CachedPlan *cplan; List *stmt_list; char *query_string; - Snapshot snapshot; MemoryContext oldcontext; Portal portal; @@ -1269,15 +1268,6 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, } } - /* Set up the snapshot to use. */ - if (read_only) - snapshot = GetActiveSnapshot(); - else - { - CommandCounterIncrement(); - snapshot = GetTransactionSnapshot(); - } - /* * If the plan has parameters, copy them into the portal. Note that this * must be done after revalidating the plan, because in dynamic parameter @@ -1293,7 +1283,13 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, /* * Start portal execution. */ - PortalStart(portal, paramLI, snapshot); + if (read_only) + PortalStart(portal, paramLI, true); + else + { + CommandCounterIncrement(); + PortalStart(portal, paramLI, false); + } Assert(portal->strategy != PORTAL_MULTI_QUERY); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 976a832..a5484d9 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -973,7 +973,7 @@ exec_simple_query(const char *query_string) /* * Start the portal. No parameters here. */ - PortalStart(portal, NULL, InvalidSnapshot); + PortalStart(portal, NULL, false); /* * Select the appropriate output format: text unless we are doing a @@ -1703,7 +1703,7 @@ exec_bind_message(StringInfo input_message) /* * And we're ready to start portal execution. */ - PortalStart(portal, params, InvalidSnapshot); + PortalStart(portal, params, false); /* * Apply the result format requests to the portal. diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 466727b..c41272b 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -455,7 +455,7 @@ FetchStatementTargetList(Node *stmt) * tupdesc (if any) is known. */ void -PortalStart(Portal portal, ParamListInfo params, Snapshot snapshot) +PortalStart(Portal portal, ParamListInfo params, bool use_active_snapshot) { Portal saveActivePortal; ResourceOwner saveResourceOwner; @@ -497,8 +497,8 @@ PortalStart(Portal portal, ParamListInfo params, Snapshot snapshot) case PORTAL_ONE_SELECT: /* Must set snapshot before starting executor. */ - if (snapshot) - PushActiveSnapshot(snapshot); + if (use_active_snapshot) + PushActiveSnapshot(GetActiveSnapshot()); else PushActiveSnapshot(GetTransactionSnapshot()); diff --git a/src/include/tcop/pquery.h b/src/include/tcop/pquery.h index 2a5e871..ce37af3 100644 --- a/src/include/tcop/pquery.h +++ b/src/include/tcop/pquery.h @@ -28,7 +28,7 @@ extern List *FetchPortalTargetList(Portal portal); extern List *FetchStatementTargetList(Node *stmt); extern void PortalStart(Portal portal, ParamListInfo params, - Snapshot snapshot); + bool use_active_snapshot); extern void PortalSetResultFormat(Portal portal, int nFormats, int16 *formats);