SPI_exec shouldn't return SPI_OK_SELECT if it hasn't actually returned
authorTom Lane <[email protected]>
Wed, 29 Jan 2003 15:24:57 +0000 (15:24 +0000)
committerTom Lane <[email protected]>
Wed, 29 Jan 2003 15:24:57 +0000 (15:24 +0000)
a tuple table.  Fixes core dump in pltcl (and probably other PLs) when
executing a query rewritten by a rule.  Per bug report from Wolfgang Walter.

src/backend/executor/spi.c

index 26083738e27c4b0a356e5b37578b4cbef3c19f9b..93e3bf14446e18716611223cd58488931583bd95 100644 (file)
@@ -124,6 +124,14 @@ SPI_finish(void)
        MemoryContextDelete(_SPI_current->execCxt);
        MemoryContextDelete(_SPI_current->procCxt);
 
+       /*
+        * Reset result variables, especially SPI_tuptable which is probably
+        * pointing at a just-deleted tuptable
+        */
+       SPI_processed = 0;
+       SPI_lastoid = InvalidOid;
+       SPI_tuptable = NULL;
+
        /*
         * After _SPI_begin_call _SPI_connected == _SPI_curid. Now we are
         * closing connection to SPI and returning to upper Executor and so
@@ -1330,6 +1338,11 @@ _SPI_pquery(QueryDesc *queryDesc, EState *state, int tcount)
                SPI_lastoid = save_lastoid;
                SPI_tuptable = _SPI_current->tuptable;
        }
+       else if (res == SPI_OK_SELECT)
+       {
+               /* Don't return SPI_OK_SELECT if we discarded the result */
+               res = SPI_OK_UTILITY;
+       }
        queryDesc->dest = dest;
 
        return res;