diff --git a/src/pl/plpython/expected/plpython_types.out b/src/pl/plpython/expected/plpython_types.out index a470911c2e..c4e749a5a8 100644 --- a/src/pl/plpython/expected/plpython_types.out +++ b/src/pl/plpython/expected/plpython_types.out @@ -687,6 +687,15 @@ SELECT * FROM test_type_conversion_array_mixed2(); ERROR: invalid input syntax for type integer: "abc" CONTEXT: while creating return value PL/Python function "test_type_conversion_array_mixed2" +CREATE FUNCTION test_type_conversion_array_mixed3() RETURNS text[] AS $$ +return [[], 'a'] +$$ LANGUAGE plpython3u; +SELECT * FROM test_type_conversion_array_mixed3(); + test_type_conversion_array_mixed3 +----------------------------------- + {[],a} +(1 row) + CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$ return [[1,2,3],[4,5]] $$ LANGUAGE plpython3u; diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c index 7018c9d404..864b5f1765 100644 --- a/src/pl/plpython/plpy_typeio.c +++ b/src/pl/plpython/plpy_typeio.c @@ -1136,7 +1136,7 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv, int i; Datum *elems; bool *nulls; - int64 len; + int len; int ndim; int dims[MAXDIM]; int lbs[MAXDIM]; @@ -1155,7 +1155,6 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv, * Determine the number of dimensions, and their sizes. */ ndim = 0; - len = 1; Py_INCREF(plrv); @@ -1174,17 +1173,6 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv, if (dims[ndim] < 0) PLy_elog(ERROR, "could not determine sequence length for function return value"); - if (dims[ndim] > MaxAllocSize) - ereport(ERROR, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("array size exceeds the maximum allowed"))); - - len *= dims[ndim]; - if (len > MaxAllocSize) - ereport(ERROR, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("array size exceeds the maximum allowed"))); - if (dims[ndim] == 0) { /* empty sequence */ @@ -1214,15 +1202,18 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv, errmsg("return value of function with array return type is not a Python sequence"))); ndim = 1; - len = dims[0] = PySequence_Length(plrv); + dims[0] = PySequence_Length(plrv); } + /* Allocate space for work arrays, after detecting array size overflow */ + len = ArrayGetNItems(ndim, dims); + elems = palloc(sizeof(Datum) * len); + nulls = palloc(sizeof(bool) * len); + /* * Traverse the Python lists, in depth-first order, and collect all the * elements at the bottom level into 'elems'/'nulls' arrays. */ - elems = palloc(sizeof(Datum) * len); - nulls = palloc(sizeof(bool) * len); currelem = 0; PLySequence_ToArray_recurse(arg->u.array.elm, plrv, dims, ndim, 0, diff --git a/src/pl/plpython/sql/plpython_types.sql b/src/pl/plpython/sql/plpython_types.sql index 40f4f79d99..9702a10a72 100644 --- a/src/pl/plpython/sql/plpython_types.sql +++ b/src/pl/plpython/sql/plpython_types.sql @@ -328,6 +328,13 @@ $$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_mixed2(); +CREATE FUNCTION test_type_conversion_array_mixed3() RETURNS text[] AS $$ +return [[], 'a'] +$$ LANGUAGE plpython3u; + +SELECT * FROM test_type_conversion_array_mixed3(); + + CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$ return [[1,2,3],[4,5]] $$ LANGUAGE plpython3u;