]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Index: src/pl/plpython/plpython.c
authorNeil Conway <neilc@samurai.com>
Thu, 29 Dec 2005 21:47:32 +0000 (21:47 +0000)
committerNeil Conway <neilc@samurai.com>
Thu, 29 Dec 2005 21:47:32 +0000 (21:47 +0000)
===================================================================
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

src/pl/plpython/plpython.c

index 5b585653813b1c1d7d0ea467d8cc23cc61c7c3f8..f4c6985bc3a1053c1a6dc2411e7d9af6d3ea6522 100644 (file)
@@ -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);
+                               Py_DECREF(elem);
 
-                               /*
-                                * 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));
+                               PG_TRY();
+                               {
+                                       char *sv = PyString_AsString(so);
 
-                               Py_DECREF(so);
-                               Py_DECREF(elem);
+                                       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