@@ -616,3 +616,127 @@ ERROR: duplicate JSON key "1"
616616SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb)
617617FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v);
618618ERROR: duplicate JSON key "1"
619+ -- Test JSON_OBJECT deparsing
620+ EXPLAIN (VERBOSE, COSTS OFF)
621+ SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json);
622+ QUERY PLAN
623+ ------------------------------------------------------------------------------------------
624+ Result
625+ Output: JSON_OBJECT('foo' : '1'::json FORMAT JSON, 'bar' : 'baz'::text RETURNING json)
626+ (2 rows)
627+
628+ CREATE VIEW json_object_view AS
629+ SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json);
630+ \sv json_object_view
631+ CREATE OR REPLACE VIEW public.json_object_view AS
632+ SELECT JSON_OBJECT('foo' : '1'::text FORMAT JSON, 'bar' : 'baz'::text RETURNING json)
633+ DROP VIEW json_object_view;
634+ -- Test JSON_ARRAY deparsing
635+ EXPLAIN (VERBOSE, COSTS OFF)
636+ SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json);
637+ QUERY PLAN
638+ ---------------------------------------------------------------------
639+ Result
640+ Output: JSON_ARRAY(true, '1'::json FORMAT JSON, 2 RETURNING json)
641+ (2 rows)
642+
643+ CREATE VIEW json_array_view AS
644+ SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json);
645+ \sv json_array_view
646+ CREATE OR REPLACE VIEW public.json_array_view AS
647+ SELECT JSON_ARRAY(true, '1'::text FORMAT JSON, 2 RETURNING json)
648+ DROP VIEW json_array_view;
649+ -- Test JSON_OBJECTAGG deparsing
650+ EXPLAIN (VERBOSE, COSTS OFF)
651+ SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) FILTER (WHERE i > 3)
652+ FROM generate_series(1,5) i;
653+ QUERY PLAN
654+ --------------------------------------------------------------------------------------------------------------------------------------
655+ Aggregate
656+ Output: JSON_OBJECTAGG(i : (('111'::text || (i)::text))::bytea FORMAT JSON WITH UNIQUE KEYS RETURNING text) FILTER (WHERE (i > 3))
657+ -> Function Scan on pg_catalog.generate_series i
658+ Output: i
659+ Function Call: generate_series(1, 5)
660+ (5 rows)
661+
662+ EXPLAIN (VERBOSE, COSTS OFF)
663+ SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) OVER (PARTITION BY i % 2)
664+ FROM generate_series(1,5) i;
665+ QUERY PLAN
666+ -----------------------------------------------------------------------------------------------------------------------------------
667+ WindowAgg
668+ Output: JSON_OBJECTAGG(i : (('111'::text || (i)::text))::bytea FORMAT JSON WITH UNIQUE KEYS RETURNING text) OVER (?), ((i % 2))
669+ -> Sort
670+ Output: ((i % 2)), i
671+ Sort Key: ((i.i % 2))
672+ -> Function Scan on pg_catalog.generate_series i
673+ Output: (i % 2), i
674+ Function Call: generate_series(1, 5)
675+ (8 rows)
676+
677+ CREATE VIEW json_objectagg_view AS
678+ SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) FILTER (WHERE i > 3)
679+ FROM generate_series(1,5) i;
680+ \sv json_objectagg_view
681+ CREATE OR REPLACE VIEW public.json_objectagg_view AS
682+ SELECT JSON_OBJECTAGG(i.i : (('111'::text || i.i)::bytea) FORMAT JSON WITH UNIQUE KEYS RETURNING text) FILTER (WHERE i.i > 3)
683+ FROM generate_series(1, 5) i(i)
684+ DROP VIEW json_objectagg_view;
685+ -- Test JSON_ARRAYAGG deparsing
686+ EXPLAIN (VERBOSE, COSTS OFF)
687+ SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i > 3)
688+ FROM generate_series(1,5) i;
689+ QUERY PLAN
690+ -----------------------------------------------------------------------------------------------------------------------------
691+ Aggregate
692+ Output: JSON_ARRAYAGG((('111'::text || (i)::text))::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE (i > 3))
693+ -> Function Scan on pg_catalog.generate_series i
694+ Output: i
695+ Function Call: generate_series(1, 5)
696+ (5 rows)
697+
698+ EXPLAIN (VERBOSE, COSTS OFF)
699+ SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) OVER (PARTITION BY i % 2)
700+ FROM generate_series(1,5) i;
701+ QUERY PLAN
702+ --------------------------------------------------------------------------------------------------------------------------
703+ WindowAgg
704+ Output: JSON_ARRAYAGG((('111'::text || (i)::text))::bytea FORMAT JSON NULL ON NULL RETURNING text) OVER (?), ((i % 2))
705+ -> Sort
706+ Output: ((i % 2)), i
707+ Sort Key: ((i.i % 2))
708+ -> Function Scan on pg_catalog.generate_series i
709+ Output: (i % 2), i
710+ Function Call: generate_series(1, 5)
711+ (8 rows)
712+
713+ CREATE VIEW json_arrayagg_view AS
714+ SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i > 3)
715+ FROM generate_series(1,5) i;
716+ \sv json_arrayagg_view
717+ CREATE OR REPLACE VIEW public.json_arrayagg_view AS
718+ SELECT JSON_ARRAYAGG((('111'::text || i.i)::bytea) FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i.i > 3)
719+ FROM generate_series(1, 5) i(i)
720+ DROP VIEW json_arrayagg_view;
721+ -- Test JSON_ARRAY(subquery) deparsing
722+ EXPLAIN (VERBOSE, COSTS OFF)
723+ SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING jsonb);
724+ QUERY PLAN
725+ ---------------------------------------------------------------------
726+ Result
727+ Output: $0
728+ InitPlan 1 (returns $0)
729+ -> Aggregate
730+ Output: JSON_ARRAYAGG("*VALUES*".column1 RETURNING jsonb)
731+ -> Values Scan on "*VALUES*"
732+ Output: "*VALUES*".column1
733+ (7 rows)
734+
735+ CREATE VIEW json_array_subquery_view AS
736+ SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING jsonb);
737+ \sv json_array_subquery_view
738+ CREATE OR REPLACE VIEW public.json_array_subquery_view AS
739+ SELECT ( SELECT JSON_ARRAYAGG(q.a RETURNING jsonb)
740+ FROM ( SELECT foo.i
741+ FROM ( VALUES (1), (2), (NULL::integer), (4)) foo(i)) q(a))
742+ DROP VIEW json_array_subquery_view;
0 commit comments