* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.22 2002/09/04 22:51:23 petere Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.23 2002/09/26 05:23:26 momjian Exp $
*
*********************************************************************
*/
else
PLy_restart_in_progress += 1;
if (proc)
+ {
Py_DECREF(proc->me);
+ }
RERAISE_EXC();
}
*
* FIXME -- leaks saved plan on object destruction. can this be
* avoided?
+ * I think so. A function prepares and then execp's a statement.
+ * When we come to deallocate the 'statement' object we obviously
+ * no long need the plan. Even if we did, without the object
+ * we're never going to be able to use it again.
+ * In the against arguments: SPI_saveplan has stuck this under
+ * the top context so there must be a reason for doing that.
*/
+ pfree(ob->plan);
}
if (ob->types)
PLy_free(ob->types);
PyList_SetItem(result->rows, i, row);
}
PLy_typeinfo_dealloc(&args);
+
+ SPI_freetuptable(tuptable);
}
RESTORE_EXC();
}
* ENHANCEMENTS, OR MODIFICATIONS.
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.62 2002/09/21 18:39:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.63 2002/09/26 05:23:26 momjian Exp $
*
**********************************************************************/
pltcl_set_tuple_values(interp, arrayname, 0, tuples[0], tupdesc);
sprintf(buf, "%d", ntuples);
Tcl_SetResult(interp, buf, TCL_VOLATILE);
+ SPI_freetuptable(SPI_tuptable);
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
return TCL_OK;
}
continue;
if (loop_rc == TCL_RETURN)
{
+ SPI_freetuptable(SPI_tuptable);
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
return TCL_RETURN;
}
if (loop_rc == TCL_BREAK)
break;
+ SPI_freetuptable(SPI_tuptable);
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
return TCL_ERROR;
}
+ SPI_freetuptable(SPI_tuptable);
+
/************************************************************
* Finally return the number of tuples
************************************************************/
{
if (ntuples > 0)
pltcl_set_tuple_values(interp, arrayname, 0, tuples[0], tupdesc);
+ SPI_freetuptable(SPI_tuptable);
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
sprintf(buf, "%d", ntuples);
Tcl_SetResult(interp, buf, TCL_VOLATILE);
continue;
if (loop_rc == TCL_RETURN)
{
+ SPI_freetuptable(SPI_tuptable);
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
return TCL_RETURN;
}
if (loop_rc == TCL_BREAK)
break;
+ SPI_freetuptable(SPI_tuptable);
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
return TCL_ERROR;
}
+ SPI_freetuptable(SPI_tuptable);
+
/************************************************************
* Finally return the number of tuples
************************************************************/