summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/regress/expected/aggregates.out37
-rw-r--r--src/test/regress/sql/aggregates.sql39
2 files changed, 76 insertions, 0 deletions
diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out
index f0517f95b60..d8271da4d1f 100644
--- a/src/test/regress/expected/aggregates.out
+++ b/src/test/regress/expected/aggregates.out
@@ -2759,6 +2759,43 @@ SELECT balk(hundred) FROM tenk1;
(1 row)
ROLLBACK;
+-- test multiple usage of an aggregate whose finalfn returns a R/W datum
+BEGIN;
+CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
+LANGUAGE plpgsql IMMUTABLE AS $$
+BEGIN
+ RETURN array_fill(y[1], ARRAY[4]);
+END;
+$$;
+CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
+LANGUAGE plpgsql STRICT IMMUTABLE AS $$
+DECLARE
+ res x%TYPE;
+BEGIN
+ -- assignment is essential for this test, it expands the array to R/W
+ res := array_fill(x[1], ARRAY[4]);
+ RETURN res;
+END;
+$$;
+CREATE AGGREGATE rwagg(anyarray) (
+ STYPE = anyarray,
+ SFUNC = rwagg_sfunc,
+ FINALFUNC = rwagg_finalfunc
+);
+CREATE FUNCTION eatarray(x real[]) RETURNS real[]
+LANGUAGE plpgsql STRICT IMMUTABLE AS $$
+BEGIN
+ x[1] := x[1] + 1;
+ RETURN x;
+END;
+$$;
+SELECT eatarray(rwagg(ARRAY[1.0::real])), eatarray(rwagg(ARRAY[1.0::real]));
+ eatarray | eatarray
+-----------+-----------
+ {2,1,1,1} | {2,1,1,1}
+(1 row)
+
+ROLLBACK;
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;
SET parallel_setup_cost = 0;
diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql
index 1783d19bd5e..75c78be640b 100644
--- a/src/test/regress/sql/aggregates.sql
+++ b/src/test/regress/sql/aggregates.sql
@@ -1207,6 +1207,45 @@ SELECT balk(hundred) FROM tenk1;
ROLLBACK;
+-- test multiple usage of an aggregate whose finalfn returns a R/W datum
+BEGIN;
+
+CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
+LANGUAGE plpgsql IMMUTABLE AS $$
+BEGIN
+ RETURN array_fill(y[1], ARRAY[4]);
+END;
+$$;
+
+CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
+LANGUAGE plpgsql STRICT IMMUTABLE AS $$
+DECLARE
+ res x%TYPE;
+BEGIN
+ -- assignment is essential for this test, it expands the array to R/W
+ res := array_fill(x[1], ARRAY[4]);
+ RETURN res;
+END;
+$$;
+
+CREATE AGGREGATE rwagg(anyarray) (
+ STYPE = anyarray,
+ SFUNC = rwagg_sfunc,
+ FINALFUNC = rwagg_finalfunc
+);
+
+CREATE FUNCTION eatarray(x real[]) RETURNS real[]
+LANGUAGE plpgsql STRICT IMMUTABLE AS $$
+BEGIN
+ x[1] := x[1] + 1;
+ RETURN x;
+END;
+$$;
+
+SELECT eatarray(rwagg(ARRAY[1.0::real])), eatarray(rwagg(ARRAY[1.0::real]));
+
+ROLLBACK;
+
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;