aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-04-11 18:17:02 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-04-11 18:17:02 -0400
commit8207c6baf8b42085bef442178ce8721ea726d9c7 (patch)
treea7c5073d9e5bd8c26b71597a9b091b25e84625c8
parentec91ee8f00af9c3960cdc3dd1ecb9e3bb7cfee86 (diff)
downloadpostgresql-8207c6baf8b42085bef442178ce8721ea726d9c7.tar.gz
postgresql-8207c6baf8b42085bef442178ce8721ea726d9c7.zip
Fix freshly-introduced PL/Python portability bug.
It turns out that those PyErr_Clear() calls I removed from plpy_elog.c in 7e3bb080387f4143 et al were not quite as random as they appeared: they mask a Python 2.3.x bug. (Specifically, it turns out that PyType_Ready() can fail if the error indicator is set on entry, and PLy_traceback's fetch of frame.f_code may be the first operation in a session that requires the "frame" type to be readied. Ick.) Put back the clear call, but in a more centralized place closer to what it's protecting, and this time with a comment warning what it's really for. Per buildfarm member prairiedog. Although prairiedog was only failing on HEAD, it seems clearly possible for this to occur in older branches as well, so back-patch to 9.2 the same as the previous patch.
-rw-r--r--src/pl/plpython/plpy_elog.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c
index 55d9e283f10..7bdf4738b2c 100644
--- a/src/pl/plpython/plpy_elog.c
+++ b/src/pl/plpython/plpy_elog.c
@@ -226,6 +226,12 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
PG_TRY();
{
+ /*
+ * Ancient versions of Python (circa 2.3) contain a bug whereby
+ * the fetches below can fail if the error indicator is set.
+ */
+ PyErr_Clear();
+
lineno = PyObject_GetAttrString(tb, "tb_lineno");
if (lineno == NULL)
elog(ERROR, "could not get line number from Python traceback");