Improve exception usage in PL/Python
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 26 Jan 2011 22:47:14 +0000 (00:47 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 26 Jan 2011 22:47:14 +0000 (00:47 +0200)
Use the built-in TypeError, not SPIError, for errors having to do with
argument counts or types.  Use SPIError, not simply plpy.Error, for
errors in PLy_spi_execute_plan.  Finally, do not set a Python
exception if PyArg_ParseTuple failed, as it already sets the correct
exception.

Jan UrbaƄski

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

index 1113bc7696418be7ec5cae51d9145a508c4c69c4..2da7409a01b5df612ad4cf75bc701c4cf7fbfc5f 100644 (file)
@@ -39,7 +39,7 @@ SELECT * FROM unicode_test;
 (0 rows)
 
 SELECT unicode_plan1();
-WARNING:  PL/Python: plpy.Error: unrecognized error in PLy_spi_execute_plan
+WARNING:  PL/Python: plpy.SPIError: 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:  UnicodeError: ASCII encoding error: ordinal not in range(128)
index 2b5f3b13050343cffb3315ba8df55ff2df874385..63eebca9d20e673c889e4d46a726dca4da64458d 100644 (file)
@@ -39,7 +39,7 @@ SELECT * FROM unicode_test;
 (0 rows)
 
 SELECT unicode_plan1();
-WARNING:  PL/Python: plpy.Error: unrecognized error in PLy_spi_execute_plan
+WARNING:  PL/Python: plpy.SPIError: 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)
index 6bcb4cc049b21818908e31692749efb02f55cfc9..21cb106b80c25fb8e767511ab3c31a22cc07edbb 100644 (file)
@@ -2820,15 +2820,11 @@ PLy_spi_prepare(PyObject *self, PyObject *args)
    int         nargs;
 
    if (!PyArg_ParseTuple(args, "s|O", &query, &list))
-   {
-       PLy_exception_set(PLy_exc_spi_error,
-                         "invalid arguments for plpy.prepare");
        return NULL;
-   }
 
    if (list && (!PySequence_Check(list)))
    {
-       PLy_exception_set(PLy_exc_spi_error,
+       PLy_exception_set(PyExc_TypeError,
                       "second argument of plpy.prepare must be a sequence");
        return NULL;
    }
@@ -2984,7 +2980,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
    {
        if (!PySequence_Check(list) || PyString_Check(list) || PyUnicode_Check(list))
        {
-           PLy_exception_set(PLy_exc_spi_error, "plpy.execute takes a sequence as its second argument");
+           PLy_exception_set(PyExc_TypeError, "plpy.execute takes a sequence as its second argument");
            return NULL;
        }
        nargs = PySequence_Length(list);
@@ -3002,7 +2998,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
        if (!so)
            PLy_elog(ERROR, "could not execute plan");
        sv = PyString_AsString(so);
-       PLy_exception_set_plural(PLy_exc_spi_error,
+       PLy_exception_set_plural(PyExc_TypeError,
                              "Expected sequence of %d argument, got %d: %s",
                             "Expected sequence of %d arguments, got %d: %s",
                                 plan->nargs,
@@ -3089,7 +3085,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
        }
 
        if (!PyErr_Occurred())
-           PLy_exception_set(PLy_exc_error,
+           PLy_exception_set(PLy_exc_spi_error,
                              "unrecognized error in PLy_spi_execute_plan");
        PLy_elog(WARNING, NULL);
        PLy_spi_exception_set(edata);