]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Revert "Move portal pinning from PL/pgSQL to SPI"
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 10 Jan 2018 21:01:17 +0000 (16:01 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 10 Jan 2018 21:01:17 +0000 (16:01 -0500)
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
src/pl/plpgsql/src/pl_exec.c

index 96370513e80d3d85b2436d93c3b6e4c90bdb881e..995f67d266259350e6019948788963a74a23f71b 100644 (file)
@@ -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);
 }
 
index a326a04fc9172416499c18bd36621171d2e2c5a1..d096f242cdcdb4436db1d3fb6deddf3006025e3e 100644 (file)
@@ -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