@@ -616,3 +616,127 @@ ERROR: duplicate JSON key "1"
616
616
SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb)
617
617
FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v);
618
618
ERROR: 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('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('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