Log Message:
-----------
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

Modified Files:
--------------
    pgsql/src/pl/plpython:
        plpython.c (r1.67 -> r1.68)
        
(http://developer.postgresql.org/cvsweb.cgi/pgsql/src/pl/plpython/plpython.c.diff?r1=1.67&r2=1.68)

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to