Tidy up error reporting when converting PL/Python arrays.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 2 Oct 2020 15:23:39 +0000 (18:23 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 2 Oct 2020 15:23:39 +0000 (18:23 +0300)
Use PLy_elog() only when a call to a Python C API function failed, and
ereport() for other errors. Add an error code to the "wrong length of
inner sequence" ereport().

Reviewed-by: Daniel Gustafsson
Discussion: https://www.postgresql.org/message-id/B8B72889-D6D7-48FF-B782-D670A6CA4D37%40yesql.se

src/pl/plpython/plpy_typeio.c

index 9e4e9035f78317f49f106e60d7b6f22dbe736ce8..b4aeb7fd595982504b23715ac6774d7407bc277b 100644 (file)
@@ -1173,18 +1173,25 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv,
                        break;
 
                if (ndim == MAXDIM)
-                       PLy_elog(ERROR, "number of array dimensions exceeds the maximum allowed (%d)", MAXDIM);
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                                        errmsg("number of array dimensions exceeds the maximum allowed (%d)",
+                                                       MAXDIM)));
 
                dims[ndim] = PySequence_Length(pyptr);
                if (dims[ndim] < 0)
                        PLy_elog(ERROR, "could not determine sequence length for function return value");
 
                if (dims[ndim] > MaxAllocSize)
-                       PLy_elog(ERROR, "array size exceeds the maximum allowed");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                                        errmsg("array size exceeds the maximum allowed")));
 
                len *= dims[ndim];
                if (len > MaxAllocSize)
-                       PLy_elog(ERROR, "array size exceeds the maximum allowed");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                                        errmsg("array size exceeds the maximum allowed")));
 
                if (dims[ndim] == 0)
                {
@@ -1210,7 +1217,9 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv,
        if (ndim == 0)
        {
                if (!PySequence_Check(plrv))
-                       PLy_elog(ERROR, "return value of function with array return type is not a Python sequence");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                        errmsg("return value of function with array return type is not a Python sequence")));
 
                ndim = 1;
                len = dims[0] = PySequence_Length(plrv);
@@ -1256,7 +1265,8 @@ PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list,
 
        if (PySequence_Length(list) != dims[dim])
                ereport(ERROR,
-                               (errmsg("wrong length of inner sequence: has length %d, but %d was expected",
+                               (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+                                errmsg("wrong length of inner sequence: has length %d, but %d was expected",
                                                (int) PySequence_Length(list), dims[dim]),
                                 (errdetail("To construct a multidimensional array, the inner sequences must all have the same length."))));