aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpython/plpython.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 4c8bef5e0f4..560eeb25940 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -29,7 +29,7 @@
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* 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)
int i,
rv;
PLyPlanObject *plan;
+ char *nulls;
enter();
@@ -2242,6 +2243,8 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
if (nargs)
{
+ nulls = palloc((nargs + 1) * sizeof(char));
+
for (i = 0; i < nargs; i++)
{
PyObject *elem,
@@ -2249,23 +2252,39 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
char *sv;
elem = PySequence_GetItem(list, i);
- 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),
- CStringGetDatum(sv),
- ObjectIdGetDatum(plan->args[i].out.d.typelem),
- Int32GetDatum(-1));
-
- Py_DECREF(so);
- Py_DECREF(elem);
+ if (elem != Py_None)
+ {
+ 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),
+ CStringGetDatum(sv),
+ ObjectIdGetDatum(plan->args[i].out.d.typelem),
+ Int32GetDatum(-1));
+
+ 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();
for (i = 0; i < nargs; i++)