]> granicus.if.org Git - postgresql/commitdiff
Also save the error detail in SPIError
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 26 Jan 2011 22:35:28 +0000 (00:35 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 26 Jan 2011 22:35:28 +0000 (00:35 +0200)
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.

src/pl/plpython/expected/plpython_unicode_2.out
src/pl/plpython/expected/plpython_unicode_3.out
src/pl/plpython/plpython.c

index d6bd823db8ca2d895b099f694d73327084d087de..1113bc7696418be7ec5cae51d9145a508c4c69c4 100644 (file)
@@ -41,7 +41,7 @@ SELECT * FROM unicode_test;
 SELECT unicode_plan1();
 WARNING:  PL/Python: plpy.Error: unrecognized error in PLy_spi_execute_plan
 CONTEXT:  PL/Python function "unicode_plan1"
-ERROR:  PL/Python: could not convert Python Unicode object to PostgreSQL server encoding
+ERROR:  PL/Python: plpy.SPIError: PL/Python: could not convert Python Unicode object to PostgreSQL server encoding
 DETAIL:  UnicodeError: ASCII encoding error: ordinal not in range(128)
 CONTEXT:  PL/Python function "unicode_plan1"
 SELECT unicode_plan2();
index 05f3e306fab156692d87fec982ca071525079991..2b5f3b13050343cffb3315ba8df55ff2df874385 100644 (file)
@@ -42,6 +42,7 @@ SELECT unicode_plan1();
 WARNING:  PL/Python: plpy.Error: unrecognized error in PLy_spi_execute_plan
 CONTEXT:  PL/Python function "unicode_plan1"
 ERROR:  PL/Python: plpy.SPIError: PL/Python: could not convert Python Unicode object to PostgreSQL server encoding
+DETAIL:  UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
 CONTEXT:  PL/Python function "unicode_plan1"
 SELECT unicode_plan2();
  unicode_plan2 
index 0b75fe6136f902fd535132375de32315ccf4a384..6bcb4cc049b21818908e31692749efb02f55cfc9 100644 (file)
@@ -294,7 +294,7 @@ static char *PLy_procedure_name(PLyProcedure *);
 static void
 PLy_elog(int, const char *,...)
 __attribute__((format(printf, 2, 3)));
-static void PLy_get_spi_error_data(PyObject *exc, char **hint, char **query, int *position);
+static void PLy_get_spi_error_data(PyObject *exc, char **detail, char **hint, char **query, int *position);
 static char *PLy_traceback(int *);
 
 static void *PLy_malloc(size_t);
@@ -3551,7 +3551,7 @@ PLy_spi_exception_set(ErrorData *edata)
        if (!spierror)
                goto failure;
 
-       spidata = Py_BuildValue("(zzi)", edata->hint,
+       spidata = Py_BuildValue("(zzzi)", edata->detail, edata->hint,
                                                        edata->internalquery, edata->internalpos);
        if (!spidata)
                goto failure;
@@ -3586,13 +3586,14 @@ PLy_elog(int elevel, const char *fmt,...)
        int                     xlevel;
        StringInfoData emsg;
        PyObject        *exc, *val, *tb;
+       char            *detail = NULL;
        char            *hint = NULL;
        char            *query = NULL;
        int                     position = 0;
 
        PyErr_Fetch(&exc, &val, &tb);
        if (exc != NULL && PyErr_GivenExceptionMatches(val, PLy_exc_spi_error))
-               PLy_get_spi_error_data(val, &hint, &query, &position);
+               PLy_get_spi_error_data(val, &detail, &hint, &query, &position);
        PyErr_Restore(exc, val, tb);
 
        xmsg = PLy_traceback(&xlevel);
@@ -3626,6 +3627,7 @@ PLy_elog(int elevel, const char *fmt,...)
                else
                        ereport(elevel,
                                        (errmsg("PL/Python: %s", xmsg),
+                                        (detail) ? errdetail("%s", detail) : 0,
                                         (hint) ? errhint("%s", hint) : 0,
                                         (query) ? internalerrquery(query) : 0,
                                         (position) ? internalerrposition(position) : 0));
@@ -3650,7 +3652,7 @@ PLy_elog(int elevel, const char *fmt,...)
  * Extract the error data from a SPIError
  */
 static void
-PLy_get_spi_error_data(PyObject *exc, char **hint, char **query, int *position)
+PLy_get_spi_error_data(PyObject *exc, char **detail, char **hint, char **query, int *position)
 {
        PyObject        *spidata = NULL;
 
@@ -3658,7 +3660,7 @@ PLy_get_spi_error_data(PyObject *exc, char **hint, char **query, int *position)
        if (!spidata)
                goto cleanup;
 
-       if (!PyArg_ParseTuple(spidata, "zzi", hint, query, position))
+       if (!PyArg_ParseTuple(spidata, "zzzi", detail, hint, query, position))
                goto cleanup;
 
 cleanup: