]> granicus.if.org Git - postgresql/commitdiff
Fix an error when a set-returning function fails halfway through the execution
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 18 Jan 2011 21:22:37 +0000 (23:22 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 18 Jan 2011 21:22:37 +0000 (23:22 +0200)
If the function using yield to return rows fails halfway, the iterator
stays open and subsequent calls to the function will resume reading
from it.  The fix is to unref the iterator and set it to NULL if there
has been an error.

Jan UrbaƄski

src/pl/plpython/plpython.c

index c25db9344f6ba19699529e190aa5170564b1e82b..6f31501c7a86c6513b3393bdce10b668d5bb1c4f 100644 (file)
@@ -1164,6 +1164,14 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
                Py_XDECREF(plargs);
                Py_XDECREF(plrv);
 
+               /*
+                * If there was an error the iterator might have not been exhausted
+                * yet. Set it to NULL so the next invocation of the function will
+                * start the iteration again.
+                */
+               Py_XDECREF(proc->setof);
+               proc->setof = NULL;
+
                PG_RE_THROW();
        }
        PG_END_TRY();