Make plpython's spi_execute interface handle NULLs properly.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 31 Jan 2003 22:35:24 +0000 (22:35 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 31 Jan 2003 22:35:24 +0000 (22:35 +0000)
From Andrew Bosma.

src/pl/plpython/plpython.c

index 4c8bef5e0f484ff206f889dc95e2d9d4f9b7b364..560eeb2594073489a17ba494fec40cdd8711f654 100644 (file)
@@ -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++)