mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
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
This commit is contained in:
parent
8550cbd0ba
commit
26b8361518
@ -1173,18 +1173,25 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (ndim == MAXDIM)
|
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);
|
dims[ndim] = PySequence_Length(pyptr);
|
||||||
if (dims[ndim] < 0)
|
if (dims[ndim] < 0)
|
||||||
PLy_elog(ERROR, "could not determine sequence length for function return value");
|
PLy_elog(ERROR, "could not determine sequence length for function return value");
|
||||||
|
|
||||||
if (dims[ndim] > MaxAllocSize)
|
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];
|
len *= dims[ndim];
|
||||||
if (len > MaxAllocSize)
|
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)
|
if (dims[ndim] == 0)
|
||||||
{
|
{
|
||||||
@ -1210,7 +1217,9 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv,
|
|||||||
if (ndim == 0)
|
if (ndim == 0)
|
||||||
{
|
{
|
||||||
if (!PySequence_Check(plrv))
|
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;
|
ndim = 1;
|
||||||
len = dims[0] = PySequence_Length(plrv);
|
len = dims[0] = PySequence_Length(plrv);
|
||||||
@ -1256,7 +1265,8 @@ PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list,
|
|||||||
|
|
||||||
if (PySequence_Length(list) != dims[dim])
|
if (PySequence_Length(list) != dims[dim])
|
||||||
ereport(ERROR,
|
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]),
|
(int) PySequence_Length(list), dims[dim]),
|
||||||
(errdetail("To construct a multidimensional array, the inner sequences must all have the same length."))));
|
(errdetail("To construct a multidimensional array, the inner sequences must all have the same length."))));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user