Skip to content

Commit 418df3a

Browse files
committed
Also save the error detail in SPIError
The temporarily broken plpython_unicode test shows a case where this is used. Do remaining fix-ups on the expected files at the same time.
1 parent ddf8c16 commit 418df3a

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

src/pl/plpython/expected/plpython_unicode_2.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ SELECT * FROM unicode_test;
4141
SELECT unicode_plan1();
4242
WARNING: PL/Python: plpy.Error: unrecognized error in PLy_spi_execute_plan
4343
CONTEXT: PL/Python function "unicode_plan1"
44-
ERROR: PL/Python: could not convert Python Unicode object to PostgreSQL server encoding
44+
ERROR: PL/Python: plpy.SPIError: PL/Python: could not convert Python Unicode object to PostgreSQL server encoding
4545
DETAIL: UnicodeError: ASCII encoding error: ordinal not in range(128)
4646
CONTEXT: PL/Python function "unicode_plan1"
4747
SELECT unicode_plan2();

src/pl/plpython/expected/plpython_unicode_3.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ SELECT unicode_plan1();
4242
WARNING: PL/Python: plpy.Error: unrecognized error in PLy_spi_execute_plan
4343
CONTEXT: PL/Python function "unicode_plan1"
4444
ERROR: PL/Python: plpy.SPIError: PL/Python: could not convert Python Unicode object to PostgreSQL server encoding
45+
DETAIL: UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
4546
CONTEXT: PL/Python function "unicode_plan1"
4647
SELECT unicode_plan2();
4748
unicode_plan2

src/pl/plpython/plpython.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ static char *PLy_procedure_name(PLyProcedure *);
294294
static void
295295
PLy_elog(int, const char *,...)
296296
__attribute__((format(printf, 2, 3)));
297-
static void PLy_get_spi_error_data(PyObject *exc, char **hint, char **query, int *position);
297+
static void PLy_get_spi_error_data(PyObject *exc, char **detail, char **hint, char **query, int *position);
298298
static char *PLy_traceback(int *);
299299

300300
static void *PLy_malloc(size_t);
@@ -3551,7 +3551,7 @@ PLy_spi_exception_set(ErrorData *edata)
35513551
if (!spierror)
35523552
goto failure;
35533553

3554-
spidata = Py_BuildValue("(zzi)", edata->hint,
3554+
spidata = Py_BuildValue("(zzzi)", edata->detail, edata->hint,
35553555
edata->internalquery, edata->internalpos);
35563556
if (!spidata)
35573557
goto failure;
@@ -3586,13 +3586,14 @@ PLy_elog(int elevel, const char *fmt,...)
35863586
int xlevel;
35873587
StringInfoData emsg;
35883588
PyObject *exc, *val, *tb;
3589+
char *detail = NULL;
35893590
char *hint = NULL;
35903591
char *query = NULL;
35913592
int position = 0;
35923593

35933594
PyErr_Fetch(&exc, &val, &tb);
35943595
if (exc != NULL && PyErr_GivenExceptionMatches(val, PLy_exc_spi_error))
3595-
PLy_get_spi_error_data(val, &hint, &query, &position);
3596+
PLy_get_spi_error_data(val, &detail, &hint, &query, &position);
35963597
PyErr_Restore(exc, val, tb);
35973598

35983599
xmsg = PLy_traceback(&xlevel);
@@ -3626,6 +3627,7 @@ PLy_elog(int elevel, const char *fmt,...)
36263627
else
36273628
ereport(elevel,
36283629
(errmsg("PL/Python: %s", xmsg),
3630+
(detail) ? errdetail("%s", detail) : 0,
36293631
(hint) ? errhint("%s", hint) : 0,
36303632
(query) ? internalerrquery(query) : 0,
36313633
(position) ? internalerrposition(position) : 0));
@@ -3650,15 +3652,15 @@ PLy_elog(int elevel, const char *fmt,...)
36503652
* Extract the error data from a SPIError
36513653
*/
36523654
static void
3653-
PLy_get_spi_error_data(PyObject *exc, char **hint, char **query, int *position)
3655+
PLy_get_spi_error_data(PyObject *exc, char **detail, char **hint, char **query, int *position)
36543656
{
36553657
PyObject *spidata = NULL;
36563658

36573659
spidata = PyObject_GetAttrString(exc, "spidata");
36583660
if (!spidata)
36593661
goto cleanup;
36603662

3661-
if (!PyArg_ParseTuple(spidata, "zzi", hint, query, position))
3663+
if (!PyArg_ParseTuple(spidata, "zzzi", detail, hint, query, position))
36623664
goto cleanup;
36633665

36643666
cleanup:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy