From 8bc3ae171af9fddf55828ac01411a062aa3ad977 Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Tue, 13 Oct 2026 23:13:26 -0400 Subject: [PATCH v2 2/3] Add tests for jsonb_object_agg() as a window function. --- src/test/regress/expected/jsonb.out | 26 ++++++++++++++++++++++++++ src/test/regress/sql/jsonb.sql | 11 +++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index 82c31e2962b..2bdf3aa1e30 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -1614,6 +1614,32 @@ SELECT jsonb_object_agg_unique_strict(i, null) OVER (ORDER BY i) {} (10 rows) +-- the final function runs once per row, so later pairs must still win +SELECT g, jsonb_object_agg(k, v) OVER (ORDER BY g) + FROM (VALUES (1,'a',1),(1,'a',2),(1,'a',3),(1,'b',5),(2,'b',6),(3,'a',7)) t(g,k,v); + g | jsonb_object_agg +---+------------------ + 1 | {"a": 3, "b": 5} + 1 | {"a": 3, "b": 5} + 1 | {"a": 3, "b": 5} + 1 | {"a": 3, "b": 5} + 2 | {"a": 3, "b": 6} + 3 | {"a": 7, "b": 6} +(6 rows) + +SELECT count(*) FILTER (WHERE w IS DISTINCT FROM + (SELECT jsonb_object_agg('k' || (j % 8), j ORDER BY j) FROM generate_series(1, i) j)) + FROM (SELECT i, jsonb_object_agg('k' || (i % 8), i) OVER (ORDER BY i) AS w + FROM generate_series(1, 120) i) s; + count +------- + 0 +(1 row) + +-- and a null pair must still count as a duplicate key +SELECT g, jsonb_object_agg_unique_strict(k, v) OVER (ORDER BY g) + FROM (VALUES (1, 'a', null::int), (2, 'a', 1)) t(g, k, v); +ERROR: duplicate JSON object key value CREATE TEMP TABLE foo (serial_num int, name text, type text); INSERT INTO foo VALUES (847001,'t15','GE1043'); INSERT INTO foo VALUES (847002,'t16','GE1043'); diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql index 610ee28b97f..f2c7285d6e0 100644 --- a/src/test/regress/sql/jsonb.sql +++ b/src/test/regress/sql/jsonb.sql @@ -408,6 +408,17 @@ SELECT jsonb_object_agg_unique(i, null) OVER (ORDER BY i) SELECT jsonb_object_agg_unique_strict(i, null) OVER (ORDER BY i) FROM generate_series(1, 10) g(i); +-- the final function runs once per row, so later pairs must still win +SELECT g, jsonb_object_agg(k, v) OVER (ORDER BY g) + FROM (VALUES (1,'a',1),(1,'a',2),(1,'a',3),(1,'b',5),(2,'b',6),(3,'a',7)) t(g,k,v); +SELECT count(*) FILTER (WHERE w IS DISTINCT FROM + (SELECT jsonb_object_agg('k' || (j % 8), j ORDER BY j) FROM generate_series(1, i) j)) + FROM (SELECT i, jsonb_object_agg('k' || (i % 8), i) OVER (ORDER BY i) AS w + FROM generate_series(1, 120) i) s; +-- and a null pair must still count as a duplicate key +SELECT g, jsonb_object_agg_unique_strict(k, v) OVER (ORDER BY g) + FROM (VALUES (1, 'a', null::int), (2, 'a', 1)) t(g, k, v); + CREATE TEMP TABLE foo (serial_num int, name text, type text); INSERT INTO foo VALUES (847001,'t15','GE1043'); INSERT INTO foo VALUES (847002,'t16','GE1043'); -- 2.37.1 (Apple Git-137.1)