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