From: Alexander Lakhin <exclusion@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18070: Assertion failed when processing error from plpy's iterator
Date: Mon, 18 Sep 2023 12:00:00 +0300
Message-ID: <9847bd24-7544-9cb3-b4e0-57d37e4f8ce3@gmail.com> (raw)
In-Reply-To: <ZQZ/nA/kb2XwNfMO@paquier.xyz>
References: <9fa9c154-d084-07de-8224-aab7fc8a119e@gmail.com>
<ZQVm8KponTxqj8G3@paquier.xyz>
<3920993.1694874885@sss.pgh.pa.us>
<5eba3ea5-ae13-aab2-35d6-cd3e58dab08b@gmail.com>
<ZQY/Nfv20tt4PBzA@paquier.xyz>
<3984911.1694908923@sss.pgh.pa.us>
<ZQZbbPA7NC5A0f4i@paquier.xyz>
<3998850.1694916190@sss.pgh.pa.us>
<ZQZfM94OJttrx432@paquier.xyz>
<b56fcfca-cdee-f8f0-8f18-095f296e494b@gmail.com>
<ZQZ/nA/kb2XwNfMO@paquier.xyz>
Hi,
17.09.2023 07:25, Michael Paquier wrote:
> Thanks. It's a long weekend here as well, so I'll be able to do
> anything serious only in 48 hours or so (aka being able to check on
> the buildfarm). If you have the room to send patches for the
> back-branches until then, that would be super helpful, of course!
Please look at the patches for backpatching (I think they meet our
agreements) and also the new main patch (which perhaps a step closer to
expectations).
Best regards,
Alexander
diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 4d615b41cc..94874668ba 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_0.out b/src/pl/plpython/expected/plpython_error_0.outindex 290902b182..66684d94d8 100644--- a/src/pl/plpython/expected/plpython_error_0.out+++ b/src/pl/plpython/expected/plpython_error_0.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex bc66ab5534..0e67b5a575 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex df5caaba48..c052a24c52 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -105,9 +105,6 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-
/* If there's an exception message, it goes in the detail. */
if (xmsg)
detail = xmsg;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex d712eb1078..3f835051e7 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpythonu;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;++SELECT python_error_detail();diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 4d615b41cc..94874668ba 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex bc66ab5534..0e67b5a575 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex df5caaba48..c052a24c52 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -105,9 +105,6 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-
/* If there's an exception message, it goes in the detail. */
if (xmsg)
detail = xmsg;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex d712eb1078..3f835051e7 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpythonu;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;++SELECT python_error_detail();diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 4d615b41cc..94874668ba 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex bc66ab5534..0e67b5a575 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex df5caaba48..c052a24c52 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -105,9 +105,6 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-
/* If there's an exception message, it goes in the detail. */
if (xmsg)
detail = xmsg;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex d712eb1078..3f835051e7 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpython3u;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;++SELECT python_error_detail();Attachments:
[text/plain] v4-01-fix-plpy_elog.backpatch12- (3.7K, ../9847bd24-7544-9cb3-b4e0-57d37e4f8ce3@gmail.com/2-v4-01-fix-plpy_elog.backpatch12-)
download | inline diff:diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 4d615b41cc..94874668ba 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_0.out b/src/pl/plpython/expected/plpython_error_0.outindex 290902b182..66684d94d8 100644--- a/src/pl/plpython/expected/plpython_error_0.out+++ b/src/pl/plpython/expected/plpython_error_0.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex bc66ab5534..0e67b5a575 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex df5caaba48..c052a24c52 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -105,9 +105,6 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-
/* If there's an exception message, it goes in the detail. */
if (xmsg)
detail = xmsg;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex d712eb1078..3f835051e7 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpythonu;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;++SELECT python_error_detail();
[text/plain] v4-01-fix-plpy_elog.backpatch14- (2.8K, ../9847bd24-7544-9cb3-b4e0-57d37e4f8ce3@gmail.com/3-v4-01-fix-plpy_elog.backpatch14-)
download | inline diff:diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 4d615b41cc..94874668ba 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex bc66ab5534..0e67b5a575 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex df5caaba48..c052a24c52 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -105,9 +105,6 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-
/* If there's an exception message, it goes in the detail. */
if (xmsg)
detail = xmsg;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex d712eb1078..3f835051e7 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpythonu;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpythonu;++SELECT python_error_detail();
[text/plain] v4-01-fix-plpy_elog.backpatch16- (2.8K, ../9847bd24-7544-9cb3-b4e0-57d37e4f8ce3@gmail.com/4-v4-01-fix-plpy_elog.backpatch16-)
download | inline diff:diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 4d615b41cc..94874668ba 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex bc66ab5534..0e67b5a575 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex df5caaba48..c052a24c52 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -105,9 +105,6 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-
/* If there's an exception message, it goes in the detail. */
if (xmsg)
detail = xmsg;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex d712eb1078..3f835051e7 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpython3u;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;++SELECT python_error_detail();
[text/x-patch] v4-01-fix-plpy_elog.patch (3.6K, ../9847bd24-7544-9cb3-b4e0-57d37e4f8ce3@gmail.com/5-v4-01-fix-plpy_elog.patch)
download | inline diff:diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.outindex 9af7ea7292..fd99278766 100644--- a/src/pl/plpython/expected/plpython_error.out+++ b/src/pl/plpython/expected/plpython_error.out@@ -445,3 +445,17 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+Value must be an integer.+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.outindex 7fe864a1a5..9b50c058ac 100644--- a/src/pl/plpython/expected/plpython_error_5.out+++ b/src/pl/plpython/expected/plpython_error_5.out@@ -445,3 +445,17 @@ PL/Python function "notice_outerfunc"
1
(1 row)
+/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;+SELECT python_error_detail();+ERROR: error fetching next item from iterator+DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD"+Value must be an integer.+CONTEXT: Traceback (most recent call last):+PL/Python function "python_error_detail"diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.cindex 7c627eacfb..55d4ad689a 100644--- a/src/pl/plpython/plpy_elog.c+++ b/src/pl/plpython/plpy_elog.c@@ -47,6 +47,7 @@ PLy_elog_impl(int elevel, const char *fmt,...)
char *tbmsg;
int tb_depth;
StringInfoData emsg;
+ StringInfoData edtl;
PyObject *exc,
*val,
*tb;
@@ -103,12 +104,20 @@ PLy_elog_impl(int elevel, const char *fmt,...)
}
primary = emsg.data;
- /* Since we have a format string, we cannot have a SPI detail. */- Assert(detail == NULL);-- /* If there's an exception message, it goes in the detail. */- if (xmsg)- detail = xmsg;+ /* + * The detail composed of a message, concatenated with a detail, if+ * any, from an underlying exception.+ */+ initStringInfo(&edtl);+ if (xmsg != NULL)+ appendStringInfoString(&edtl, xmsg);+ if (detail != NULL)+ {+ if (edtl.len > 0)+ appendStringInfoChar(&edtl, '\n');+ appendStringInfoString(&edtl, detail);+ }+ detail = edtl.data;
}
else
{
@@ -140,7 +149,10 @@ PLy_elog_impl(int elevel, const char *fmt,...)
PG_FINALLY();
{
if (fmt)
+ {
pfree(emsg.data);
+ pfree(edtl.data);+ }
if (xmsg)
pfree(xmsg);
if (tbmsg)
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sqlindex 11f14ec5a7..9bb1c0b085 100644--- a/src/pl/plpython/sql/plpython_error.sql+++ b/src/pl/plpython/sql/plpython_error.sql@@ -344,3 +344,14 @@ $$ LANGUAGE plpython3u;
\set SHOW_CONTEXT always
SELECT notice_outerfunc();
++/* test error logged with an underlying exception that includes a detail+ * string (bug #18070).+ */+CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$+ plan = plpy.prepare("SELECT to_date('xy', 'DD') d")+ for row in plpy.cursor(plan):+ yield row['d']+$$ LANGUAGE plpython3u;++SELECT python_error_detail();
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: exclusion@gmail.com, michael@paquier.xyz, tgl@sss.pgh.pa.us, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18070: Assertion failed when processing error from plpy's iterator
In-Reply-To: <9847bd24-7544-9cb3-b4e0-57d37e4f8ce3@gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox