diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index 1d61d5c7c8..438c3d0e9e 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -5398,6 +5398,14 @@ array_replace_internal(ArrayType *array, return array; } + /* If all elements were removed return an empty array */ + if (nresult == 0) + { + pfree(values); + pfree(nulls); + return construct_empty_array(element_type); + } + /* Allocate and initialize the result array */ if (hasnulls) { diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index 76a8c56a76..d47861e3dd 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -1577,6 +1577,12 @@ select array_remove(array['A','CC','D','C','RR'], 'RR'); select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed ERROR: removing elements from multidimensional arrays is not supported +select array_remove(array['X','X','X'], 'X') = '{}'; + ?column? +---------- + t +(1 row) + select array_replace(array[1,2,5,4],5,3); array_replace --------------- diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index e6df37216b..5a5a5825d5 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -438,6 +438,7 @@ select array_remove(array[1,2,2,3], 5); select array_remove(array[1,NULL,NULL,3], NULL); select array_remove(array['A','CC','D','C','RR'], 'RR'); select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed +select array_remove(array['X','X','X'], 'X') = '{}'; select array_replace(array[1,2,5,4],5,3); select array_replace(array[1,2,5,4],5,NULL); select array_replace(array[1,2,NULL,4,NULL],NULL,5);