Index: src/pl/plpython/plpython.c
=================================================================== RCS file: /Users/neilc/postgres/cvs_root/pgsql/src/pl/plpython/plpython.c,v retrieving revision 1.67 diff -c -r1.67 plpython.c *** src/pl/plpython/plpython.c 26 Dec 2005 04:28:48 -0000 1.67 --- src/pl/plpython/plpython.c 29 Dec 2005 16:54:57 -0000 *************** *** 2,8 **** * plpython.c - python as a procedural language for PostgreSQL * * This software is copyright by Andrew Bosma ! * but is really shameless cribbed from pltcl.c by Jan Weick, and * plperl.c by Mark Hollomon. * * The author hereby grants permission to use, copy, modify, --- 2,8 ---- * plpython.c - python as a procedural language for PostgreSQL * * This software is copyright by Andrew Bosma ! * but is really shamelessly cribbed from pltcl.c by Jan Wieck, and * plperl.c by Mark Hollomon. * * The author hereby grants permission to use, copy, modify, *************** *** 1996,2002 **** int i, rv; PLyPlanObject *plan; - char *nulls; MemoryContext oldcontext; if (list != NULL) --- 1996,2001 ---- *************** *** 2018,2024 **** if (nargs != plan->nargs) { char *sv; - PyObject *so = PyObject_Str(list); if (!so) --- 2017,2022 ---- *************** *** 2036,2048 **** oldcontext = CurrentMemoryContext; PG_TRY(); { ! nulls = palloc(nargs * sizeof(char)); for (i = 0; i < nargs; i++) { PyObject *elem, *so; - char *sv; elem = PySequence_GetItem(list, i); if (elem != Py_None) --- 2034,2045 ---- oldcontext = CurrentMemoryContext; PG_TRY(); { ! char *nulls = palloc(nargs * sizeof(char)); for (i = 0; i < nargs; i++) { PyObject *elem, *so; elem = PySequence_GetItem(list, i); if (elem != Py_None) *************** *** 2051,2070 **** if (!so) PLy_elog(ERROR, "function \"%s\" could not execute plan", PLy_procedure_name(PLy_curr_procedure)); ! sv = PyString_AsString(so); ! /* ! * FIXME -- if this elogs, we have Python reference leak ! */ ! plan->values[i] = ! FunctionCall3(&(plan->args[i].out.d.typfunc), ! CStringGetDatum(sv), ! ObjectIdGetDatum(plan->args[i].out.d.typioparam), ! Int32GetDatum(-1)); ! Py_DECREF(so); ! Py_DECREF(elem); nulls[i] = ' '; } else --- 2048,2073 ---- if (!so) PLy_elog(ERROR, "function \"%s\" could not execute plan", PLy_procedure_name(PLy_curr_procedure)); ! Py_DECREF(elem); ! PG_TRY(); ! { ! char *sv = PyString_AsString(so); ! plan->values[i] = ! FunctionCall3(&(plan->args[i].out.d.typfunc), ! CStringGetDatum(sv), ! ObjectIdGetDatum(plan->args[i].out.d.typioparam), ! Int32GetDatum(-1)); ! } ! PG_CATCH(); ! { ! Py_DECREF(so); ! PG_RE_THROW(); ! } ! PG_END_TRY(); + Py_DECREF(so); nulls[i] = ' '; } else
This commit is contained in:
parent
195f164228
commit
edafb4f037
@ -2,7 +2,7 @@
|
||||
* plpython.c - python as a procedural language for PostgreSQL
|
||||
*
|
||||
* This software is copyright by Andrew Bosma
|
||||
* but is really shameless cribbed from pltcl.c by Jan Weick, and
|
||||
* but is really shamelessly cribbed from pltcl.c by Jan Wieck, and
|
||||
* plperl.c by Mark Hollomon.
|
||||
*
|
||||
* The author hereby grants permission to use, copy, modify,
|
||||
@ -29,7 +29,7 @@
|
||||
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.67 2005/12/26 04:28:48 neilc Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.68 2005/12/29 21:47:32 neilc Exp $
|
||||
*
|
||||
*********************************************************************
|
||||
*/
|
||||
@ -1996,7 +1996,6 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
||||
int i,
|
||||
rv;
|
||||
PLyPlanObject *plan;
|
||||
char *nulls;
|
||||
MemoryContext oldcontext;
|
||||
|
||||
if (list != NULL)
|
||||
@ -2018,7 +2017,6 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
||||
if (nargs != plan->nargs)
|
||||
{
|
||||
char *sv;
|
||||
|
||||
PyObject *so = PyObject_Str(list);
|
||||
|
||||
if (!so)
|
||||
@ -2036,13 +2034,12 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
||||
oldcontext = CurrentMemoryContext;
|
||||
PG_TRY();
|
||||
{
|
||||
nulls = palloc(nargs * sizeof(char));
|
||||
char *nulls = palloc(nargs * sizeof(char));
|
||||
|
||||
for (i = 0; i < nargs; i++)
|
||||
{
|
||||
PyObject *elem,
|
||||
*so;
|
||||
char *sv;
|
||||
|
||||
elem = PySequence_GetItem(list, i);
|
||||
if (elem != Py_None)
|
||||
@ -2051,20 +2048,26 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
||||
if (!so)
|
||||
PLy_elog(ERROR, "function \"%s\" could not execute plan",
|
||||
PLy_procedure_name(PLy_curr_procedure));
|
||||
sv = PyString_AsString(so);
|
||||
|
||||
/*
|
||||
* FIXME -- if this elogs, we have Python reference leak
|
||||
*/
|
||||
plan->values[i] =
|
||||
FunctionCall3(&(plan->args[i].out.d.typfunc),
|
||||
CStringGetDatum(sv),
|
||||
ObjectIdGetDatum(plan->args[i].out.d.typioparam),
|
||||
Int32GetDatum(-1));
|
||||
|
||||
Py_DECREF(so);
|
||||
Py_DECREF(elem);
|
||||
|
||||
PG_TRY();
|
||||
{
|
||||
char *sv = PyString_AsString(so);
|
||||
|
||||
plan->values[i] =
|
||||
FunctionCall3(&(plan->args[i].out.d.typfunc),
|
||||
CStringGetDatum(sv),
|
||||
ObjectIdGetDatum(plan->args[i].out.d.typioparam),
|
||||
Int32GetDatum(-1));
|
||||
}
|
||||
PG_CATCH();
|
||||
{
|
||||
Py_DECREF(so);
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
Py_DECREF(so);
|
||||
nulls[i] = ' ';
|
||||
}
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user