|
|
@ -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.")))); |
|
|
|
|
|
|
|
|
|
|
|