From b48b2f8793ef256d19274b4ef6ff587fd47ab553 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 10 Jan 2018 16:01:17 -0500 Subject: [PATCH] Revert "Move portal pinning from PL/pgSQL to SPI" This reverts commit b3617cdfbba1b5381e9d1c6bc0839500e8eb7273. This broke returning unnamed cursors from PL/pgSQL functions. Apparently, there are no test cases for this. --- src/backend/executor/spi.c | 9 --------- src/pl/plpgsql/src/pl_exec.c | 8 ++++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 96370513e8..995f67d266 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -1175,12 +1175,6 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, { /* Use a random nonconflicting name */ portal = CreateNewPortal(); - - /* - * Make sure the portal doesn't get closed by the user statements we - * execute. - */ - PinPortal(portal); } else { @@ -1419,9 +1413,6 @@ SPI_cursor_close(Portal portal) if (!PortalIsValid(portal)) elog(ERROR, "invalid portal in SPI cursor operation"); - if (portal->portalPinned) - UnpinPortal(portal); - PortalDrop(portal, false); } diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index a326a04fc9..d096f242cd 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -5257,6 +5257,12 @@ exec_for_query(PLpgSQL_execstate *estate, PLpgSQL_stmt_forq *stmt, /* Fetch loop variable's datum entry */ var = (PLpgSQL_variable *) estate->datums[stmt->var->dno]; + /* + * Make sure the portal doesn't get closed by the user statements we + * execute. + */ + PinPortal(portal); + /* * Fetch the initial tuple(s). If prefetching is allowed then we grab a * few more rows to avoid multiple trips through executor startup @@ -5318,6 +5324,8 @@ loop_exit: */ SPI_freetuptable(tuptab); + UnpinPortal(portal); + /* * Set the FOUND variable to indicate the result of executing the loop * (namely, whether we looped one or more times). This must be set last so