diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 4ea0cbadad..494208a032 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -1801,12 +1801,20 @@ restart: pgstat_end_function_usage(&fcusage, rsinfo.isDone != ExprMultipleResult); } - else + else if (fcache->func.fn_retset) { + /* for a strict SRF, result for NULL is an empty set */ result = (Datum) 0; *isNull = true; *isDone = ExprEndResult; } + else + { + /* for a strict non-SRF, result for NULL is a NULL */ + result = (Datum) 0; + *isNull = true; + *isDone = ExprSingleResult; + } /* Which protocol does function want to use? */ if (rsinfo.returnMode == SFRM_ValuePerCall) diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index 051bac9234..76a8c56a76 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -1542,6 +1542,15 @@ select unnest(array[1,2,3,null,4,null,null,5,6]::text[]); 6 (9 rows) +select abs(unnest(array[1,2,null,-3])); + abs +----- + 1 + 2 + + 3 +(4 rows) + select array_remove(array[1,2,2,3], 2); array_remove -------------- diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index 04e97254e1..e6df37216b 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -432,6 +432,7 @@ select unnest(array[1,2,3,4.5]::float8[]); select unnest(array[1,2,3,4.5]::numeric[]); select unnest(array[1,2,3,null,4,null,null,5,6]); select unnest(array[1,2,3,null,4,null,null,5,6]::text[]); +select abs(unnest(array[1,2,null,-3])); select array_remove(array[1,2,2,3], 2); select array_remove(array[1,2,2,3], 5); select array_remove(array[1,NULL,NULL,3], NULL);