diff options
Diffstat (limited to 'src/backend/utils/adt/array_userfuncs.c')
-rw-r--r-- | src/backend/utils/adt/array_userfuncs.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c index 171fdc67bb2..5c4fdcfba46 100644 --- a/src/backend/utils/adt/array_userfuncs.c +++ b/src/backend/utils/adt/array_userfuncs.c @@ -1275,7 +1275,6 @@ array_position_common(FunctionCallInfo fcinfo) PG_RETURN_NULL(); array = PG_GETARG_ARRAYTYPE_P(0); - element_type = ARR_ELEMTYPE(array); /* * We refuse to search for elements in multi-dimensional arrays, since we @@ -1286,6 +1285,10 @@ array_position_common(FunctionCallInfo fcinfo) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("searching for elements in multidimensional arrays is not supported"))); + /* Searching in an empty array is well-defined, though: it always fails */ + if (ARR_NDIM(array) < 1) + PG_RETURN_NULL(); + if (PG_ARGISNULL(1)) { /* fast return when the array doesn't have nulls */ @@ -1300,6 +1303,7 @@ array_position_common(FunctionCallInfo fcinfo) null_search = false; } + element_type = ARR_ELEMTYPE(array); position = (ARR_LBOUND(array))[0] - 1; /* figure out where to start */ @@ -1425,9 +1429,6 @@ array_positions(PG_FUNCTION_ARGS) PG_RETURN_NULL(); array = PG_GETARG_ARRAYTYPE_P(0); - element_type = ARR_ELEMTYPE(array); - - position = (ARR_LBOUND(array))[0] - 1; /* * We refuse to search for elements in multi-dimensional arrays, since we @@ -1440,6 +1441,10 @@ array_positions(PG_FUNCTION_ARGS) astate = initArrayResult(INT4OID, CurrentMemoryContext, false); + /* Searching in an empty array is well-defined, though: it always fails */ + if (ARR_NDIM(array) < 1) + PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext)); + if (PG_ARGISNULL(1)) { /* fast return when the array doesn't have nulls */ @@ -1454,6 +1459,9 @@ array_positions(PG_FUNCTION_ARGS) null_search = false; } + element_type = ARR_ELEMTYPE(array); + position = (ARR_LBOUND(array))[0] - 1; + /* * We arrange to look up type info for array_create_iterator only once per * series of calls, assuming the element type doesn't change underneath |