pltcl_call_level--;
- /************************************************************
- * Disconnect from SPI manager
- ************************************************************/
- if (SPI_finish() != SPI_OK_FINISH)
- elog(ERROR, "pltcl: SPI_finish() failed");
-
return retval;
}
siglongjmp(Warn_restart, 1);
}
+ /************************************************************
+ * Disconnect from SPI manager and then create the return
+ * values datum (if the input function does a palloc for it
+ * this must not be allocated in the SPI memory context
+ * because SPI_finish would free it).
+ ************************************************************/
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "pltcl: SPI_finish() failed");
+
retval = (Datum) (*fmgr_faddr(&prodesc->result_in_func))
(pltcl_safe_interp->result,
prodesc->result_in_elem,
* The return value from the procedure might be one of
* the magic strings OK or SKIP or a list from array get
************************************************************/
- if (strcmp(pltcl_safe_interp->result, "OK") == 0)
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "pltcl: SPI_finish() failed");
+
+ if (strcmp(pltcl_safe_interp->result, "OK") == 0) {
return rettup;
+ }
if (strcmp(pltcl_safe_interp->result, "SKIP") == 0)
{
return (HeapTuple) NULL;;
int loop_rc;
int ntuples;
HeapTuple *tuples;
- TupleDesc tupdesc;
+ TupleDesc tupdesc = NULL;
sigjmp_buf save_restart;
char *usage = "syntax error - 'SPI_exec "