diff options
Diffstat (limited to 'src/backend/tcop')
| -rw-r--r-- | src/backend/tcop/postgres.c | 32 | ||||
| -rw-r--r-- | src/backend/tcop/pquery.c | 15 |
2 files changed, 29 insertions, 18 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 5bb16e010c..f789a1e627 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -943,10 +943,6 @@ exec_simple_query(const char *query_string) plantree_list = pg_plan_queries(querytree_list, 0, NULL); - /* Done with the snapshot used for parsing/planning */ - if (snapshot_set) - PopActiveSnapshot(); - /* If we got a cancel signal in analysis or planning, quit */ CHECK_FOR_INTERRUPTS(); @@ -971,9 +967,19 @@ exec_simple_query(const char *query_string) NULL); /* - * Start the portal. No parameters here. + * Start the portal. + * + * If we took a snapshot for parsing/planning, the portal may be + * able to reuse it for the execution phase. Currently, this will only + * happen in PORTAL_ONE_SELECT mode. But even if PortalStart doesn't + * end up being able to do this, keeping the parse/plan snapshot around + * until after we start the portal doesn't cost much. */ - PortalStart(portal, NULL, InvalidSnapshot); + PortalStart(portal, NULL, snapshot_set); + + /* Done with the snapshot used for parsing/planning */ + if (snapshot_set) + PopActiveSnapshot(); /* * Select the appropriate output format: text unless we are doing a @@ -1696,14 +1702,18 @@ exec_bind_message(StringInfo input_message) cplan->stmt_list, cplan); - /* Done with the snapshot used for parameter I/O and parsing/planning */ - if (snapshot_set) - PopActiveSnapshot(); - /* * And we're ready to start portal execution. + * + * If we took a snapshot for parsing/planning, we'll try to reuse it + * for query execution (currently, reuse will only occur if + * PORTAL_ONE_SELECT mode is chosen). */ - PortalStart(portal, params, InvalidSnapshot); + PortalStart(portal, params, snapshot_set); + + /* Done with the snapshot used for parameter I/O and parsing/planning */ + if (snapshot_set) + PopActiveSnapshot(); /* * Apply the result format requests to the portal. diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 466727b7b8..75c7dee3cb 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -446,16 +446,17 @@ FetchStatementTargetList(Node *stmt) * the query, they must be passed in here (caller is responsible for * giving them appropriate lifetime). * - * 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). + * 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. * * On return, portal is ready to accept PortalRun() calls, and the result * 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 +498,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()); |
