Commit f51c7ca1 authored by Tom Lane's avatar Tom Lane

Make plpython's spi_execute interface handle NULLs properly.

From Andrew Bosma.
parent 6f49703f
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.28 2003/01/31 22:25:13 tgl Exp $ * $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.29 2003/01/31 22:35:24 tgl Exp $
* *
********************************************************************* *********************************************************************
*/ */
...@@ -2181,6 +2181,7 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit) ...@@ -2181,6 +2181,7 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
int i, int i,
rv; rv;
PLyPlanObject *plan; PLyPlanObject *plan;
char *nulls;
enter(); enter();
...@@ -2242,6 +2243,8 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit) ...@@ -2242,6 +2243,8 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
if (nargs) if (nargs)
{ {
nulls = palloc((nargs + 1) * sizeof(char));
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
{ {
PyObject *elem, PyObject *elem,
...@@ -2249,23 +2252,39 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit) ...@@ -2249,23 +2252,39 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
char *sv; char *sv;
elem = PySequence_GetItem(list, i); elem = PySequence_GetItem(list, i);
so = PyObject_Str(elem); if (elem != Py_None)
sv = PyString_AsString(so); {
so = PyObject_Str(elem);
/* sv = PyString_AsString(so);
* FIXME -- if this can elog, we have leak
*/ /*
plan->values[i] = FunctionCall3(&(plan->args[i].out.d.typfunc), * FIXME -- if this can elog, we have leak
CStringGetDatum(sv), */
ObjectIdGetDatum(plan->args[i].out.d.typelem), plan->values[i] = FunctionCall3(&(plan->args[i].out.d.typfunc),
Int32GetDatum(-1)); CStringGetDatum(sv),
ObjectIdGetDatum(plan->args[i].out.d.typelem),
Py_DECREF(so); Int32GetDatum(-1));
Py_DECREF(elem);
Py_DECREF(so);
Py_DECREF(elem);
nulls[i] = ' ';
}
else
{
Py_DECREF(elem);
plan->values[i] = (Datum) 0;
nulls[i] = 'n';
}
} }
nulls[i] = '\0';
}
else
{
nulls = NULL;
} }
rv = SPI_execp(plan->plan, plan->values, NULL, limit); rv = SPI_execp(plan->plan, plan->values, nulls, limit);
RESTORE_EXC(); RESTORE_EXC();
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment