From be7fd36677d22eb535da9cb3a204e4f2bb3d7716 Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Mon, 12 Oct 2026 03:14:06 -0400 Subject: [PATCH v1 2/2] Add test for jsonb_object_agg() as a window function. A window use runs the final function once per row. Check that a repeated key keeps its latest value. --- src/test/regress/expected/jsonb.out | 22 ++++++++++++++++++++++ src/test/regress/sql/jsonb.sql | 8 ++++++++ 2 files changed, 30 insertions(+) diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index b1d2ce5f03a..7bc0af97972 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -1641,6 +1641,28 @@ SELECT jsonb_object_agg(DISTINCT 'a', 'abc'); {"a": "abc"} (1 row) +-- window use runs the final function once per row, repeated keys must 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) + -- jsonb_object -- empty object, one dimension SELECT jsonb_object('{}'); diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql index d4e8d7d8c9e..371541d5927 100644 --- a/src/test/regress/sql/jsonb.sql +++ b/src/test/regress/sql/jsonb.sql @@ -424,6 +424,14 @@ SELECT jsonb_object_agg(name, type) FROM foo; -- edge case for parser SELECT jsonb_object_agg(DISTINCT 'a', 'abc'); +-- window use runs the final function once per row, repeated keys must 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; + -- jsonb_object -- empty object, one dimension -- 2.37.1 (Apple Git-137.1)