diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index a5484d9..08f1788 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, false); + 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, false); + 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 c41272b..75c7dee 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -446,10 +446,11 @@ 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.