aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2020-10-02 18:23:39 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2020-10-02 18:23:39 +0300
commit26b8361518c393c2f152e9e3837daf605b34bef8 (patch)
treea069a9801cd5d2eaac57988b6a85428ffcba4911 /src
parent8550cbd0bae7c3004034351cb3447b51a552e56c (diff)
downloadpostgresql-26b8361518c393c2f152e9e3837daf605b34bef8.tar.gz
postgresql-26b8361518c393c2f152e9e3837daf605b34bef8.zip
Tidy up error reporting when converting PL/Python arrays.
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
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpython/plpy_typeio.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c
index 9e4e9035f78..b4aeb7fd595 100644
--- a/src/pl/plpython/plpy_typeio.c
+++ b/src/pl/plpython/plpy_typeio.c
@@ -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."))));