aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/execQual.c10
-rw-r--r--src/test/regress/expected/arrays.out9
-rw-r--r--src/test/regress/sql/arrays.sql1
3 files changed, 19 insertions, 1 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 4ea0cbadadb..494208a0320 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 051bac92342..76a8c56a76a 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 04e97254e14..e6df37216b5 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);