mirror of
https://github.com/postgres/postgres.git
synced 2025-12-08 00:03:14 -05:00
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
|
* plpython.c - python as a procedural language for PostgreSQL
|
||||||
*
|
*
|
||||||
* This software is copyright by Andrew Bosma
|
* 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.
|
* plperl.c by Mark Hollomon.
|
||||||
*
|
*
|
||||||
* The author hereby grants permission to use, copy, modify,
|
* The author hereby grants permission to use, copy, modify,
|
||||||
@ -29,7 +29,7 @@
|
|||||||
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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,
|
int i,
|
||||||
rv;
|
rv;
|
||||||
PLyPlanObject *plan;
|
PLyPlanObject *plan;
|
||||||
char *nulls;
|
|
||||||
MemoryContext oldcontext;
|
MemoryContext oldcontext;
|
||||||
|
|
||||||
if (list != NULL)
|
if (list != NULL)
|
||||||
@ -2018,7 +2017,6 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
|||||||
if (nargs != plan->nargs)
|
if (nargs != plan->nargs)
|
||||||
{
|
{
|
||||||
char *sv;
|
char *sv;
|
||||||
|
|
||||||
PyObject *so = PyObject_Str(list);
|
PyObject *so = PyObject_Str(list);
|
||||||
|
|
||||||
if (!so)
|
if (!so)
|
||||||
@ -2036,13 +2034,12 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
|||||||
oldcontext = CurrentMemoryContext;
|
oldcontext = CurrentMemoryContext;
|
||||||
PG_TRY();
|
PG_TRY();
|
||||||
{
|
{
|
||||||
nulls = palloc(nargs * sizeof(char));
|
char *nulls = palloc(nargs * sizeof(char));
|
||||||
|
|
||||||
for (i = 0; i < nargs; i++)
|
for (i = 0; i < nargs; i++)
|
||||||
{
|
{
|
||||||
PyObject *elem,
|
PyObject *elem,
|
||||||
*so;
|
*so;
|
||||||
char *sv;
|
|
||||||
|
|
||||||
elem = PySequence_GetItem(list, i);
|
elem = PySequence_GetItem(list, i);
|
||||||
if (elem != Py_None)
|
if (elem != Py_None)
|
||||||
@ -2051,20 +2048,26 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
|
|||||||
if (!so)
|
if (!so)
|
||||||
PLy_elog(ERROR, "function \"%s\" could not execute plan",
|
PLy_elog(ERROR, "function \"%s\" could not execute plan",
|
||||||
PLy_procedure_name(PLy_curr_procedure));
|
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);
|
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] = ' ';
|
nulls[i] = ' ';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user