Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / jsonb.out
blob1add673968bfdad6b05c83746371c815e53197f2
1 -- Strings.
2 SELECT '""'::jsonb;                             -- OK.
3  jsonb 
4 -------
5  ""
6 (1 row)
8 SELECT $$''$$::jsonb;                   -- ERROR, single quotes are not allowed
9 ERROR:  invalid input syntax for type json
10 LINE 1: SELECT $$''$$::jsonb;
11                ^
12 DETAIL:  Token "'" is invalid.
13 CONTEXT:  JSON data, line 1: '...
14 SELECT '"abc"'::jsonb;                  -- OK
15  jsonb 
16 -------
17  "abc"
18 (1 row)
20 SELECT '"abc'::jsonb;                   -- ERROR, quotes not closed
21 ERROR:  invalid input syntax for type json
22 LINE 1: SELECT '"abc'::jsonb;
23                ^
24 DETAIL:  Token ""abc" is invalid.
25 CONTEXT:  JSON data, line 1: "abc
26 SELECT '"abc
27 def"'::jsonb;                                   -- ERROR, unescaped newline in string constant
28 ERROR:  invalid input syntax for type json
29 LINE 1: SELECT '"abc
30                ^
31 DETAIL:  Character with value 0x0a must be escaped.
32 CONTEXT:  JSON data, line 1: "abc
33 SELECT '"\n\"\\"'::jsonb;               -- OK, legal escapes
34   jsonb   
35 ----------
36  "\n\"\\"
37 (1 row)
39 SELECT '"\v"'::jsonb;                   -- ERROR, not a valid JSON escape
40 ERROR:  invalid input syntax for type json
41 LINE 1: SELECT '"\v"'::jsonb;
42                ^
43 DETAIL:  Escape sequence "\v" is invalid.
44 CONTEXT:  JSON data, line 1: "\v...
45 -- see json_encoding test for input with unicode escapes
46 -- Numbers.
47 SELECT '1'::jsonb;                              -- OK
48  jsonb 
49 -------
50  1
51 (1 row)
53 SELECT '0'::jsonb;                              -- OK
54  jsonb 
55 -------
56  0
57 (1 row)
59 SELECT '01'::jsonb;                             -- ERROR, not valid according to JSON spec
60 ERROR:  invalid input syntax for type json
61 LINE 1: SELECT '01'::jsonb;
62                ^
63 DETAIL:  Token "01" is invalid.
64 CONTEXT:  JSON data, line 1: 01
65 SELECT '0.1'::jsonb;                            -- OK
66  jsonb 
67 -------
68  0.1
69 (1 row)
71 SELECT '9223372036854775808'::jsonb;    -- OK, even though it's too large for int8
72         jsonb        
73 ---------------------
74  9223372036854775808
75 (1 row)
77 SELECT '1e100'::jsonb;                  -- OK
78                                                  jsonb                                                 
79 -------------------------------------------------------------------------------------------------------
80  10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
81 (1 row)
83 SELECT '1.3e100'::jsonb;                        -- OK
84                                                  jsonb                                                 
85 -------------------------------------------------------------------------------------------------------
86  13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
87 (1 row)
89 SELECT '1f2'::jsonb;                            -- ERROR
90 ERROR:  invalid input syntax for type json
91 LINE 1: SELECT '1f2'::jsonb;
92                ^
93 DETAIL:  Token "1f2" is invalid.
94 CONTEXT:  JSON data, line 1: 1f2
95 SELECT '0.x1'::jsonb;                   -- ERROR
96 ERROR:  invalid input syntax for type json
97 LINE 1: SELECT '0.x1'::jsonb;
98                ^
99 DETAIL:  Token "0.x1" is invalid.
100 CONTEXT:  JSON data, line 1: 0.x1
101 SELECT '1.3ex100'::jsonb;               -- ERROR
102 ERROR:  invalid input syntax for type json
103 LINE 1: SELECT '1.3ex100'::jsonb;
104                ^
105 DETAIL:  Token "1.3ex100" is invalid.
106 CONTEXT:  JSON data, line 1: 1.3ex100
107 -- Arrays.
108 SELECT '[]'::jsonb;                             -- OK
109  jsonb 
110 -------
111  []
112 (1 row)
114 SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::jsonb;  -- OK
115                                                                                                   jsonb                                                                                                   
116 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
117  [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
118 (1 row)
120 SELECT '[1,2]'::jsonb;                  -- OK
121  jsonb  
122 --------
123  [1, 2]
124 (1 row)
126 SELECT '[1,2,]'::jsonb;                 -- ERROR, trailing comma
127 ERROR:  invalid input syntax for type json
128 LINE 1: SELECT '[1,2,]'::jsonb;
129                ^
130 DETAIL:  Expected JSON value, but found "]".
131 CONTEXT:  JSON data, line 1: [1,2,]
132 SELECT '[1,2'::jsonb;                   -- ERROR, no closing bracket
133 ERROR:  invalid input syntax for type json
134 LINE 1: SELECT '[1,2'::jsonb;
135                ^
136 DETAIL:  The input string ended unexpectedly.
137 CONTEXT:  JSON data, line 1: [1,2
138 SELECT '[1,[2]'::jsonb;                 -- ERROR, no closing bracket
139 ERROR:  invalid input syntax for type json
140 LINE 1: SELECT '[1,[2]'::jsonb;
141                ^
142 DETAIL:  The input string ended unexpectedly.
143 CONTEXT:  JSON data, line 1: [1,[2]
144 -- Objects.
145 SELECT '{}'::jsonb;                             -- OK
146  jsonb 
147 -------
148  {}
149 (1 row)
151 SELECT '{"abc"}'::jsonb;                        -- ERROR, no value
152 ERROR:  invalid input syntax for type json
153 LINE 1: SELECT '{"abc"}'::jsonb;
154                ^
155 DETAIL:  Expected ":", but found "}".
156 CONTEXT:  JSON data, line 1: {"abc"}
157 SELECT '{"abc":1}'::jsonb;              -- OK
158    jsonb    
159 ------------
160  {"abc": 1}
161 (1 row)
163 SELECT '{1:"abc"}'::jsonb;              -- ERROR, keys must be strings
164 ERROR:  invalid input syntax for type json
165 LINE 1: SELECT '{1:"abc"}'::jsonb;
166                ^
167 DETAIL:  Expected string or "}", but found "1".
168 CONTEXT:  JSON data, line 1: {1...
169 SELECT '{"abc",1}'::jsonb;              -- ERROR, wrong separator
170 ERROR:  invalid input syntax for type json
171 LINE 1: SELECT '{"abc",1}'::jsonb;
172                ^
173 DETAIL:  Expected ":", but found ",".
174 CONTEXT:  JSON data, line 1: {"abc",...
175 SELECT '{"abc"=1}'::jsonb;              -- ERROR, totally wrong separator
176 ERROR:  invalid input syntax for type json
177 LINE 1: SELECT '{"abc"=1}'::jsonb;
178                ^
179 DETAIL:  Token "=" is invalid.
180 CONTEXT:  JSON data, line 1: {"abc"=...
181 SELECT '{"abc"::1}'::jsonb;             -- ERROR, another wrong separator
182 ERROR:  invalid input syntax for type json
183 LINE 1: SELECT '{"abc"::1}'::jsonb;
184                ^
185 DETAIL:  Expected JSON value, but found ":".
186 CONTEXT:  JSON data, line 1: {"abc"::...
187 SELECT '{"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}}'::jsonb; -- OK
188                                jsonb                                
189 --------------------------------------------------------------------
190  {"abc": 1, "def": 2, "ghi": [3, 4], "hij": {"klm": 5, "nop": [6]}}
191 (1 row)
193 SELECT '{"abc":1:2}'::jsonb;            -- ERROR, colon in wrong spot
194 ERROR:  invalid input syntax for type json
195 LINE 1: SELECT '{"abc":1:2}'::jsonb;
196                ^
197 DETAIL:  Expected "," or "}", but found ":".
198 CONTEXT:  JSON data, line 1: {"abc":1:...
199 SELECT '{"abc":1,3}'::jsonb;            -- ERROR, no value
200 ERROR:  invalid input syntax for type json
201 LINE 1: SELECT '{"abc":1,3}'::jsonb;
202                ^
203 DETAIL:  Expected string, but found "3".
204 CONTEXT:  JSON data, line 1: {"abc":1,3...
205 -- Recursion.
206 SET max_stack_depth = '100kB';
207 SELECT repeat('[', 10000)::jsonb;
208 ERROR:  stack depth limit exceeded
209 HINT:  Increase the configuration parameter "max_stack_depth" (currently 100kB), after ensuring the platform's stack depth limit is adequate.
210 SELECT repeat('{"a":', 10000)::jsonb;
211 ERROR:  stack depth limit exceeded
212 HINT:  Increase the configuration parameter "max_stack_depth" (currently 100kB), after ensuring the platform's stack depth limit is adequate.
213 RESET max_stack_depth;
214 -- Miscellaneous stuff.
215 SELECT 'true'::jsonb;                   -- OK
216  jsonb 
217 -------
218  true
219 (1 row)
221 SELECT 'false'::jsonb;                  -- OK
222  jsonb 
223 -------
224  false
225 (1 row)
227 SELECT 'null'::jsonb;                   -- OK
228  jsonb 
229 -------
230  null
231 (1 row)
233 SELECT ' true '::jsonb;                 -- OK, even with extra whitespace
234  jsonb 
235 -------
236  true
237 (1 row)
239 SELECT 'true false'::jsonb;             -- ERROR, too many values
240 ERROR:  invalid input syntax for type json
241 LINE 1: SELECT 'true false'::jsonb;
242                ^
243 DETAIL:  Expected end of input, but found "false".
244 CONTEXT:  JSON data, line 1: true false
245 SELECT 'true, false'::jsonb;            -- ERROR, too many values
246 ERROR:  invalid input syntax for type json
247 LINE 1: SELECT 'true, false'::jsonb;
248                ^
249 DETAIL:  Expected end of input, but found ",".
250 CONTEXT:  JSON data, line 1: true,...
251 SELECT 'truf'::jsonb;                   -- ERROR, not a keyword
252 ERROR:  invalid input syntax for type json
253 LINE 1: SELECT 'truf'::jsonb;
254                ^
255 DETAIL:  Token "truf" is invalid.
256 CONTEXT:  JSON data, line 1: truf
257 SELECT 'trues'::jsonb;                  -- ERROR, not a keyword
258 ERROR:  invalid input syntax for type json
259 LINE 1: SELECT 'trues'::jsonb;
260                ^
261 DETAIL:  Token "trues" is invalid.
262 CONTEXT:  JSON data, line 1: trues
263 SELECT ''::jsonb;                               -- ERROR, no value
264 ERROR:  invalid input syntax for type json
265 LINE 1: SELECT ''::jsonb;
266                ^
267 DETAIL:  The input string ended unexpectedly.
268 CONTEXT:  JSON data, line 1: 
269 SELECT '    '::jsonb;                   -- ERROR, no value
270 ERROR:  invalid input syntax for type json
271 LINE 1: SELECT '    '::jsonb;
272                ^
273 DETAIL:  The input string ended unexpectedly.
274 CONTEXT:  JSON data, line 1:     
275 -- Multi-line JSON input to check ERROR reporting
276 SELECT '{
277                 "one": 1,
278                 "two":"two",
279                 "three":
280                 true}'::jsonb; -- OK
281                   jsonb                  
282 -----------------------------------------
283  {"one": 1, "two": "two", "three": true}
284 (1 row)
286 SELECT '{
287                 "one": 1,
288                 "two":,"two",  -- ERROR extraneous comma before field "two"
289                 "three":
290                 true}'::jsonb;
291 ERROR:  invalid input syntax for type json
292 LINE 1: SELECT '{
293                ^
294 DETAIL:  Expected JSON value, but found ",".
295 CONTEXT:  JSON data, line 3:            "two":,...
296 SELECT '{
297                 "one": 1,
298                 "two":"two",
299                 "averyveryveryveryveryveryveryveryveryverylongfieldname":}'::jsonb;
300 ERROR:  invalid input syntax for type json
301 LINE 1: SELECT '{
302                ^
303 DETAIL:  Expected JSON value, but found "}".
304 CONTEXT:  JSON data, line 4: ...yveryveryveryveryveryveryveryverylongfieldname":}
305 -- ERROR missing value for last field
306 -- make sure jsonb is passed through json generators without being escaped
307 SELECT array_to_json(ARRAY [jsonb '{"a":1}', jsonb '{"b":[2,3]}']);
308       array_to_json       
309 --------------------------
310  [{"a": 1},{"b": [2, 3]}]
311 (1 row)
313 -- anyarray column
314 CREATE TEMP TABLE rows AS
315 SELECT x, 'txt' || x as y
316 FROM generate_series(1,3) AS x;
317 analyze rows;
318 select attname, to_jsonb(histogram_bounds) histogram_bounds
319 from pg_stats
320 where tablename = 'rows' and
321       schemaname = pg_my_temp_schema()::regnamespace::text
322 order by 1;
323  attname |     histogram_bounds     
324 ---------+--------------------------
325  x       | [1, 2, 3]
326  y       | ["txt1", "txt2", "txt3"]
327 (2 rows)
329 -- to_jsonb, timestamps
330 select to_jsonb(timestamp '2014-05-28 12:22:35.614298');
331            to_jsonb           
332 ------------------------------
333  "2014-05-28T12:22:35.614298"
334 (1 row)
336 BEGIN;
337 SET LOCAL TIME ZONE 10.5;
338 select to_jsonb(timestamptz '2014-05-28 12:22:35.614298-04');
339               to_jsonb              
340 ------------------------------------
341  "2014-05-29T02:52:35.614298+10:30"
342 (1 row)
344 SET LOCAL TIME ZONE -8;
345 select to_jsonb(timestamptz '2014-05-28 12:22:35.614298-04');
346               to_jsonb              
347 ------------------------------------
348  "2014-05-28T08:22:35.614298-08:00"
349 (1 row)
351 COMMIT;
352 select to_jsonb(date '2014-05-28');
353    to_jsonb   
354 --------------
355  "2014-05-28"
356 (1 row)
358 select to_jsonb(date 'Infinity');
359   to_jsonb  
360 ------------
361  "infinity"
362 (1 row)
364 select to_jsonb(date '-Infinity');
365   to_jsonb   
366 -------------
367  "-infinity"
368 (1 row)
370 select to_jsonb(timestamp 'Infinity');
371   to_jsonb  
372 ------------
373  "infinity"
374 (1 row)
376 select to_jsonb(timestamp '-Infinity');
377   to_jsonb   
378 -------------
379  "-infinity"
380 (1 row)
382 select to_jsonb(timestamptz 'Infinity');
383   to_jsonb  
384 ------------
385  "infinity"
386 (1 row)
388 select to_jsonb(timestamptz '-Infinity');
389   to_jsonb   
390 -------------
391  "-infinity"
392 (1 row)
394 --jsonb_agg
395 SELECT jsonb_agg(q)
396   FROM ( SELECT $$a$$ || x AS b, y AS c,
397                ARRAY[ROW(x.*,ARRAY[1,2,3]),
398                ROW(y.*,ARRAY[4,5,6])] AS z
399          FROM generate_series(1,2) x,
400               generate_series(4,5) y) q;
401                                                                                                                                                                     jsonb_agg                                                                                                                                                                     
402 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
403  [{"b": "a1", "c": 4, "z": [{"f1": 1, "f2": [1, 2, 3]}, {"f1": 4, "f2": [4, 5, 6]}]}, {"b": "a1", "c": 5, "z": [{"f1": 1, "f2": [1, 2, 3]}, {"f1": 5, "f2": [4, 5, 6]}]}, {"b": "a2", "c": 4, "z": [{"f1": 2, "f2": [1, 2, 3]}, {"f1": 4, "f2": [4, 5, 6]}]}, {"b": "a2", "c": 5, "z": [{"f1": 2, "f2": [1, 2, 3]}, {"f1": 5, "f2": [4, 5, 6]}]}]
404 (1 row)
406 SELECT jsonb_agg(q ORDER BY x, y)
407   FROM rows q;
408                                jsonb_agg                               
409 -----------------------------------------------------------------------
410  [{"x": 1, "y": "txt1"}, {"x": 2, "y": "txt2"}, {"x": 3, "y": "txt3"}]
411 (1 row)
413 UPDATE rows SET x = NULL WHERE x = 1;
414 SELECT jsonb_agg(q ORDER BY x NULLS FIRST, y)
415   FROM rows q;
416                                 jsonb_agg                                 
417 --------------------------------------------------------------------------
418  [{"x": null, "y": "txt1"}, {"x": 2, "y": "txt2"}, {"x": 3, "y": "txt3"}]
419 (1 row)
421 -- jsonb extraction functions
422 CREATE TEMP TABLE test_jsonb (
423        json_type text,
424        test_json jsonb
426 INSERT INTO test_jsonb VALUES
427 ('scalar','"a scalar"'),
428 ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'),
429 ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}');
430 SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'scalar';
431  ?column? 
432 ----------
434 (1 row)
436 SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'array';
437  ?column? 
438 ----------
440 (1 row)
442 SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'object';
443  ?column? 
444 ----------
446 (1 row)
448 SELECT test_json -> 'field2' FROM test_jsonb WHERE json_type = 'object';
449  ?column? 
450 ----------
451  "val2"
452 (1 row)
454 SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'scalar';
455  ?column? 
456 ----------
458 (1 row)
460 SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'array';
461  ?column? 
462 ----------
464 (1 row)
466 SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'object';
467  ?column? 
468 ----------
469  val2
470 (1 row)
472 SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'scalar';
473  ?column? 
474 ----------
476 (1 row)
478 SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'array';
479  ?column? 
480 ----------
481  "two"
482 (1 row)
484 SELECT test_json -> 9 FROM test_jsonb WHERE json_type = 'array';
485  ?column? 
486 ----------
488 (1 row)
490 SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'object';
491  ?column? 
492 ----------
494 (1 row)
496 SELECT test_json ->> 6 FROM test_jsonb WHERE json_type = 'array';
497  ?column?  
498 -----------
499  [1, 2, 3]
500 (1 row)
502 SELECT test_json ->> 7 FROM test_jsonb WHERE json_type = 'array';
503  ?column?  
504 -----------
505  {"f1": 9}
506 (1 row)
508 SELECT test_json ->> 'field4' FROM test_jsonb WHERE json_type = 'object';
509  ?column? 
510 ----------
512 (1 row)
514 SELECT test_json ->> 'field5' FROM test_jsonb WHERE json_type = 'object';
515  ?column?  
516 -----------
517  [1, 2, 3]
518 (1 row)
520 SELECT test_json ->> 'field6' FROM test_jsonb WHERE json_type = 'object';
521  ?column?  
522 -----------
523  {"f1": 9}
524 (1 row)
526 SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'scalar';
527  ?column? 
528 ----------
530 (1 row)
532 SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'array';
533  ?column? 
534 ----------
535  two
536 (1 row)
538 SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'object';
539  ?column? 
540 ----------
542 (1 row)
544 SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'scalar';
545 ERROR:  cannot call jsonb_object_keys on a scalar
546 SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'array';
547 ERROR:  cannot call jsonb_object_keys on an array
548 SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'object';
549  jsonb_object_keys 
550 -------------------
551  field1
552  field2
553  field3
554  field4
555  field5
556  field6
557 (6 rows)
559 -- nulls
560 SELECT (test_json->'field3') IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'object';
561  expect_false 
562 --------------
564 (1 row)
566 SELECT (test_json->>'field3') IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'object';
567  expect_true 
568 -------------
570 (1 row)
572 SELECT (test_json->3) IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'array';
573  expect_false 
574 --------------
576 (1 row)
578 SELECT (test_json->>3) IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'array';
579  expect_true 
580 -------------
582 (1 row)
584 -- corner cases
585 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text;
586  ?column? 
587 ----------
589 (1 row)
591 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int;
592  ?column? 
593 ----------
595 (1 row)
597 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1;
598  ?column? 
599 ----------
601 (1 row)
603 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z';
604  ?column? 
605 ----------
607 (1 row)
609 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> '';
610  ?column? 
611 ----------
613 (1 row)
615 select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1;
616   ?column?   
617 -------------
618  {"b": "cc"}
619 (1 row)
621 select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3;
622  ?column? 
623 ----------
625 (1 row)
627 select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z';
628  ?column? 
629 ----------
631 (1 row)
633 select '{"a": "c", "b": null}'::jsonb -> 'b';
634  ?column? 
635 ----------
636  null
637 (1 row)
639 select '"foo"'::jsonb -> 1;
640  ?column? 
641 ----------
643 (1 row)
645 select '"foo"'::jsonb -> 'z';
646  ?column? 
647 ----------
649 (1 row)
651 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text;
652  ?column? 
653 ----------
655 (1 row)
657 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int;
658  ?column? 
659 ----------
661 (1 row)
663 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1;
664  ?column? 
665 ----------
667 (1 row)
669 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z';
670  ?column? 
671 ----------
673 (1 row)
675 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> '';
676  ?column? 
677 ----------
679 (1 row)
681 select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1;
682   ?column?   
683 -------------
684  {"b": "cc"}
685 (1 row)
687 select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3;
688  ?column? 
689 ----------
691 (1 row)
693 select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z';
694  ?column? 
695 ----------
697 (1 row)
699 select '{"a": "c", "b": null}'::jsonb ->> 'b';
700  ?column? 
701 ----------
703 (1 row)
705 select '"foo"'::jsonb ->> 1;
706  ?column? 
707 ----------
709 (1 row)
711 select '"foo"'::jsonb ->> 'z';
712  ?column? 
713 ----------
715 (1 row)
717 -- equality and inequality
718 SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb;
719  ?column? 
720 ----------
722 (1 row)
724 SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb;
725  ?column? 
726 ----------
728 (1 row)
730 SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb;
731  ?column? 
732 ----------
734 (1 row)
736 SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb;
737  ?column? 
738 ----------
740 (1 row)
742 -- containment
743 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}');
744  jsonb_contains 
745 ----------------
747 (1 row)
749 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":null}');
750  jsonb_contains 
751 ----------------
753 (1 row)
755 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "g":null}');
756  jsonb_contains 
757 ----------------
759 (1 row)
761 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"g":null}');
762  jsonb_contains 
763 ----------------
765 (1 row)
767 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"c"}');
768  jsonb_contains 
769 ----------------
771 (1 row)
773 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}');
774  jsonb_contains 
775 ----------------
777 (1 row)
779 SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":"q"}');
780  jsonb_contains 
781 ----------------
783 (1 row)
785 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}';
786  ?column? 
787 ----------
789 (1 row)
791 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":null}';
792  ?column? 
793 ----------
795 (1 row)
797 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "g":null}';
798  ?column? 
799 ----------
801 (1 row)
803 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"g":null}';
804  ?column? 
805 ----------
807 (1 row)
809 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"c"}';
810  ?column? 
811 ----------
813 (1 row)
815 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}';
816  ?column? 
817 ----------
819 (1 row)
821 SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":"q"}';
822  ?column? 
823 ----------
825 (1 row)
827 SELECT '[1,2]'::jsonb @> '[1,2,2]'::jsonb;
828  ?column? 
829 ----------
831 (1 row)
833 SELECT '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb;
834  ?column? 
835 ----------
837 (1 row)
839 SELECT '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb;
840  ?column? 
841 ----------
843 (1 row)
845 SELECT '[1,2,2]'::jsonb <@ '[1,2]'::jsonb;
846  ?column? 
847 ----------
849 (1 row)
851 SELECT '[1,2,2]'::jsonb <@ '[1,1,2]'::jsonb;
852  ?column? 
853 ----------
855 (1 row)
857 SELECT '[[1,2,2]]'::jsonb <@ '[[1,2]]'::jsonb;
858  ?column? 
859 ----------
861 (1 row)
863 SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}');
864  jsonb_contained 
865 -----------------
867 (1 row)
869 SELECT jsonb_contained('{"a":"b", "c":null}', '{"a":"b", "b":1, "c":null}');
870  jsonb_contained 
871 -----------------
873 (1 row)
875 SELECT jsonb_contained('{"a":"b", "g":null}', '{"a":"b", "b":1, "c":null}');
876  jsonb_contained 
877 -----------------
879 (1 row)
881 SELECT jsonb_contained('{"g":null}', '{"a":"b", "b":1, "c":null}');
882  jsonb_contained 
883 -----------------
885 (1 row)
887 SELECT jsonb_contained('{"a":"c"}', '{"a":"b", "b":1, "c":null}');
888  jsonb_contained 
889 -----------------
891 (1 row)
893 SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}');
894  jsonb_contained 
895 -----------------
897 (1 row)
899 SELECT jsonb_contained('{"a":"b", "c":"q"}', '{"a":"b", "b":1, "c":null}');
900  jsonb_contained 
901 -----------------
903 (1 row)
905 SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
906  ?column? 
907 ----------
909 (1 row)
911 SELECT '{"a":"b", "c":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
912  ?column? 
913 ----------
915 (1 row)
917 SELECT '{"a":"b", "g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
918  ?column? 
919 ----------
921 (1 row)
923 SELECT '{"g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
924  ?column? 
925 ----------
927 (1 row)
929 SELECT '{"a":"c"}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
930  ?column? 
931 ----------
933 (1 row)
935 SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
936  ?column? 
937 ----------
939 (1 row)
941 SELECT '{"a":"b", "c":"q"}'::jsonb <@ '{"a":"b", "b":1, "c":null}';
942  ?column? 
943 ----------
945 (1 row)
947 -- Raw scalar may contain another raw scalar, array may contain a raw scalar
948 SELECT '[5]'::jsonb @> '[5]';
949  ?column? 
950 ----------
952 (1 row)
954 SELECT '5'::jsonb @> '5';
955  ?column? 
956 ----------
958 (1 row)
960 SELECT '[5]'::jsonb @> '5';
961  ?column? 
962 ----------
964 (1 row)
966 -- But a raw scalar cannot contain an array
967 SELECT '5'::jsonb @> '[5]';
968  ?column? 
969 ----------
971 (1 row)
973 -- In general, one thing should always contain itself. Test array containment:
974 SELECT '["9", ["7", "3"], 1]'::jsonb @> '["9", ["7", "3"], 1]'::jsonb;
975  ?column? 
976 ----------
978 (1 row)
980 SELECT '["9", ["7", "3"], ["1"]]'::jsonb @> '["9", ["7", "3"], ["1"]]'::jsonb;
981  ?column? 
982 ----------
984 (1 row)
986 -- array containment string matching confusion bug
987 SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::jsonb @> '{"tags":["qu"]}';
988  ?column? 
989 ----------
991 (1 row)
993 -- array length
994 SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]');
995  jsonb_array_length 
996 --------------------
997                   5
998 (1 row)
1000 SELECT jsonb_array_length('[]');
1001  jsonb_array_length 
1002 --------------------
1003                   0
1004 (1 row)
1006 SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}');
1007 ERROR:  cannot get array length of a non-array
1008 SELECT jsonb_array_length('4');
1009 ERROR:  cannot get array length of a scalar
1010 -- each
1011 SELECT jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}');
1012      jsonb_each     
1013 --------------------
1014  (f1,"[1, 2, 3]")
1015  (f2,"{""f3"": 1}")
1016  (f4,null)
1017 (3 rows)
1019 SELECT jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q;
1020                           q                           
1021 ------------------------------------------------------
1022  (1,"""first""")
1023  (a,"{""1"": ""first"", ""b"": ""c"", ""c"": ""b""}")
1024  (b,"[1, 2]")
1025  (c,"""cc""")
1026  (n,null)
1027 (5 rows)
1029 SELECT * FROM jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q;
1030  key |   value   
1031 -----+-----------
1032  f1  | [1, 2, 3]
1033  f2  | {"f3": 1}
1034  f4  | null
1035  f5  | 99
1036  f6  | "stringy"
1037 (5 rows)
1039 SELECT * FROM jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q;
1040  key |               value                
1041 -----+------------------------------------
1042  1   | "first"
1043  a   | {"1": "first", "b": "c", "c": "b"}
1044  b   | [1, 2]
1045  c   | "cc"
1046  n   | null
1047 (5 rows)
1049 SELECT jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}');
1050   jsonb_each_text   
1051 --------------------
1052  (f1,"[1, 2, 3]")
1053  (f2,"{""f3"": 1}")
1054  (f4,)
1055  (f5,null)
1056 (4 rows)
1058 SELECT jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q;
1059                           q                           
1060 ------------------------------------------------------
1061  (1,first)
1062  (a,"{""1"": ""first"", ""b"": ""c"", ""c"": ""b""}")
1063  (b,"[1, 2]")
1064  (c,cc)
1065  (n,)
1066 (5 rows)
1068 SELECT * FROM jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q;
1069  key |   value   
1070 -----+-----------
1071  f1  | [1, 2, 3]
1072  f2  | {"f3": 1}
1073  f4  | 
1074  f5  | 99
1075  f6  | stringy
1076 (5 rows)
1078 SELECT * FROM jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q;
1079  key |               value                
1080 -----+------------------------------------
1081  1   | first
1082  a   | {"1": "first", "b": "c", "c": "b"}
1083  b   | [1, 2]
1084  c   | cc
1085  n   | 
1086 (5 rows)
1088 -- exists
1089 SELECT jsonb_exists('{"a":null, "b":"qq"}', 'a');
1090  jsonb_exists 
1091 --------------
1093 (1 row)
1095 SELECT jsonb_exists('{"a":null, "b":"qq"}', 'b');
1096  jsonb_exists 
1097 --------------
1099 (1 row)
1101 SELECT jsonb_exists('{"a":null, "b":"qq"}', 'c');
1102  jsonb_exists 
1103 --------------
1105 (1 row)
1107 SELECT jsonb_exists('{"a":"null", "b":"qq"}', 'a');
1108  jsonb_exists 
1109 --------------
1111 (1 row)
1113 SELECT jsonb '{"a":null, "b":"qq"}' ? 'a';
1114  ?column? 
1115 ----------
1117 (1 row)
1119 SELECT jsonb '{"a":null, "b":"qq"}' ? 'b';
1120  ?column? 
1121 ----------
1123 (1 row)
1125 SELECT jsonb '{"a":null, "b":"qq"}' ? 'c';
1126  ?column? 
1127 ----------
1129 (1 row)
1131 SELECT jsonb '{"a":"null", "b":"qq"}' ? 'a';
1132  ?column? 
1133 ----------
1135 (1 row)
1137 -- array exists - array elements should behave as keys
1138 SELECT count(*) from testjsonb  WHERE j->'array' ? 'bar';
1139  count 
1140 -------
1141      3
1142 (1 row)
1144 -- type sensitive array exists - should return no rows (since "exists" only
1145 -- matches strings that are either object keys or array elements)
1146 SELECT count(*) from testjsonb  WHERE j->'array' ? '5'::text;
1147  count 
1148 -------
1149      0
1150 (1 row)
1152 -- However, a raw scalar is *contained* within the array
1153 SELECT count(*) from testjsonb  WHERE j->'array' @> '5'::jsonb;
1154  count 
1155 -------
1156      1
1157 (1 row)
1159 SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']);
1160  jsonb_exists_any 
1161 ------------------
1163 (1 row)
1165 SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['b','a']);
1166  jsonb_exists_any 
1167 ------------------
1169 (1 row)
1171 SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','a']);
1172  jsonb_exists_any 
1173 ------------------
1175 (1 row)
1177 SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','d']);
1178  jsonb_exists_any 
1179 ------------------
1181 (1 row)
1183 SELECT jsonb_exists_any('{"a":null, "b":"qq"}', '{}'::text[]);
1184  jsonb_exists_any 
1185 ------------------
1187 (1 row)
1189 SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['a','b'];
1190  ?column? 
1191 ----------
1193 (1 row)
1195 SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['b','a'];
1196  ?column? 
1197 ----------
1199 (1 row)
1201 SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','a'];
1202  ?column? 
1203 ----------
1205 (1 row)
1207 SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','d'];
1208  ?column? 
1209 ----------
1211 (1 row)
1213 SELECT jsonb '{"a":null, "b":"qq"}' ?| '{}'::text[];
1214  ?column? 
1215 ----------
1217 (1 row)
1219 SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['a','b']);
1220  jsonb_exists_all 
1221 ------------------
1223 (1 row)
1225 SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['b','a']);
1226  jsonb_exists_all 
1227 ------------------
1229 (1 row)
1231 SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','a']);
1232  jsonb_exists_all 
1233 ------------------
1235 (1 row)
1237 SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','d']);
1238  jsonb_exists_all 
1239 ------------------
1241 (1 row)
1243 SELECT jsonb_exists_all('{"a":null, "b":"qq"}', '{}'::text[]);
1244  jsonb_exists_all 
1245 ------------------
1247 (1 row)
1249 SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','b'];
1250  ?column? 
1251 ----------
1253 (1 row)
1255 SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['b','a'];
1256  ?column? 
1257 ----------
1259 (1 row)
1261 SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','a'];
1262  ?column? 
1263 ----------
1265 (1 row)
1267 SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','d'];
1268  ?column? 
1269 ----------
1271 (1 row)
1273 SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','a', 'b', 'b', 'b'];
1274  ?column? 
1275 ----------
1277 (1 row)
1279 SELECT jsonb '{"a":null, "b":"qq"}' ?& '{}'::text[];
1280  ?column? 
1281 ----------
1283 (1 row)
1285 -- typeof
1286 SELECT jsonb_typeof('{}') AS object;
1287  object 
1288 --------
1289  object
1290 (1 row)
1292 SELECT jsonb_typeof('{"c":3,"p":"o"}') AS object;
1293  object 
1294 --------
1295  object
1296 (1 row)
1298 SELECT jsonb_typeof('[]') AS array;
1299  array 
1300 -------
1301  array
1302 (1 row)
1304 SELECT jsonb_typeof('["a", 1]') AS array;
1305  array 
1306 -------
1307  array
1308 (1 row)
1310 SELECT jsonb_typeof('null') AS "null";
1311  null 
1312 ------
1313  null
1314 (1 row)
1316 SELECT jsonb_typeof('1') AS number;
1317  number 
1318 --------
1319  number
1320 (1 row)
1322 SELECT jsonb_typeof('-1') AS number;
1323  number 
1324 --------
1325  number
1326 (1 row)
1328 SELECT jsonb_typeof('1.0') AS number;
1329  number 
1330 --------
1331  number
1332 (1 row)
1334 SELECT jsonb_typeof('1e2') AS number;
1335  number 
1336 --------
1337  number
1338 (1 row)
1340 SELECT jsonb_typeof('-1.0') AS number;
1341  number 
1342 --------
1343  number
1344 (1 row)
1346 SELECT jsonb_typeof('true') AS boolean;
1347  boolean 
1348 ---------
1349  boolean
1350 (1 row)
1352 SELECT jsonb_typeof('false') AS boolean;
1353  boolean 
1354 ---------
1355  boolean
1356 (1 row)
1358 SELECT jsonb_typeof('"hello"') AS string;
1359  string 
1360 --------
1361  string
1362 (1 row)
1364 SELECT jsonb_typeof('"true"') AS string;
1365  string 
1366 --------
1367  string
1368 (1 row)
1370 SELECT jsonb_typeof('"1.0"') AS string;
1371  string 
1372 --------
1373  string
1374 (1 row)
1376 -- jsonb_build_array, jsonb_build_object, jsonb_object_agg
1377 SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}');
1378                             jsonb_build_array                            
1379 -------------------------------------------------------------------------
1380  ["a", 1, "b", 1.2, "c", true, "d", null, "e", {"x": 3, "y": [1, 2, 3]}]
1381 (1 row)
1383 SELECT jsonb_build_array('a', NULL); -- ok
1384  jsonb_build_array 
1385 -------------------
1386  ["a", null]
1387 (1 row)
1389 SELECT jsonb_build_array(VARIADIC NULL::text[]); -- ok
1390  jsonb_build_array 
1391 -------------------
1393 (1 row)
1395 SELECT jsonb_build_array(VARIADIC '{}'::text[]); -- ok
1396  jsonb_build_array 
1397 -------------------
1398  []
1399 (1 row)
1401 SELECT jsonb_build_array(VARIADIC '{a,b,c}'::text[]); -- ok
1402  jsonb_build_array 
1403 -------------------
1404  ["a", "b", "c"]
1405 (1 row)
1407 SELECT jsonb_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok
1408  jsonb_build_array 
1409 -------------------
1410  ["a", null]
1411 (1 row)
1413 SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok
1414   jsonb_build_array   
1415 ----------------------
1416  ["1", "2", "3", "4"]
1417 (1 row)
1419 SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok
1420  jsonb_build_array 
1421 -------------------
1422  [1, 2, 3, 4]
1423 (1 row)
1425 SELECT jsonb_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok
1426  jsonb_build_array  
1427 --------------------
1428  [1, 4, 2, 5, 3, 6]
1429 (1 row)
1431 SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}');
1432                            jsonb_build_object                            
1433 -------------------------------------------------------------------------
1434  {"a": 1, "b": 1.2, "c": true, "d": null, "e": {"x": 3, "y": [1, 2, 3]}}
1435 (1 row)
1437 SELECT jsonb_build_object(
1438        'a', jsonb_build_object('b',false,'c',99),
1439        'd', jsonb_build_object('e',array[9,8,7]::int[],
1440            'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r)));
1441                                        jsonb_build_object                                       
1442 ------------------------------------------------------------------------------------------------
1443  {"a": {"b": false, "c": 99}, "d": {"e": [9, 8, 7], "f": {"name": "pg_class", "relkind": "r"}}}
1444 (1 row)
1446 SELECT jsonb_build_object('{a,b,c}'::text[]); -- error
1447 ERROR:  argument list must have even number of elements
1448 HINT:  The arguments of jsonb_build_object() must consist of alternating keys and values.
1449 SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array
1450 ERROR:  key value must be scalar, not array, composite, or json
1451 SELECT jsonb_build_object('a', 'b', 'c'); -- error
1452 ERROR:  argument list must have even number of elements
1453 HINT:  The arguments of jsonb_build_object() must consist of alternating keys and values.
1454 SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL
1455 ERROR:  argument 1: key must not be null
1456 SELECT jsonb_build_object('a', NULL); -- ok
1457  jsonb_build_object 
1458 --------------------
1459  {"a": null}
1460 (1 row)
1462 SELECT jsonb_build_object(VARIADIC NULL::text[]); -- ok
1463  jsonb_build_object 
1464 --------------------
1466 (1 row)
1468 SELECT jsonb_build_object(VARIADIC '{}'::text[]); -- ok
1469  jsonb_build_object 
1470 --------------------
1471  {}
1472 (1 row)
1474 SELECT jsonb_build_object(VARIADIC '{a,b,c}'::text[]); -- error
1475 ERROR:  argument list must have even number of elements
1476 HINT:  The arguments of jsonb_build_object() must consist of alternating keys and values.
1477 SELECT jsonb_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok
1478  jsonb_build_object 
1479 --------------------
1480  {"a": null}
1481 (1 row)
1483 SELECT jsonb_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL
1484 ERROR:  argument 1: key must not be null
1485 SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok
1486   jsonb_build_object  
1487 ----------------------
1488  {"1": "2", "3": "4"}
1489 (1 row)
1491 SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok
1492  jsonb_build_object 
1493 --------------------
1494  {"1": 2, "3": 4}
1495 (1 row)
1497 SELECT jsonb_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok
1498     jsonb_build_object    
1499 --------------------------
1500  {"1": 4, "2": 5, "3": 6}
1501 (1 row)
1503 -- empty objects/arrays
1504 SELECT jsonb_build_array();
1505  jsonb_build_array 
1506 -------------------
1507  []
1508 (1 row)
1510 SELECT jsonb_build_object();
1511  jsonb_build_object 
1512 --------------------
1513  {}
1514 (1 row)
1516 -- make sure keys are quoted
1517 SELECT jsonb_build_object(1,2);
1518  jsonb_build_object 
1519 --------------------
1520  {"1": 2}
1521 (1 row)
1523 -- keys must be scalar and not null
1524 SELECT jsonb_build_object(null,2);
1525 ERROR:  argument 1: key must not be null
1526 SELECT jsonb_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r;
1527 ERROR:  key value must be scalar, not array, composite, or json
1528 SELECT jsonb_build_object(json '{"a":1,"b":2}', 3);
1529 ERROR:  key value must be scalar, not array, composite, or json
1530 SELECT jsonb_build_object('{1,2,3}'::int[], 3);
1531 ERROR:  key value must be scalar, not array, composite, or json
1532 -- handling of NULL values
1533 SELECT jsonb_object_agg(1, NULL::jsonb);
1534  jsonb_object_agg 
1535 ------------------
1536  {"1": null}
1537 (1 row)
1539 SELECT jsonb_object_agg(NULL, '{"a":1}');
1540 ERROR:  field name must not be null
1541 CREATE TEMP TABLE foo (serial_num int, name text, type text);
1542 INSERT INTO foo VALUES (847001,'t15','GE1043');
1543 INSERT INTO foo VALUES (847002,'t16','GE1043');
1544 INSERT INTO foo VALUES (847003,'sub-alpha','GESS90');
1545 SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type)))
1546 FROM foo;
1547                                                                      jsonb_build_object                                                                      
1548 -------------------------------------------------------------------------------------------------------------------------------------------------------------
1549  {"turbines": {"847001": {"name": "t15", "type": "GE1043"}, "847002": {"name": "t16", "type": "GE1043"}, "847003": {"name": "sub-alpha", "type": "GESS90"}}}
1550 (1 row)
1552 SELECT jsonb_object_agg(name, type) FROM foo;
1553                      jsonb_object_agg                      
1554 -----------------------------------------------------------
1555  {"t15": "GE1043", "t16": "GE1043", "sub-alpha": "GESS90"}
1556 (1 row)
1558 INSERT INTO foo VALUES (999999, NULL, 'bar');
1559 SELECT jsonb_object_agg(name, type) FROM foo;
1560 ERROR:  field name must not be null
1561 -- jsonb_object
1562 -- empty object, one dimension
1563 SELECT jsonb_object('{}');
1564  jsonb_object 
1565 --------------
1566  {}
1567 (1 row)
1569 -- empty object, two dimensions
1570 SELECT jsonb_object('{}', '{}');
1571  jsonb_object 
1572 --------------
1573  {}
1574 (1 row)
1576 -- one dimension
1577 SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
1578                    jsonb_object                    
1579 ---------------------------------------------------
1580  {"3": null, "a": "1", "b": "2", "d e f": "a b c"}
1581 (1 row)
1583 -- same but with two dimensions
1584 SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}');
1585                    jsonb_object                    
1586 ---------------------------------------------------
1587  {"3": null, "a": "1", "b": "2", "d e f": "a b c"}
1588 (1 row)
1590 -- odd number error
1591 SELECT jsonb_object('{a,b,c}');
1592 ERROR:  array must have even number of elements
1593 -- one column error
1594 SELECT jsonb_object('{{a},{b}}');
1595 ERROR:  array must have two columns
1596 -- too many columns error
1597 SELECT jsonb_object('{{a,b,c},{b,c,d}}');
1598 ERROR:  array must have two columns
1599 -- too many dimensions error
1600 SELECT jsonb_object('{{{a,b},{c,d}},{{b,c},{d,e}}}');
1601 ERROR:  wrong number of array subscripts
1602 --two argument form of jsonb_object
1603 select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}');
1604                    jsonb_object                   
1605 --------------------------------------------------
1606  {"a": "1", "b": "2", "c": "3", "d e f": "a b c"}
1607 (1 row)
1609 -- too many dimensions
1610 SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}');
1611 ERROR:  wrong number of array subscripts
1612 -- mismatched dimensions
1613 select jsonb_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}');
1614 ERROR:  mismatched array dimensions
1615 select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}');
1616 ERROR:  mismatched array dimensions
1617 -- null key error
1618 select jsonb_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}');
1619 ERROR:  null value not allowed for object key
1620 -- empty key is allowed
1621 select jsonb_object('{a,b,"","d e f"}','{1,2,3,"a b c"}');
1622                   jsonb_object                   
1623 -------------------------------------------------
1624  {"": "3", "a": "1", "b": "2", "d e f": "a b c"}
1625 (1 row)
1627 -- extract_path, extract_path_as_text
1628 SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6');
1629  jsonb_extract_path 
1630 --------------------
1631  "stringy"
1632 (1 row)
1634 SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2');
1635  jsonb_extract_path 
1636 --------------------
1637  {"f3": 1}
1638 (1 row)
1640 SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text);
1641  jsonb_extract_path 
1642 --------------------
1643  "f3"
1644 (1 row)
1646 SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text);
1647  jsonb_extract_path 
1648 --------------------
1650 (1 row)
1652 SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6');
1653  jsonb_extract_path_text 
1654 -------------------------
1655  stringy
1656 (1 row)
1658 SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2');
1659  jsonb_extract_path_text 
1660 -------------------------
1661  {"f3": 1}
1662 (1 row)
1664 SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text);
1665  jsonb_extract_path_text 
1666 -------------------------
1667  f3
1668 (1 row)
1670 SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text);
1671  jsonb_extract_path_text 
1672 -------------------------
1674 (1 row)
1676 -- extract_path nulls
1677 SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false;
1678  expect_false 
1679 --------------
1681 (1 row)
1683 SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true;
1684  expect_true 
1685 -------------
1687 (1 row)
1689 SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false;
1690  expect_false 
1691 --------------
1693 (1 row)
1695 SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true;
1696  expect_true 
1697 -------------
1699 (1 row)
1701 -- extract_path operators
1702 SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f4','f6'];
1703  ?column?  
1704 -----------
1705  "stringy"
1706 (1 row)
1708 SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2'];
1709  ?column?  
1710 -----------
1711  {"f3": 1}
1712 (1 row)
1714 SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0'];
1715  ?column? 
1716 ----------
1717  "f3"
1718 (1 row)
1720 SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1'];
1721  ?column? 
1722 ----------
1724 (1 row)
1726 SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6'];
1727  ?column? 
1728 ----------
1729  stringy
1730 (1 row)
1732 SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2'];
1733  ?column?  
1734 -----------
1735  {"f3": 1}
1736 (1 row)
1738 SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0'];
1739  ?column? 
1740 ----------
1741  f3
1742 (1 row)
1744 SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1'];
1745  ?column? 
1746 ----------
1748 (1 row)
1750 -- corner cases for same
1751 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> '{}';
1752           ?column?          
1753 ----------------------------
1754  {"a": {"b": {"c": "foo"}}}
1755 (1 row)
1757 select '[1,2,3]'::jsonb #> '{}';
1758  ?column?  
1759 -----------
1760  [1, 2, 3]
1761 (1 row)
1763 select '"foo"'::jsonb #> '{}';
1764  ?column? 
1765 ----------
1766  "foo"
1767 (1 row)
1769 select '42'::jsonb #> '{}';
1770  ?column? 
1771 ----------
1772  42
1773 (1 row)
1775 select 'null'::jsonb #> '{}';
1776  ?column? 
1777 ----------
1778  null
1779 (1 row)
1781 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a'];
1782       ?column?       
1783 ---------------------
1784  {"b": {"c": "foo"}}
1785 (1 row)
1787 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null];
1788  ?column? 
1789 ----------
1791 (1 row)
1793 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', ''];
1794  ?column? 
1795 ----------
1797 (1 row)
1799 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b'];
1800    ?column?   
1801 --------------
1802  {"c": "foo"}
1803 (1 row)
1805 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c'];
1806  ?column? 
1807 ----------
1808  "foo"
1809 (1 row)
1811 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d'];
1812  ?column? 
1813 ----------
1815 (1 row)
1817 select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c'];
1818  ?column? 
1819 ----------
1821 (1 row)
1823 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b'];
1824  ?column? 
1825 ----------
1826  "cc"
1827 (1 row)
1829 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b'];
1830  ?column? 
1831 ----------
1833 (1 row)
1835 select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b'];
1836  ?column? 
1837 ----------
1838  "cc"
1839 (1 row)
1841 select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b'];
1842  ?column? 
1843 ----------
1845 (1 row)
1847 select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b'];
1848  ?column? 
1849 ----------
1850  null
1851 (1 row)
1853 select '"foo"'::jsonb #> array['z'];
1854  ?column? 
1855 ----------
1857 (1 row)
1859 select '42'::jsonb #> array['f2'];
1860  ?column? 
1861 ----------
1863 (1 row)
1865 select '42'::jsonb #> array['0'];
1866  ?column? 
1867 ----------
1869 (1 row)
1871 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}';
1872           ?column?          
1873 ----------------------------
1874  {"a": {"b": {"c": "foo"}}}
1875 (1 row)
1877 select '[1,2,3]'::jsonb #>> '{}';
1878  ?column?  
1879 -----------
1880  [1, 2, 3]
1881 (1 row)
1883 select '"foo"'::jsonb #>> '{}';
1884  ?column? 
1885 ----------
1886  foo
1887 (1 row)
1889 select '42'::jsonb #>> '{}';
1890  ?column? 
1891 ----------
1892  42
1893 (1 row)
1895 select 'null'::jsonb #>> '{}';
1896  ?column? 
1897 ----------
1899 (1 row)
1901 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a'];
1902       ?column?       
1903 ---------------------
1904  {"b": {"c": "foo"}}
1905 (1 row)
1907 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null];
1908  ?column? 
1909 ----------
1911 (1 row)
1913 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', ''];
1914  ?column? 
1915 ----------
1917 (1 row)
1919 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b'];
1920    ?column?   
1921 --------------
1922  {"c": "foo"}
1923 (1 row)
1925 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c'];
1926  ?column? 
1927 ----------
1928  foo
1929 (1 row)
1931 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d'];
1932  ?column? 
1933 ----------
1935 (1 row)
1937 select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c'];
1938  ?column? 
1939 ----------
1941 (1 row)
1943 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b'];
1944  ?column? 
1945 ----------
1946  cc
1947 (1 row)
1949 select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b'];
1950  ?column? 
1951 ----------
1953 (1 row)
1955 select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b'];
1956  ?column? 
1957 ----------
1958  cc
1959 (1 row)
1961 select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b'];
1962  ?column? 
1963 ----------
1965 (1 row)
1967 select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b'];
1968  ?column? 
1969 ----------
1971 (1 row)
1973 select '"foo"'::jsonb #>> array['z'];
1974  ?column? 
1975 ----------
1977 (1 row)
1979 select '42'::jsonb #>> array['f2'];
1980  ?column? 
1981 ----------
1983 (1 row)
1985 select '42'::jsonb #>> array['0'];
1986  ?column? 
1987 ----------
1989 (1 row)
1991 -- array_elements
1992 SELECT jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]');
1993     jsonb_array_elements    
1994 ----------------------------
1996  true
1997  [1, [2, 3]]
1998  null
1999  {"f1": 1, "f2": [7, 8, 9]}
2000  false
2001 (6 rows)
2003 SELECT * FROM jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]') q;
2004            value            
2005 ----------------------------
2007  true
2008  [1, [2, 3]]
2009  null
2010  {"f1": 1, "f2": [7, 8, 9]}
2011  false
2012 (6 rows)
2014 SELECT jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]');
2015  jsonb_array_elements_text  
2016 ----------------------------
2018  true
2019  [1, [2, 3]]
2021  {"f1": 1, "f2": [7, 8, 9]}
2022  false
2023  stringy
2024 (7 rows)
2026 SELECT * FROM jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q;
2027            value            
2028 ----------------------------
2030  true
2031  [1, [2, 3]]
2033  {"f1": 1, "f2": [7, 8, 9]}
2034  false
2035  stringy
2036 (7 rows)
2038 -- populate_record
2039 CREATE TYPE jbpop AS (a text, b int, c timestamp);
2040 CREATE DOMAIN jsb_int_not_null  AS int     NOT NULL;
2041 CREATE DOMAIN jsb_int_array_1d  AS int[]   CHECK(array_length(VALUE, 1) = 3);
2042 CREATE DOMAIN jsb_int_array_2d  AS int[][] CHECK(array_length(VALUE, 2) = 3);
2043 create type jb_unordered_pair as (x int, y int);
2044 create domain jb_ordered_pair as jb_unordered_pair check((value).x <= (value).y);
2045 CREATE TYPE jsbrec AS (
2046         i       int,
2047         ia      _int4,
2048         ia1     int[],
2049         ia2     int[][],
2050         ia3     int[][][],
2051         ia1d    jsb_int_array_1d,
2052         ia2d    jsb_int_array_2d,
2053         t       text,
2054         ta      text[],
2055         c       char(10),
2056         ca      char(10)[],
2057         ts      timestamp,
2058         js      json,
2059         jsb     jsonb,
2060         jsa     json[],
2061         rec     jbpop,
2062         reca    jbpop[]
2064 CREATE TYPE jsbrec_i_not_null AS (
2065         i       jsb_int_not_null
2067 SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q;
2068    a    | b | c 
2069 --------+---+---
2070  blurfl |   | 
2071 (1 row)
2073 SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q;
2074    a    | b |            c             
2075 --------+---+--------------------------
2076  blurfl | 3 | Mon Dec 31 15:30:56 2012
2077 (1 row)
2079 SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q;
2080    a    | b | c 
2081 --------+---+---
2082  blurfl |   | 
2083 (1 row)
2085 SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q;
2086    a    | b |            c             
2087 --------+---+--------------------------
2088  blurfl | 3 | Mon Dec 31 15:30:56 2012
2089 (1 row)
2091 SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":[100,200,false],"x":43.2}') q;
2092          a         | b | c 
2093 -------------------+---+---
2094  [100, 200, false] |   | 
2095 (1 row)
2097 SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":[100,200,false],"x":43.2}') q;
2098          a         | b |            c             
2099 -------------------+---+--------------------------
2100  [100, 200, false] | 3 | Mon Dec 31 15:30:56 2012
2101 (1 row)
2103 SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"c":[100,200,false],"x":43.2}') q;
2104 ERROR:  invalid input syntax for type timestamp: "[100, 200, false]"
2105 SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop, '{}') q;
2106  a | b |            c             
2107 ---+---+--------------------------
2108  x | 3 | Mon Dec 31 15:30:56 2012
2109 (1 row)
2111 SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"x": 43.2}') q;
2112 ERROR:  domain jsb_int_not_null does not allow null values
2113 SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": null}') q;
2114 ERROR:  domain jsb_int_not_null does not allow null values
2115 SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": 12345}') q;
2116    i   
2117 -------
2118  12345
2119 (1 row)
2121 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": null}') q;
2122  ia 
2123 ----
2125 (1 row)
2127 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": 123}') q;
2128 ERROR:  expected JSON array
2129 HINT:  See the value of key "ia".
2130 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [1, "2", null, 4]}') q;
2131       ia      
2132 --------------
2133  {1,2,NULL,4}
2134 (1 row)
2136 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1, 2], [3, 4]]}') q;
2137       ia       
2138 ---------------
2139  {{1,2},{3,4}}
2140 (1 row)
2142 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], 2]}') q;
2143 ERROR:  expected JSON array
2144 HINT:  See the array element [1] of key "ia".
2145 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], [2, 3]]}') q;
2146 ERROR:  malformed JSON array
2147 DETAIL:  Multidimensional arrays must have sub-arrays with matching dimensions.
2148 SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": "{1,2,3}"}') q;
2149    ia    
2150 ---------
2151  {1,2,3}
2152 (1 row)
2154 SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": null}') q;
2155  ia1 
2156 -----
2158 (1 row)
2160 SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": 123}') q;
2161 ERROR:  expected JSON array
2162 HINT:  See the value of key "ia1".
2163 SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [1, "2", null, 4]}') q;
2164      ia1      
2165 --------------
2166  {1,2,NULL,4}
2167 (1 row)
2169 SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [[1, 2, 3]]}') q;
2170     ia1    
2171 -----------
2172  {{1,2,3}}
2173 (1 row)
2175 SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": null}') q;
2176  ia1d 
2177 ------
2179 (1 row)
2181 SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": 123}') q;
2182 ERROR:  expected JSON array
2183 HINT:  See the value of key "ia1d".
2184 SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null, 4]}') q;
2185 ERROR:  value for domain jsb_int_array_1d violates check constraint "jsb_int_array_1d_check"
2186 SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null]}') q;
2187     ia1d    
2188 ------------
2189  {1,2,NULL}
2190 (1 row)
2192 SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [1, "2", null, 4]}') q;
2193      ia2      
2194 --------------
2195  {1,2,NULL,4}
2196 (1 row)
2198 SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [null, 4]]}') q;
2199        ia2        
2200 ------------------
2201  {{1,2},{NULL,4}}
2202 (1 row)
2204 SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[], []]}') q;
2205  ia2 
2206 -----
2207  {}
2208 (1 row)
2210 SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [3]]}') q;
2211 ERROR:  malformed JSON array
2212 DETAIL:  Multidimensional arrays must have sub-arrays with matching dimensions.
2213 SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], 3, 4]}') q;
2214 ERROR:  expected JSON array
2215 HINT:  See the array element [1] of key "ia2".
2216 SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2"], [null, 4]]}') q;
2217 ERROR:  value for domain jsb_int_array_2d violates check constraint "jsb_int_array_2d_check"
2218 SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q;
2219          ia2d         
2220 ----------------------
2221  {{1,2,3},{NULL,5,6}}
2222 (1 row)
2224 SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [1, "2", null, 4]}') q;
2225      ia3      
2226 --------------
2227  {1,2,NULL,4}
2228 (1 row)
2230 SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [[1, 2], [null, 4]]}') q;
2231        ia3        
2232 ------------------
2233  {{1,2},{NULL,4}}
2234 (1 row)
2236 SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q;
2237  ia3 
2238 -----
2239  {}
2240 (1 row)
2242 SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q;
2243         ia3        
2244 -------------------
2245  {{{1,2}},{{3,4}}}
2246 (1 row)
2248 SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q;
2249               ia3              
2250 -------------------------------
2251  {{{1,2},{3,4}},{{5,6},{7,8}}}
2252 (1 row)
2254 SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q;
2255 ERROR:  malformed JSON array
2256 DETAIL:  Multidimensional arrays must have sub-arrays with matching dimensions.
2257 SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": null}') q;
2258  ta 
2259 ----
2261 (1 row)
2263 SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": 123}') q;
2264 ERROR:  expected JSON array
2265 HINT:  See the value of key "ta".
2266 SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [1, "2", null, 4]}') q;
2267       ta      
2268 --------------
2269  {1,2,NULL,4}
2270 (1 row)
2272 SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q;
2273 ERROR:  expected JSON array
2274 HINT:  See the array element [1] of key "ta".
2275 SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": null}') q;
2276  c 
2279 (1 row)
2281 SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaa"}') q;
2282      c      
2283 ------------
2284  aaa       
2285 (1 row)
2287 SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaa"}') q;
2288      c      
2289 ------------
2290  aaaaaaaaaa
2291 (1 row)
2293 SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaaaaa"}') q;
2294 ERROR:  value too long for type character(10)
2295 SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": null}') q;
2296  ca 
2297 ----
2299 (1 row)
2301 SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": 123}') q;
2302 ERROR:  expected JSON array
2303 HINT:  See the value of key "ca".
2304 SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [1, "2", null, 4]}') q;
2305                       ca                       
2306 -----------------------------------------------
2307  {"1         ","2         ",NULL,"4         "}
2308 (1 row)
2310 SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q;
2311 ERROR:  value too long for type character(10)
2312 SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q;
2313 ERROR:  expected JSON array
2314 HINT:  See the array element [1] of key "ca".
2315 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": null}') q;
2316  js 
2317 ----
2319 (1 row)
2321 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": true}') q;
2322   js  
2323 ------
2324  true
2325 (1 row)
2327 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": 123.45}') q;
2328    js   
2329 --------
2330  123.45
2331 (1 row)
2333 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "123.45"}') q;
2334     js    
2335 ----------
2336  "123.45"
2337 (1 row)
2339 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "abc"}') q;
2340   js   
2341 -------
2342  "abc"
2343 (1 row)
2345 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": [123, "123", null, {"key": "value"}]}') q;
2346                   js                  
2347 --------------------------------------
2348  [123, "123", null, {"key": "value"}]
2349 (1 row)
2351 SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q;
2352                   js                  
2353 --------------------------------------
2354  {"a": "bbb", "b": null, "c": 123.45}
2355 (1 row)
2357 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": null}') q;
2358  jsb 
2359 -----
2361 (1 row)
2363 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": true}') q;
2364  jsb  
2365 ------
2366  true
2367 (1 row)
2369 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": 123.45}') q;
2370   jsb   
2371 --------
2372  123.45
2373 (1 row)
2375 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "123.45"}') q;
2376    jsb    
2377 ----------
2378  "123.45"
2379 (1 row)
2381 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "abc"}') q;
2382   jsb  
2383 -------
2384  "abc"
2385 (1 row)
2387 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q;
2388                  jsb                  
2389 --------------------------------------
2390  [123, "123", null, {"key": "value"}]
2391 (1 row)
2393 SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q;
2394                  jsb                  
2395 --------------------------------------
2396  {"a": "bbb", "b": null, "c": 123.45}
2397 (1 row)
2399 SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": null}') q;
2400  jsa 
2401 -----
2403 (1 row)
2405 SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": 123}') q;
2406 ERROR:  expected JSON array
2407 HINT:  See the value of key "jsa".
2408 SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": [1, "2", null, 4]}') q;
2409         jsa         
2410 --------------------
2411  {1,"\"2\"",NULL,4}
2412 (1 row)
2414 SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q;
2415                           jsa                          
2416 -------------------------------------------------------
2417  {"\"aaa\"",NULL,"[1, 2, \"3\", {}]","{\"k\": \"v\"}"}
2418 (1 row)
2420 SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": 123}') q;
2421 ERROR:  cannot call populate_composite on a scalar
2422 SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": [1, 2]}') q;
2423 ERROR:  cannot call populate_composite on an array
2424 SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q;
2425                 rec                
2426 -----------------------------------
2427  (abc,,"Thu Jan 02 00:00:00 2003")
2428 (1 row)
2430 SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": "(abc,42,01.02.2003)"}') q;
2431                  rec                 
2432 -------------------------------------
2433  (abc,42,"Thu Jan 02 00:00:00 2003")
2434 (1 row)
2436 SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": 123}') q;
2437 ERROR:  expected JSON array
2438 HINT:  See the value of key "reca".
2439 SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [1, 2]}') q;
2440 ERROR:  cannot call populate_composite on a scalar
2441 SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q;
2442                           reca                          
2443 --------------------------------------------------------
2444  {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"}
2445 (1 row)
2447 SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": ["(abc,42,01.02.2003)"]}') q;
2448                    reca                    
2449 -------------------------------------------
2450  {"(abc,42,\"Thu Jan 02 00:00:00 2003\")"}
2451 (1 row)
2453 SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q;
2454                    reca                    
2455 -------------------------------------------
2456  {"(abc,42,\"Thu Jan 02 00:00:00 2003\")"}
2457 (1 row)
2459 SELECT rec FROM jsonb_populate_record(
2460         row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
2461                 row('x',3,'2012-12-31 15:30:56')::jbpop,NULL)::jsbrec,
2462         '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}'
2463 ) q;
2464                 rec                 
2465 ------------------------------------
2466  (abc,3,"Thu Jan 02 00:00:00 2003")
2467 (1 row)
2469 -- anonymous record type
2470 SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}');
2471 ERROR:  could not determine row type for result of jsonb_populate_record
2472 HINT:  Provide a non-null record argument, or call the function in the FROM clause using a column definition list.
2473 SELECT jsonb_populate_record(row(1,2), '{"f1": 0, "f2": 1}');
2474  jsonb_populate_record 
2475 -----------------------
2476  (0,1)
2477 (1 row)
2479 SELECT * FROM
2480   jsonb_populate_record(null::record, '{"x": 776}') AS (x int, y int);
2481   x  | y 
2482 -----+---
2483  776 |  
2484 (1 row)
2486 -- composite domain
2487 SELECT jsonb_populate_record(null::jb_ordered_pair, '{"x": 0, "y": 1}');
2488  jsonb_populate_record 
2489 -----------------------
2490  (0,1)
2491 (1 row)
2493 SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 0}');
2494  jsonb_populate_record 
2495 -----------------------
2496  (0,2)
2497 (1 row)
2499 SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 1, "y": 0}');
2500 ERROR:  value for domain jb_ordered_pair violates check constraint "jb_ordered_pair_check"
2501 -- populate_recordset
2502 SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
2503    a    | b |            c             
2504 --------+---+--------------------------
2505  blurfl |   | 
2506         | 3 | Fri Jan 20 10:42:53 2012
2507 (2 rows)
2509 SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
2510    a    | b  |            c             
2511 --------+----+--------------------------
2512  blurfl | 99 | 
2513  def    |  3 | Fri Jan 20 10:42:53 2012
2514 (2 rows)
2516 SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
2517    a    | b |            c             
2518 --------+---+--------------------------
2519  blurfl |   | 
2520         | 3 | Fri Jan 20 10:42:53 2012
2521 (2 rows)
2523 SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
2524    a    | b  |            c             
2525 --------+----+--------------------------
2526  blurfl | 99 | 
2527  def    |  3 | Fri Jan 20 10:42:53 2012
2528 (2 rows)
2530 SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q;
2531         a        | b  |            c             
2532 -----------------+----+--------------------------
2533  [100, 200, 300] | 99 | 
2534  {"z": true}     |  3 | Fri Jan 20 10:42:53 2012
2535 (2 rows)
2537 SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q;
2538 ERROR:  invalid input syntax for type timestamp: "[100, 200, 300]"
2539 SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
2540    a    | b |            c             
2541 --------+---+--------------------------
2542  blurfl |   | 
2543         | 3 | Fri Jan 20 10:42:53 2012
2544 (2 rows)
2546 SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
2547    a    | b  |            c             
2548 --------+----+--------------------------
2549  blurfl | 99 | 
2550  def    |  3 | Fri Jan 20 10:42:53 2012
2551 (2 rows)
2553 SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q;
2554         a        | b  |            c             
2555 -----------------+----+--------------------------
2556  [100, 200, 300] | 99 | 
2557  {"z": true}     |  3 | Fri Jan 20 10:42:53 2012
2558 (2 rows)
2560 -- anonymous record type
2561 SELECT jsonb_populate_recordset(null::record, '[{"x": 0, "y": 1}]');
2562 ERROR:  could not determine row type for result of jsonb_populate_recordset
2563 HINT:  Provide a non-null record argument, or call the function in the FROM clause using a column definition list.
2564 SELECT jsonb_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]');
2565  jsonb_populate_recordset 
2566 --------------------------
2567  (0,1)
2568 (1 row)
2570 SELECT i, jsonb_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]')
2571 FROM (VALUES (1),(2)) v(i);
2572  i | jsonb_populate_recordset 
2573 ---+--------------------------
2574  1 | (42,50)
2575  1 | (1,43)
2576  2 | (42,50)
2577  2 | (2,43)
2578 (4 rows)
2580 SELECT * FROM
2581   jsonb_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int);
2582   x  | y 
2583 -----+---
2584  776 |  
2585 (1 row)
2587 -- empty array is a corner case
2588 SELECT jsonb_populate_recordset(null::record, '[]');
2589 ERROR:  could not determine row type for result of jsonb_populate_recordset
2590 HINT:  Provide a non-null record argument, or call the function in the FROM clause using a column definition list.
2591 SELECT jsonb_populate_recordset(row(1,2), '[]');
2592  jsonb_populate_recordset 
2593 --------------------------
2594 (0 rows)
2596 SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[]') q;
2597  a | b | c 
2598 ---+---+---
2599 (0 rows)
2601 SELECT * FROM
2602   jsonb_populate_recordset(null::record, '[]') AS (x int, y int);
2603  x | y 
2604 ---+---
2605 (0 rows)
2607 -- composite domain
2608 SELECT jsonb_populate_recordset(null::jb_ordered_pair, '[{"x": 0, "y": 1}]');
2609  jsonb_populate_recordset 
2610 --------------------------
2611  (0,1)
2612 (1 row)
2614 SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 0}, {"y": 3}]');
2615  jsonb_populate_recordset 
2616 --------------------------
2617  (0,2)
2618  (1,3)
2619 (2 rows)
2621 SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 1, "y": 0}]');
2622 ERROR:  value for domain jb_ordered_pair violates check constraint "jb_ordered_pair_check"
2623 -- negative cases where the wrong record type is supplied
2624 select * from jsonb_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text);
2625 ERROR:  function return row and query-specified return row do not match
2626 DETAIL:  Returned row contains 1 attribute, but query expects 2.
2627 select * from jsonb_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text);
2628 ERROR:  function return row and query-specified return row do not match
2629 DETAIL:  Returned type integer at ordinal position 1, but query expects text.
2630 select * from jsonb_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text);
2631 ERROR:  function return row and query-specified return row do not match
2632 DETAIL:  Returned row contains 3 attributes, but query expects 2.
2633 select * from jsonb_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text);
2634 ERROR:  function return row and query-specified return row do not match
2635 DETAIL:  Returned type integer at ordinal position 1, but query expects text.
2636 -- jsonb_to_record and jsonb_to_recordset
2637 select * from jsonb_to_record('{"a":1,"b":"foo","c":"bar"}')
2638     as x(a int, b text, d text);
2639  a |  b  | d 
2640 ---+-----+---
2641  1 | foo | 
2642 (1 row)
2644 select * from jsonb_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]')
2645     as x(a int, b text, c boolean);
2646  a |  b  | c 
2647 ---+-----+---
2648  1 | foo | 
2649  2 | bar | t
2650 (2 rows)
2652 select *, c is null as c_is_null
2653 from jsonb_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::jsonb)
2654     as t(a int, b jsonb, c text, x int, ca char(5)[], ia int[][], r jbpop);
2655  a |         b         | c | x |        ca         |      ia       |     r      | c_is_null 
2656 ---+-------------------+---+---+-------------------+---------------+------------+-----------
2657  1 | {"c": 16, "d": 2} |   | 8 | {"1 2  ","3    "} | {{1,2},{3,4}} | (aaa,123,) | t
2658 (1 row)
2660 select *, c is null as c_is_null
2661 from jsonb_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::jsonb)
2662     as t(a int, b jsonb, c text, x int);
2663  a |         b         | c | x | c_is_null 
2664 ---+-------------------+---+---+-----------
2665  1 | {"c": 16, "d": 2} |   | 8 | t
2666 (1 row)
2668 select * from jsonb_to_record('{"ia": null}') as x(ia _int4);
2669  ia 
2670 ----
2672 (1 row)
2674 select * from jsonb_to_record('{"ia": 123}') as x(ia _int4);
2675 ERROR:  expected JSON array
2676 HINT:  See the value of key "ia".
2677 select * from jsonb_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4);
2678       ia      
2679 --------------
2680  {1,2,NULL,4}
2681 (1 row)
2683 select * from jsonb_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4);
2684       ia       
2685 ---------------
2686  {{1,2},{3,4}}
2687 (1 row)
2689 select * from jsonb_to_record('{"ia": [[1], 2]}') as x(ia _int4);
2690 ERROR:  expected JSON array
2691 HINT:  See the array element [1] of key "ia".
2692 select * from jsonb_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4);
2693 ERROR:  malformed JSON array
2694 DETAIL:  Multidimensional arrays must have sub-arrays with matching dimensions.
2695 select * from jsonb_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]);
2696    ia2   
2697 ---------
2698  {1,2,3}
2699 (1 row)
2701 select * from jsonb_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]);
2702       ia2      
2703 ---------------
2704  {{1,2},{3,4}}
2705 (1 row)
2707 select * from jsonb_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]);
2708        ia2       
2709 -----------------
2710  {{{1},{2},{3}}}
2711 (1 row)
2713 select * from jsonb_to_record('{"out": {"key": 1}}') as x(out json);
2714     out     
2715 ------------
2716  {"key": 1}
2717 (1 row)
2719 select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out json);
2720      out      
2721 --------------
2722  [{"key": 1}]
2723 (1 row)
2725 select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out json);
2726       out       
2727 ----------------
2728  "{\"key\": 1}"
2729 (1 row)
2731 select * from jsonb_to_record('{"out": {"key": 1}}') as x(out jsonb);
2732     out     
2733 ------------
2734  {"key": 1}
2735 (1 row)
2737 select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out jsonb);
2738      out      
2739 --------------
2740  [{"key": 1}]
2741 (1 row)
2743 select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb);
2744       out       
2745 ----------------
2746  "{\"key\": 1}"
2747 (1 row)
2749 -- test type info caching in jsonb_populate_record()
2750 CREATE TEMP TABLE jsbpoptest (js jsonb);
2751 INSERT INTO jsbpoptest
2752 SELECT '{
2753         "jsa": [1, "2", null, 4],
2754         "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2},
2755         "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]
2756 }'::jsonb
2757 FROM generate_series(1, 3);
2758 SELECT (jsonb_populate_record(NULL::jsbrec, js)).* FROM jsbpoptest;
2759  i | ia | ia1 | ia2 | ia3 | ia1d | ia2d | t | ta | c | ca | ts | js | jsb |        jsa         |                rec                |                          reca                          
2760 ---+----+-----+-----+-----+------+------+---+----+---+----+----+----+-----+--------------------+-----------------------------------+--------------------------------------------------------
2761    |    |     |     |     |      |      |   |    |   |    |    |    |     | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"}
2762    |    |     |     |     |      |      |   |    |   |    |    |    |     | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"}
2763    |    |     |     |     |      |      |   |    |   |    |    |    |     | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"}
2764 (3 rows)
2766 DROP TYPE jsbrec;
2767 DROP TYPE jsbrec_i_not_null;
2768 DROP DOMAIN jsb_int_not_null;
2769 DROP DOMAIN jsb_int_array_1d;
2770 DROP DOMAIN jsb_int_array_2d;
2771 DROP DOMAIN jb_ordered_pair;
2772 DROP TYPE jb_unordered_pair;
2773 -- indexing
2774 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}';
2775  count 
2776 -------
2777      1
2778 (1 row)
2780 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}';
2781  count 
2782 -------
2783     15
2784 (1 row)
2786 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}';
2787  count 
2788 -------
2789      2
2790 (1 row)
2792 SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}';
2793  count 
2794 -------
2795      2
2796 (1 row)
2798 SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}';
2799  count 
2800 -------
2801      2
2802 (1 row)
2804 SELECT count(*) FROM testjsonb WHERE j ? 'public';
2805  count 
2806 -------
2807    194
2808 (1 row)
2810 SELECT count(*) FROM testjsonb WHERE j ? 'bar';
2811  count 
2812 -------
2813      0
2814 (1 row)
2816 SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled'];
2817  count 
2818 -------
2819    337
2820 (1 row)
2822 SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
2823  count 
2824 -------
2825     42
2826 (1 row)
2828 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
2829  count 
2830 -------
2831      1
2832 (1 row)
2834 SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait';
2835  count 
2836 -------
2837     15
2838 (1 row)
2840 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public';
2841  count 
2842 -------
2843      2
2844 (1 row)
2846 SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25';
2847  count 
2848 -------
2849      2
2850 (1 row)
2852 SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0';
2853  count 
2854 -------
2855      2
2856 (1 row)
2858 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)';
2859  count 
2860 -------
2861   1012
2862 (1 row)
2864 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)';
2865  count 
2866 -------
2867    194
2868 (1 row)
2870 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)';
2871  count 
2872 -------
2873      0
2874 (1 row)
2876 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)';
2877  count 
2878 -------
2879    337
2880 (1 row)
2882 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)';
2883  count 
2884 -------
2885     42
2886 (1 row)
2888 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
2889  count 
2890 -------
2891      1
2892 (1 row)
2894 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)';
2895  count 
2896 -------
2897     15
2898 (1 row)
2900 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)';
2901  count 
2902 -------
2903      2
2904 (1 row)
2906 SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)';
2907  count 
2908 -------
2909      2
2910 (1 row)
2912 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)';
2913  count 
2914 -------
2915      2
2916 (1 row)
2918 SELECT count(*) FROM testjsonb WHERE j @? '$';
2919  count 
2920 -------
2921   1012
2922 (1 row)
2924 SELECT count(*) FROM testjsonb WHERE j @? '$.public';
2925  count 
2926 -------
2927    194
2928 (1 row)
2930 SELECT count(*) FROM testjsonb WHERE j @? '$.bar';
2931  count 
2932 -------
2933      0
2934 (1 row)
2936 CREATE INDEX jidx ON testjsonb USING gin (j);
2937 SET enable_seqscan = off;
2938 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}';
2939  count 
2940 -------
2941      1
2942 (1 row)
2944 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}';
2945  count 
2946 -------
2947     15
2948 (1 row)
2950 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}';
2951  count 
2952 -------
2953      2
2954 (1 row)
2956 SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}';
2957  count 
2958 -------
2959      2
2960 (1 row)
2962 SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}';
2963  count 
2964 -------
2965      2
2966 (1 row)
2968 SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}';
2969  count 
2970 -------
2971      3
2972 (1 row)
2974 SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}';
2975  count 
2976 -------
2977      3
2978 (1 row)
2980 -- exercise GIN_SEARCH_MODE_ALL
2981 SELECT count(*) FROM testjsonb WHERE j @> '{}';
2982  count 
2983 -------
2984   1012
2985 (1 row)
2987 SELECT count(*) FROM testjsonb WHERE j ? 'public';
2988  count 
2989 -------
2990    194
2991 (1 row)
2993 SELECT count(*) FROM testjsonb WHERE j ? 'bar';
2994  count 
2995 -------
2996      0
2997 (1 row)
2999 SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled'];
3000  count 
3001 -------
3002    337
3003 (1 row)
3005 SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
3006  count 
3007 -------
3008     42
3009 (1 row)
3011 EXPLAIN (COSTS OFF)
3012 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
3013                            QUERY PLAN                            
3014 -----------------------------------------------------------------
3015  Aggregate
3016    ->  Bitmap Heap Scan on testjsonb
3017          Recheck Cond: (j @@ '($."wait" == null)'::jsonpath)
3018          ->  Bitmap Index Scan on jidx
3019                Index Cond: (j @@ '($."wait" == null)'::jsonpath)
3020 (5 rows)
3022 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
3023  count 
3024 -------
3025      1
3026 (1 row)
3028 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))';
3029  count 
3030 -------
3031      1
3032 (1 row)
3034 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))';
3035  count 
3036 -------
3037      1
3038 (1 row)
3040 SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait';
3041  count 
3042 -------
3043     15
3044 (1 row)
3046 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public';
3047  count 
3048 -------
3049      2
3050 (1 row)
3052 SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25';
3053  count 
3054 -------
3055      2
3056 (1 row)
3058 SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0';
3059  count 
3060 -------
3061      2
3062 (1 row)
3064 SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"';
3065  count 
3066 -------
3067      3
3068 (1 row)
3070 SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"';
3071  count 
3072 -------
3073      3
3074 (1 row)
3076 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))';
3077  count 
3078 -------
3079      3
3080 (1 row)
3082 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))';
3083  count 
3084 -------
3085      3
3086 (1 row)
3088 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))';
3089  count 
3090 -------
3091      3
3092 (1 row)
3094 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)';
3095  count 
3096 -------
3097   1012
3098 (1 row)
3100 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)';
3101  count 
3102 -------
3103    194
3104 (1 row)
3106 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)';
3107  count 
3108 -------
3109      0
3110 (1 row)
3112 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)';
3113  count 
3114 -------
3115    337
3116 (1 row)
3118 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)';
3119  count 
3120 -------
3121     42
3122 (1 row)
3124 EXPLAIN (COSTS OFF)
3125 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
3126                             QUERY PLAN                             
3127 -------------------------------------------------------------------
3128  Aggregate
3129    ->  Bitmap Heap Scan on testjsonb
3130          Recheck Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
3131          ->  Bitmap Index Scan on jidx
3132                Index Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
3133 (5 rows)
3135 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
3136  count 
3137 -------
3138      1
3139 (1 row)
3141 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)';
3142  count 
3143 -------
3144     15
3145 (1 row)
3147 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)';
3148  count 
3149 -------
3150      2
3151 (1 row)
3153 SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)';
3154  count 
3155 -------
3156      2
3157 (1 row)
3159 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)';
3160  count 
3161 -------
3162      2
3163 (1 row)
3165 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")';
3166  count 
3167 -------
3168      3
3169 (1 row)
3171 SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")';
3172  count 
3173 -------
3174      3
3175 (1 row)
3177 SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")';
3178  count 
3179 -------
3180      3
3181 (1 row)
3183 SELECT count(*) FROM testjsonb WHERE j @? '$';
3184  count 
3185 -------
3186   1012
3187 (1 row)
3189 SELECT count(*) FROM testjsonb WHERE j @? '$.public';
3190  count 
3191 -------
3192    194
3193 (1 row)
3195 SELECT count(*) FROM testjsonb WHERE j @? '$.bar';
3196  count 
3197 -------
3198      0
3199 (1 row)
3201 -- array exists - array elements should behave as keys (for GIN index scans too)
3202 CREATE INDEX jidx_array ON testjsonb USING gin((j->'array'));
3203 SELECT count(*) from testjsonb  WHERE j->'array' ? 'bar';
3204  count 
3205 -------
3206      3
3207 (1 row)
3209 -- type sensitive array exists - should return no rows (since "exists" only
3210 -- matches strings that are either object keys or array elements)
3211 SELECT count(*) from testjsonb  WHERE j->'array' ? '5'::text;
3212  count 
3213 -------
3214      0
3215 (1 row)
3217 -- However, a raw scalar is *contained* within the array
3218 SELECT count(*) from testjsonb  WHERE j->'array' @> '5'::jsonb;
3219  count 
3220 -------
3221      1
3222 (1 row)
3224 RESET enable_seqscan;
3225 SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow;
3226  count 
3227 -------
3228   4791
3229 (1 row)
3231 SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key;
3232     key    | count 
3233 -----------+-------
3234  line      |   884
3235  query     |   207
3236  pos       |   203
3237  node      |   202
3238  space     |   197
3239  status    |   195
3240  public    |   194
3241  title     |   190
3242  wait      |   190
3243  org       |   189
3244  user      |   189
3245  coauthors |   188
3246  disabled  |   185
3247  indexed   |   184
3248  cleaned   |   180
3249  bad       |   179
3250  date      |   179
3251  world     |   176
3252  state     |   172
3253  subtitle  |   169
3254  auth      |   168
3255  abstract  |   161
3256  array     |     5
3257  age       |     2
3258  foo       |     2
3259  fool      |     1
3260 (26 rows)
3262 -- sort/hash
3263 SELECT count(distinct j) FROM testjsonb;
3264  count 
3265 -------
3266    894
3267 (1 row)
3269 SET enable_hashagg = off;
3270 SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2;
3271  count 
3272 -------
3273    894
3274 (1 row)
3276 SET enable_hashagg = on;
3277 SET enable_sort = off;
3278 SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2;
3279  count 
3280 -------
3281    894
3282 (1 row)
3284 SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j);
3285  j  
3286 ----
3287  {}
3288 (1 row)
3290 SET enable_sort = on;
3291 RESET enable_hashagg;
3292 RESET enable_sort;
3293 DROP INDEX jidx;
3294 DROP INDEX jidx_array;
3295 -- btree
3296 CREATE INDEX jidx ON testjsonb USING btree (j);
3297 SET enable_seqscan = off;
3298 SELECT count(*) FROM testjsonb WHERE j > '{"p":1}';
3299  count 
3300 -------
3301    884
3302 (1 row)
3304 SELECT count(*) FROM testjsonb WHERE j = '{"pos":98, "line":371, "node":"CBA", "indexed":true}';
3305  count 
3306 -------
3307      1
3308 (1 row)
3310 --gin path opclass
3311 DROP INDEX jidx;
3312 CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops);
3313 SET enable_seqscan = off;
3314 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}';
3315  count 
3316 -------
3317      1
3318 (1 row)
3320 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}';
3321  count 
3322 -------
3323     15
3324 (1 row)
3326 SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}';
3327  count 
3328 -------
3329      2
3330 (1 row)
3332 SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}';
3333  count 
3334 -------
3335      2
3336 (1 row)
3338 SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}';
3339  count 
3340 -------
3341      2
3342 (1 row)
3344 -- exercise GIN_SEARCH_MODE_ALL
3345 SELECT count(*) FROM testjsonb WHERE j @> '{}';
3346  count 
3347 -------
3348   1012
3349 (1 row)
3351 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
3352  count 
3353 -------
3354      1
3355 (1 row)
3357 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))';
3358  count 
3359 -------
3360      1
3361 (1 row)
3363 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))';
3364  count 
3365 -------
3366      1
3367 (1 row)
3369 SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait';
3370  count 
3371 -------
3372     15
3373 (1 row)
3375 SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public';
3376  count 
3377 -------
3378      2
3379 (1 row)
3381 SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25';
3382  count 
3383 -------
3384      2
3385 (1 row)
3387 SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0';
3388  count 
3389 -------
3390      2
3391 (1 row)
3393 SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"';
3394  count 
3395 -------
3396      3
3397 (1 row)
3399 SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"';
3400  count 
3401 -------
3402      3
3403 (1 row)
3405 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))';
3406  count 
3407 -------
3408      3
3409 (1 row)
3411 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))';
3412  count 
3413 -------
3414      3
3415 (1 row)
3417 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))';
3418  count 
3419 -------
3420      3
3421 (1 row)
3423 SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)';
3424  count 
3425 -------
3426   1012
3427 (1 row)
3429 EXPLAIN (COSTS OFF)
3430 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
3431                             QUERY PLAN                             
3432 -------------------------------------------------------------------
3433  Aggregate
3434    ->  Bitmap Heap Scan on testjsonb
3435          Recheck Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
3436          ->  Bitmap Index Scan on jidx
3437                Index Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
3438 (5 rows)
3440 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
3441  count 
3442 -------
3443      1
3444 (1 row)
3446 SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)';
3447  count 
3448 -------
3449     15
3450 (1 row)
3452 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)';
3453  count 
3454 -------
3455      2
3456 (1 row)
3458 SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)';
3459  count 
3460 -------
3461      2
3462 (1 row)
3464 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)';
3465  count 
3466 -------
3467      2
3468 (1 row)
3470 SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")';
3471  count 
3472 -------
3473      3
3474 (1 row)
3476 SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")';
3477  count 
3478 -------
3479      3
3480 (1 row)
3482 SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")';
3483  count 
3484 -------
3485      3
3486 (1 row)
3488 SELECT count(*) FROM testjsonb WHERE j @? '$';
3489  count 
3490 -------
3491   1012
3492 (1 row)
3494 SELECT count(*) FROM testjsonb WHERE j @? '$.public';
3495  count 
3496 -------
3497    194
3498 (1 row)
3500 SELECT count(*) FROM testjsonb WHERE j @? '$.bar';
3501  count 
3502 -------
3503      0
3504 (1 row)
3506 RESET enable_seqscan;
3507 DROP INDEX jidx;
3508 -- nested tests
3509 SELECT '{"ff":{"a":12,"b":16}}'::jsonb;
3510            jsonb            
3511 ----------------------------
3512  {"ff": {"a": 12, "b": 16}}
3513 (1 row)
3515 SELECT '{"ff":{"a":12,"b":16},"qq":123}'::jsonb;
3516                  jsonb                 
3517 ---------------------------------------
3518  {"ff": {"a": 12, "b": 16}, "qq": 123}
3519 (1 row)
3521 SELECT '{"aa":["a","aaa"],"qq":{"a":12,"b":16,"c":["c1","c2"],"d":{"d1":"d1","d2":"d2","d1":"d3"}}}'::jsonb;
3522                                               jsonb                                               
3523 --------------------------------------------------------------------------------------------------
3524  {"aa": ["a", "aaa"], "qq": {"a": 12, "b": 16, "c": ["c1", "c2"], "d": {"d1": "d3", "d2": "d2"}}}
3525 (1 row)
3527 SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2"],"d":{"d1":"d1","d2":"d2"}}}'::jsonb;
3528                                                 jsonb                                                 
3529 ------------------------------------------------------------------------------------------------------
3530  {"aa": ["a", "aaa"], "qq": {"a": "12", "b": "16", "c": ["c1", "c2"], "d": {"d1": "d1", "d2": "d2"}}}
3531 (1 row)
3533 SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2",["c3"],{"c4":4}],"d":{"d1":"d1","d2":"d2"}}}'::jsonb;
3534                                                           jsonb                                                          
3535 -------------------------------------------------------------------------------------------------------------------------
3536  {"aa": ["a", "aaa"], "qq": {"a": "12", "b": "16", "c": ["c1", "c2", ["c3"], {"c4": 4}], "d": {"d1": "d1", "d2": "d2"}}}
3537 (1 row)
3539 SELECT '{"ff":["a","aaa"]}'::jsonb;
3540         jsonb         
3541 ----------------------
3542  {"ff": ["a", "aaa"]}
3543 (1 row)
3545 SELECT
3546   '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'ff',
3547   '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'qq',
3548   ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'Y') IS NULL AS f,
3549   ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb ->> 'Y') IS NULL AS t,
3550    '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'x';
3551       ?column?      | ?column? | f | t | ?column? 
3552 --------------------+----------+---+---+----------
3553  {"a": 12, "b": 16} | 123      | f | t | [1, 2]
3554 (1 row)
3556 -- nested containment
3557 SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1,2]}';
3558  ?column? 
3559 ----------
3561 (1 row)
3563 SELECT '{"a":[2,1],"c":"b"}'::jsonb @> '{"a":[1,2]}';
3564  ?column? 
3565 ----------
3567 (1 row)
3569 SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":[1,2]}';
3570  ?column? 
3571 ----------
3573 (1 row)
3575 SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":[1,2]}';
3576  ?column? 
3577 ----------
3579 (1 row)
3581 SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":{"1":2}}';
3582  ?column? 
3583 ----------
3585 (1 row)
3587 SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":{"1":2}}';
3588  ?column? 
3589 ----------
3591 (1 row)
3593 SELECT '["a","b"]'::jsonb @> '["a","b","c","b"]';
3594  ?column? 
3595 ----------
3597 (1 row)
3599 SELECT '["a","b","c","b"]'::jsonb @> '["a","b"]';
3600  ?column? 
3601 ----------
3603 (1 row)
3605 SELECT '["a","b","c",[1,2]]'::jsonb @> '["a",[1,2]]';
3606  ?column? 
3607 ----------
3609 (1 row)
3611 SELECT '["a","b","c",[1,2]]'::jsonb @> '["b",[1,2]]';
3612  ?column? 
3613 ----------
3615 (1 row)
3617 SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1]}';
3618  ?column? 
3619 ----------
3621 (1 row)
3623 SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[2]}';
3624  ?column? 
3625 ----------
3627 (1 row)
3629 SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[3]}';
3630  ?column? 
3631 ----------
3633 (1 row)
3635 SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"c":3}]}';
3636  ?column? 
3637 ----------
3639 (1 row)
3641 SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4}]}';
3642  ?column? 
3643 ----------
3645 (1 row)
3647 SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},3]}';
3648  ?column? 
3649 ----------
3651 (1 row)
3653 SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},1]}';
3654  ?column? 
3655 ----------
3657 (1 row)
3659 -- check some corner cases for indexed nested containment (bug #13756)
3660 create temp table nestjsonb (j jsonb);
3661 insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}');
3662 insert into nestjsonb (j) values ('[[14,2,3]]');
3663 insert into nestjsonb (j) values ('[1,[14,2,3]]');
3664 create index on nestjsonb using gin(j jsonb_path_ops);
3665 set enable_seqscan = on;
3666 set enable_bitmapscan = off;
3667 select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb;
3668                          j                         
3669 ---------------------------------------------------
3670  {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3}
3671 (1 row)
3673 select * from nestjsonb where j @> '{"c":3}';
3674                          j                         
3675 ---------------------------------------------------
3676  {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3}
3677 (1 row)
3679 select * from nestjsonb where j @> '[[14]]';
3680         j        
3681 -----------------
3682  [[14, 2, 3]]
3683  [1, [14, 2, 3]]
3684 (2 rows)
3686 set enable_seqscan = off;
3687 set enable_bitmapscan = on;
3688 select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb;
3689                          j                         
3690 ---------------------------------------------------
3691  {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3}
3692 (1 row)
3694 select * from nestjsonb where j @> '{"c":3}';
3695                          j                         
3696 ---------------------------------------------------
3697  {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3}
3698 (1 row)
3700 select * from nestjsonb where j @> '[[14]]';
3701         j        
3702 -----------------
3703  [[14, 2, 3]]
3704  [1, [14, 2, 3]]
3705 (2 rows)
3707 reset enable_seqscan;
3708 reset enable_bitmapscan;
3709 -- nested object field / array index lookup
3710 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'n';
3711  ?column? 
3712 ----------
3713  null
3714 (1 row)
3716 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'a';
3717  ?column? 
3718 ----------
3720 (1 row)
3722 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'b';
3723  ?column? 
3724 ----------
3725  [1, 2]
3726 (1 row)
3728 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'c';
3729  ?column? 
3730 ----------
3731  {"1": 2}
3732 (1 row)
3734 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd';
3735    ?column?    
3736 ---------------
3737  {"1": [2, 3]}
3738 (1 row)
3740 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd' -> '1';
3741  ?column? 
3742 ----------
3743  [2, 3]
3744 (1 row)
3746 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'e';
3747  ?column? 
3748 ----------
3750 (1 row)
3752 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 0; --expecting error
3753  ?column? 
3754 ----------
3756 (1 row)
3758 SELECT '["a","b","c",[1,2],null]'::jsonb -> 0;
3759  ?column? 
3760 ----------
3761  "a"
3762 (1 row)
3764 SELECT '["a","b","c",[1,2],null]'::jsonb -> 1;
3765  ?column? 
3766 ----------
3767  "b"
3768 (1 row)
3770 SELECT '["a","b","c",[1,2],null]'::jsonb -> 2;
3771  ?column? 
3772 ----------
3773  "c"
3774 (1 row)
3776 SELECT '["a","b","c",[1,2],null]'::jsonb -> 3;
3777  ?column? 
3778 ----------
3779  [1, 2]
3780 (1 row)
3782 SELECT '["a","b","c",[1,2],null]'::jsonb -> 3 -> 1;
3783  ?column? 
3784 ----------
3786 (1 row)
3788 SELECT '["a","b","c",[1,2],null]'::jsonb -> 4;
3789  ?column? 
3790 ----------
3791  null
3792 (1 row)
3794 SELECT '["a","b","c",[1,2],null]'::jsonb -> 5;
3795  ?column? 
3796 ----------
3798 (1 row)
3800 SELECT '["a","b","c",[1,2],null]'::jsonb -> -1;
3801  ?column? 
3802 ----------
3803  null
3804 (1 row)
3806 SELECT '["a","b","c",[1,2],null]'::jsonb -> -5;
3807  ?column? 
3808 ----------
3809  "a"
3810 (1 row)
3812 SELECT '["a","b","c",[1,2],null]'::jsonb -> -6;
3813  ?column? 
3814 ----------
3816 (1 row)
3818 --nested path extraction
3819 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{0}';
3820  ?column? 
3821 ----------
3823 (1 row)
3825 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}';
3826  ?column? 
3827 ----------
3828  "b"
3829 (1 row)
3831 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}';
3832  ?column?  
3833 -----------
3834  [1, 2, 3]
3835 (1 row)
3837 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}';
3838  ?column? 
3839 ----------
3841 (1 row)
3843 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}';
3844  ?column? 
3845 ----------
3847 (1 row)
3849 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}';
3850  ?column? 
3851 ----------
3853 (1 row)
3855 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}';
3856  ?column? 
3857 ----------
3859 (1 row)
3861 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}';
3862  ?column? 
3863 ----------
3865 (1 row)
3867 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}';
3868  ?column? 
3869 ----------
3871 (1 row)
3873 SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}';
3874  ?column? 
3875 ----------
3877 (1 row)
3879 SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}';
3880  ?column? 
3881 ----------
3883 (1 row)
3885 SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}';
3886  ?column? 
3887 ----------
3888  [3, 4]
3889 (1 row)
3891 SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}';
3892    ?column?    
3893 ---------------
3894  {"5": "five"}
3895 (1 row)
3897 SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}';
3898  ?column? 
3899 ----------
3900  "five"
3901 (1 row)
3903 --nested exists
3904 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'n';
3905  ?column? 
3906 ----------
3908 (1 row)
3910 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'a';
3911  ?column? 
3912 ----------
3914 (1 row)
3916 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'b';
3917  ?column? 
3918 ----------
3920 (1 row)
3922 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'c';
3923  ?column? 
3924 ----------
3926 (1 row)
3928 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'd';
3929  ?column? 
3930 ----------
3932 (1 row)
3934 SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'e';
3935  ?column? 
3936 ----------
3938 (1 row)
3940 -- jsonb_strip_nulls
3941 select jsonb_strip_nulls(null);
3942  jsonb_strip_nulls 
3943 -------------------
3945 (1 row)
3947 select jsonb_strip_nulls('1');
3948  jsonb_strip_nulls 
3949 -------------------
3951 (1 row)
3953 select jsonb_strip_nulls('"a string"');
3954  jsonb_strip_nulls 
3955 -------------------
3956  "a string"
3957 (1 row)
3959 select jsonb_strip_nulls('null');
3960  jsonb_strip_nulls 
3961 -------------------
3962  null
3963 (1 row)
3965 select jsonb_strip_nulls('[1,2,null,3,4]');
3966  jsonb_strip_nulls  
3967 --------------------
3968  [1, 2, null, 3, 4]
3969 (1 row)
3971 select jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}');
3972              jsonb_strip_nulls              
3973 --------------------------------------------
3974  {"a": 1, "c": [2, null, 3], "d": {"e": 4}}
3975 (1 row)
3977 select jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]');
3978     jsonb_strip_nulls     
3979 --------------------------
3980  [1, {"a": 1, "c": 2}, 3]
3981 (1 row)
3983 -- an empty object is not null and should not be stripped
3984 select jsonb_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }');
3985  jsonb_strip_nulls  
3986 --------------------
3987  {"a": {}, "d": {}}
3988 (1 row)
3990 select jsonb_pretty('{"a": "test", "b": [1, 2, 3], "c": "test3", "d":{"dd": "test4", "dd2":{"ddd": "test5"}}}');
3991         jsonb_pretty        
3992 ----------------------------
3993  {                         +
3994      "a": "test",          +
3995      "b": [                +
3996          1,                +
3997          2,                +
3998          3                 +
3999      ],                    +
4000      "c": "test3",         +
4001      "d": {                +
4002          "dd": "test4",    +
4003          "dd2": {          +
4004              "ddd": "test5"+
4005          }                 +
4006      }                     +
4008 (1 row)
4010 select jsonb_pretty('[{"f1":1,"f2":null},2,null,[[{"x":true},6,7],8],3]');
4011        jsonb_pretty        
4012 ---------------------------
4013  [                        +
4014      {                    +
4015          "f1": 1,         +
4016          "f2": null       +
4017      },                   +
4018      2,                   +
4019      null,                +
4020      [                    +
4021          [                +
4022              {            +
4023                  "x": true+
4024              },           +
4025              6,           +
4026              7            +
4027          ],               +
4028          8                +
4029      ],                   +
4030      3                    +
4032 (1 row)
4034 select jsonb_pretty('{"a":["b", "c"], "d": {"e":"f"}}');
4035    jsonb_pretty   
4036 ------------------
4037  {               +
4038      "a": [      +
4039          "b",    +
4040          "c"     +
4041      ],          +
4042      "d": {      +
4043          "e": "f"+
4044      }           +
4046 (1 row)
4048 select jsonb_concat('{"d": "test", "a": [1, 2]}', '{"g": "test2", "c": {"c1":1, "c2":2}}');
4049                            jsonb_concat                            
4050 -------------------------------------------------------------------
4051  {"a": [1, 2], "c": {"c1": 1, "c2": 2}, "d": "test", "g": "test2"}
4052 (1 row)
4054 select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"cq":"l", "b":"g", "fg":false}';
4055                   ?column?                   
4056 ---------------------------------------------
4057  {"b": "g", "aa": 1, "cq": "l", "fg": false}
4058 (1 row)
4060 select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aq":"l"}';
4061                ?column?                
4062 ---------------------------------------
4063  {"b": 2, "aa": 1, "aq": "l", "cq": 3}
4064 (1 row)
4066 select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aa":"l"}';
4067            ?column?           
4068 ------------------------------
4069  {"b": 2, "aa": "l", "cq": 3}
4070 (1 row)
4072 select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{}';
4073           ?column?          
4074 ----------------------------
4075  {"b": 2, "aa": 1, "cq": 3}
4076 (1 row)
4078 select '["a", "b"]'::jsonb || '["c"]';
4079     ?column?     
4080 -----------------
4081  ["a", "b", "c"]
4082 (1 row)
4084 select '["a", "b"]'::jsonb || '["c", "d"]';
4085        ?column?       
4086 ----------------------
4087  ["a", "b", "c", "d"]
4088 (1 row)
4090 select '["c"]' || '["a", "b"]'::jsonb;
4091     ?column?     
4092 -----------------
4093  ["c", "a", "b"]
4094 (1 row)
4096 select '["a", "b"]'::jsonb || '"c"';
4097     ?column?     
4098 -----------------
4099  ["a", "b", "c"]
4100 (1 row)
4102 select '"c"' || '["a", "b"]'::jsonb;
4103     ?column?     
4104 -----------------
4105  ["c", "a", "b"]
4106 (1 row)
4108 select '[]'::jsonb || '["a"]'::jsonb;
4109  ?column? 
4110 ----------
4111  ["a"]
4112 (1 row)
4114 select '[]'::jsonb || '"a"'::jsonb;
4115  ?column? 
4116 ----------
4117  ["a"]
4118 (1 row)
4120 select '"b"'::jsonb || '"a"'::jsonb;
4121   ?column?  
4122 ------------
4123  ["b", "a"]
4124 (1 row)
4126 select '{}'::jsonb || '{"a":"b"}'::jsonb;
4127   ?column?  
4128 ------------
4129  {"a": "b"}
4130 (1 row)
4132 select '[]'::jsonb || '{"a":"b"}'::jsonb;
4133    ?column?   
4134 --------------
4135  [{"a": "b"}]
4136 (1 row)
4138 select '{"a":"b"}'::jsonb || '[]'::jsonb;
4139    ?column?   
4140 --------------
4141  [{"a": "b"}]
4142 (1 row)
4144 select '"a"'::jsonb || '{"a":1}';
4145     ?column?     
4146 -----------------
4147  ["a", {"a": 1}]
4148 (1 row)
4150 select '{"a":1}' || '"a"'::jsonb;
4151     ?column?     
4152 -----------------
4153  [{"a": 1}, "a"]
4154 (1 row)
4156 select '[3]'::jsonb || '{}'::jsonb;
4157  ?column? 
4158 ----------
4159  [3, {}]
4160 (1 row)
4162 select '3'::jsonb || '[]'::jsonb;
4163  ?column? 
4164 ----------
4165  [3]
4166 (1 row)
4168 select '3'::jsonb || '4'::jsonb;
4169  ?column? 
4170 ----------
4171  [3, 4]
4172 (1 row)
4174 select '3'::jsonb || '{}'::jsonb;
4175  ?column? 
4176 ----------
4177  [3, {}]
4178 (1 row)
4180 select '["a", "b"]'::jsonb || '{"c":1}';
4181        ?column?       
4182 ----------------------
4183  ["a", "b", {"c": 1}]
4184 (1 row)
4186 select '{"c": 1}'::jsonb || '["a", "b"]';
4187        ?column?       
4188 ----------------------
4189  [{"c": 1}, "a", "b"]
4190 (1 row)
4192 select '{}'::jsonb || '{"cq":"l", "b":"g", "fg":false}';
4193               ?column?              
4194 ------------------------------------
4195  {"b": "g", "cq": "l", "fg": false}
4196 (1 row)
4198 select pg_column_size('{}'::jsonb || '{}'::jsonb) = pg_column_size('{}'::jsonb);
4199  ?column? 
4200 ----------
4202 (1 row)
4204 select pg_column_size('{"aa":1}'::jsonb || '{"b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb);
4205  ?column? 
4206 ----------
4208 (1 row)
4210 select pg_column_size('{"aa":1, "b":2}'::jsonb || '{}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb);
4211  ?column? 
4212 ----------
4214 (1 row)
4216 select pg_column_size('{}'::jsonb || '{"aa":1, "b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb);
4217  ?column? 
4218 ----------
4220 (1 row)
4222 select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'a');
4223    jsonb_delete   
4224 ------------------
4225  {"b": 2, "c": 3}
4226 (1 row)
4228 select jsonb_delete('{"a":null , "b":2, "c":3}'::jsonb, 'a');
4229    jsonb_delete   
4230 ------------------
4231  {"b": 2, "c": 3}
4232 (1 row)
4234 select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'b');
4235    jsonb_delete   
4236 ------------------
4237  {"a": 1, "c": 3}
4238 (1 row)
4240 select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'c');
4241    jsonb_delete   
4242 ------------------
4243  {"a": 1, "b": 2}
4244 (1 row)
4246 select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'd');
4247        jsonb_delete       
4248 --------------------------
4249  {"a": 1, "b": 2, "c": 3}
4250 (1 row)
4252 select '{"a":1 , "b":2, "c":3}'::jsonb - 'a';
4253      ?column?     
4254 ------------------
4255  {"b": 2, "c": 3}
4256 (1 row)
4258 select '{"a":null , "b":2, "c":3}'::jsonb - 'a';
4259      ?column?     
4260 ------------------
4261  {"b": 2, "c": 3}
4262 (1 row)
4264 select '{"a":1 , "b":2, "c":3}'::jsonb - 'b';
4265      ?column?     
4266 ------------------
4267  {"a": 1, "c": 3}
4268 (1 row)
4270 select '{"a":1 , "b":2, "c":3}'::jsonb - 'c';
4271      ?column?     
4272 ------------------
4273  {"a": 1, "b": 2}
4274 (1 row)
4276 select '{"a":1 , "b":2, "c":3}'::jsonb - 'd';
4277          ?column?         
4278 --------------------------
4279  {"a": 1, "b": 2, "c": 3}
4280 (1 row)
4282 select pg_column_size('{"a":1 , "b":2, "c":3}'::jsonb - 'b') = pg_column_size('{"a":1, "b":2}'::jsonb);
4283  ?column? 
4284 ----------
4286 (1 row)
4288 select '["a","b","c"]'::jsonb - 3;
4289     ?column?     
4290 -----------------
4291  ["a", "b", "c"]
4292 (1 row)
4294 select '["a","b","c"]'::jsonb - 2;
4295   ?column?  
4296 ------------
4297  ["a", "b"]
4298 (1 row)
4300 select '["a","b","c"]'::jsonb - 1;
4301   ?column?  
4302 ------------
4303  ["a", "c"]
4304 (1 row)
4306 select '["a","b","c"]'::jsonb - 0;
4307   ?column?  
4308 ------------
4309  ["b", "c"]
4310 (1 row)
4312 select '["a","b","c"]'::jsonb - -1;
4313   ?column?  
4314 ------------
4315  ["a", "b"]
4316 (1 row)
4318 select '["a","b","c"]'::jsonb - -2;
4319   ?column?  
4320 ------------
4321  ["a", "c"]
4322 (1 row)
4324 select '["a","b","c"]'::jsonb - -3;
4325   ?column?  
4326 ------------
4327  ["b", "c"]
4328 (1 row)
4330 select '["a","b","c"]'::jsonb - -4;
4331     ?column?     
4332 -----------------
4333  ["a", "b", "c"]
4334 (1 row)
4336 select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[];
4337      ?column?     
4338 ------------------
4339  {"a": 1, "c": 3}
4340 (1 row)
4342 select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[];
4343  ?column? 
4344 ----------
4345  {"a": 1}
4346 (1 row)
4348 select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[];
4349          ?column?         
4350 --------------------------
4351  {"a": 1, "b": 2, "c": 3}
4352 (1 row)
4354 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]');
4355                                 jsonb_set                                 
4356 --------------------------------------------------------------------------
4357  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": [1, 2, 3]}
4358 (1 row)
4360 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]');
4361                                   jsonb_set                                  
4362 -----------------------------------------------------------------------------
4363  {"a": 1, "b": [1, [1, 2, 3]], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null}
4364 (1 row)
4366 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]');
4367                                   jsonb_set                                  
4368 -----------------------------------------------------------------------------
4369  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [[1, 2, 3], 3]}, "n": null}
4370 (1 row)
4372 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]');
4373 ERROR:  path element at position 2 is null
4374 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}');
4375                                 jsonb_set                                
4376 -------------------------------------------------------------------------
4377  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": {"1": 2}}
4378 (1 row)
4380 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}');
4381                                  jsonb_set                                  
4382 ----------------------------------------------------------------------------
4383  {"a": 1, "b": [1, {"1": 2}], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null}
4384 (1 row)
4386 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}');
4387                                  jsonb_set                                  
4388 ----------------------------------------------------------------------------
4389  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [{"1": 2}, 3]}, "n": null}
4390 (1 row)
4392 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}');
4393 ERROR:  path element at position 2 is null
4394 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"');
4395                                 jsonb_set                                 
4396 --------------------------------------------------------------------------
4397  {"a": 1, "b": [1, "test"], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null}
4398 (1 row)
4400 select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}');
4401                                     jsonb_set                                    
4402 ---------------------------------------------------------------------------------
4403  {"a": 1, "b": [1, {"f": "test"}], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null}
4404 (1 row)
4406 select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{n}');
4407                     jsonb_delete_path                     
4408 ----------------------------------------------------------
4409  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}}
4410 (1 row)
4412 select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{b,-1}');
4413                         jsonb_delete_path                         
4414 ------------------------------------------------------------------
4415  {"a": 1, "b": [1], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null}
4416 (1 row)
4418 select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{d,1,0}');
4419                         jsonb_delete_path                         
4420 ------------------------------------------------------------------
4421  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [3]}, "n": null}
4422 (1 row)
4424 select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{n}';
4425                          ?column?                         
4426 ----------------------------------------------------------
4427  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}}
4428 (1 row)
4430 select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1}';
4431                              ?column?                             
4432 ------------------------------------------------------------------
4433  {"a": 1, "b": [1], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null}
4434 (1 row)
4436 select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript
4437 ERROR:  path element at position 2 is not an integer: "-1e"
4438 select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}';
4439                              ?column?                             
4440 ------------------------------------------------------------------
4441  {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [3]}, "n": null}
4442 (1 row)
4444 -- empty structure and error conditions for delete and replace
4445 select '"a"'::jsonb - 'a'; -- error
4446 ERROR:  cannot delete from scalar
4447 select '{}'::jsonb - 'a';
4448  ?column? 
4449 ----------
4450  {}
4451 (1 row)
4453 select '[]'::jsonb - 'a';
4454  ?column? 
4455 ----------
4456  []
4457 (1 row)
4459 select '"a"'::jsonb - 1; -- error
4460 ERROR:  cannot delete from scalar
4461 select '{}'::jsonb -  1; -- error
4462 ERROR:  cannot delete from object using integer index
4463 select '[]'::jsonb - 1;
4464  ?column? 
4465 ----------
4466  []
4467 (1 row)
4469 select '"a"'::jsonb #- '{a}'; -- error
4470 ERROR:  cannot delete path in scalar
4471 select '{}'::jsonb #- '{a}';
4472  ?column? 
4473 ----------
4474  {}
4475 (1 row)
4477 select '[]'::jsonb #- '{a}';
4478  ?column? 
4479 ----------
4480  []
4481 (1 row)
4483 select jsonb_set('"a"','{a}','"b"'); --error
4484 ERROR:  cannot set path in scalar
4485 select jsonb_set('{}','{a}','"b"', false);
4486  jsonb_set 
4487 -----------
4488  {}
4489 (1 row)
4491 select jsonb_set('[]','{1}','"b"', false);
4492  jsonb_set 
4493 -----------
4494  []
4495 (1 row)
4497 select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0}','[2,3,4]', false);
4498         jsonb_set        
4499 -------------------------
4500  [[2, 3, 4], 2, null, 3]
4501 (1 row)
4503 -- jsonb_set adding instead of replacing
4504 -- prepend to array
4505 select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,-33}','{"foo":123}');
4506                        jsonb_set                       
4507 -------------------------------------------------------
4508  {"a": 1, "b": [{"foo": 123}, 0, 1, 2], "c": {"d": 4}}
4509 (1 row)
4511 -- append to array
4512 select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,33}','{"foo":123}');
4513                        jsonb_set                       
4514 -------------------------------------------------------
4515  {"a": 1, "b": [0, 1, 2, {"foo": 123}], "c": {"d": 4}}
4516 (1 row)
4518 -- check nesting levels addition
4519 select jsonb_set('{"a":1,"b":[4,5,[0,1,2],6,7],"c":{"d":4}}','{b,2,33}','{"foo":123}');
4520                               jsonb_set                              
4521 ---------------------------------------------------------------------
4522  {"a": 1, "b": [4, 5, [0, 1, 2, {"foo": 123}], 6, 7], "c": {"d": 4}}
4523 (1 row)
4525 -- add new key
4526 select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{c,e}','{"foo":123}');
4527                          jsonb_set                          
4528 ------------------------------------------------------------
4529  {"a": 1, "b": [0, 1, 2], "c": {"d": 4, "e": {"foo": 123}}}
4530 (1 row)
4532 -- adding doesn't do anything if elements before last aren't present
4533 select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,-33}','{"foo":123}');
4534                 jsonb_set                
4535 -----------------------------------------
4536  {"a": 1, "b": [0, 1, 2], "c": {"d": 4}}
4537 (1 row)
4539 select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}');
4540                 jsonb_set                
4541 -----------------------------------------
4542  {"a": 1, "b": [0, 1, 2], "c": {"d": 4}}
4543 (1 row)
4545 -- add to empty object
4546 select jsonb_set('{}','{x}','{"foo":123}');
4547       jsonb_set      
4548 ---------------------
4549  {"x": {"foo": 123}}
4550 (1 row)
4552 --add to empty array
4553 select jsonb_set('[]','{0}','{"foo":123}');
4554    jsonb_set    
4555 ----------------
4556  [{"foo": 123}]
4557 (1 row)
4559 select jsonb_set('[]','{99}','{"foo":123}');
4560    jsonb_set    
4561 ----------------
4562  [{"foo": 123}]
4563 (1 row)
4565 select jsonb_set('[]','{-99}','{"foo":123}');
4566    jsonb_set    
4567 ----------------
4568  [{"foo": 123}]
4569 (1 row)
4571 select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"');
4572 ERROR:  path element at position 2 is not an integer: "non_integer"
4573 select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"');
4574 ERROR:  path element at position 3 is not an integer: "non_integer"
4575 select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"');
4576 ERROR:  path element at position 3 is null
4577 -- jsonb_set_lax
4578 \pset null NULL
4579 -- pass though non nulls to jsonb_set
4580 select jsonb_set_lax('{"a":1,"b":2}','{b}','5') ;
4581   jsonb_set_lax   
4582 ------------------
4583  {"a": 1, "b": 5}
4584 (1 row)
4586 select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ;
4587       jsonb_set_lax       
4588 --------------------------
4589  {"a": 1, "b": 2, "d": 6}
4590 (1 row)
4592 -- using the default treatment
4593 select jsonb_set_lax('{"a":1,"b":2}','{b}',null);
4594     jsonb_set_lax    
4595 ---------------------
4596  {"a": 1, "b": null}
4597 (1 row)
4599 select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true);
4600         jsonb_set_lax        
4601 -----------------------------
4602  {"a": 1, "b": 2, "d": null}
4603 (1 row)
4605 -- errors
4606 select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, null);
4607 ERROR:  null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception"
4608 select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment');
4609 ERROR:  null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception"
4610 -- explicit treatments
4611 select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'raise_exception') as raise_exception;
4612 ERROR:  JSON value must not be null
4613 DETAIL:  Exception was raised because null_value_treatment is "raise_exception".
4614 HINT:  To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed.
4615 select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'return_target') as return_target;
4616   return_target   
4617 ------------------
4618  {"a": 1, "b": 2}
4619 (1 row)
4621 select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'delete_key') as delete_key;
4622  delete_key 
4623 ------------
4624  {"a": 1}
4625 (1 row)
4627 select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_json_null') as use_json_null;
4628     use_json_null    
4629 ---------------------
4630  {"a": 1, "b": null}
4631 (1 row)
4633 \pset null ''
4634 -- jsonb_insert
4635 select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"');
4636          jsonb_insert          
4637 -------------------------------
4638  {"a": [0, "new_value", 1, 2]}
4639 (1 row)
4641 select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true);
4642          jsonb_insert          
4643 -------------------------------
4644  {"a": [0, 1, "new_value", 2]}
4645 (1 row)
4647 select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"');
4648                         jsonb_insert                        
4649 ------------------------------------------------------------
4650  {"a": {"b": {"c": [0, 1, "new_value", "test1", "test2"]}}}
4651 (1 row)
4653 select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"', true);
4654                         jsonb_insert                        
4655 ------------------------------------------------------------
4656  {"a": {"b": {"c": [0, 1, "test1", "new_value", "test2"]}}}
4657 (1 row)
4659 select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}');
4660            jsonb_insert           
4661 ----------------------------------
4662  {"a": [0, {"b": "value"}, 1, 2]}
4663 (1 row)
4665 select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]');
4666               jsonb_insert              
4667 ----------------------------------------
4668  {"a": [0, ["value1", "value2"], 1, 2]}
4669 (1 row)
4671 -- edge cases
4672 select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"');
4673          jsonb_insert          
4674 -------------------------------
4675  {"a": ["new_value", 0, 1, 2]}
4676 (1 row)
4678 select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"', true);
4679          jsonb_insert          
4680 -------------------------------
4681  {"a": [0, "new_value", 1, 2]}
4682 (1 row)
4684 select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"');
4685          jsonb_insert          
4686 -------------------------------
4687  {"a": [0, 1, "new_value", 2]}
4688 (1 row)
4690 select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"', true);
4691          jsonb_insert          
4692 -------------------------------
4693  {"a": [0, 1, 2, "new_value"]}
4694 (1 row)
4696 select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"');
4697          jsonb_insert          
4698 -------------------------------
4699  {"a": [0, 1, "new_value", 2]}
4700 (1 row)
4702 select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"', true);
4703          jsonb_insert          
4704 -------------------------------
4705  {"a": [0, 1, 2, "new_value"]}
4706 (1 row)
4708 select jsonb_insert('[]', '{1}', '"new_value"');
4709  jsonb_insert  
4710 ---------------
4711  ["new_value"]
4712 (1 row)
4714 select jsonb_insert('[]', '{1}', '"new_value"', true);
4715  jsonb_insert  
4716 ---------------
4717  ["new_value"]
4718 (1 row)
4720 select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"');
4721      jsonb_insert     
4722 ----------------------
4723  {"a": ["new_value"]}
4724 (1 row)
4726 select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"', true);
4727      jsonb_insert     
4728 ----------------------
4729  {"a": ["new_value"]}
4730 (1 row)
4732 select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"');
4733          jsonb_insert          
4734 -------------------------------
4735  {"a": [0, 1, 2, "new_value"]}
4736 (1 row)
4738 select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"');
4739          jsonb_insert          
4740 -------------------------------
4741  {"a": ["new_value", 0, 1, 2]}
4742 (1 row)
4744 -- jsonb_insert should be able to insert new value for objects, but not to replace
4745 select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"');
4746               jsonb_insert               
4747 -----------------------------------------
4748  {"a": {"b": "value", "c": "new_value"}}
4749 (1 row)
4751 select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"', true);
4752               jsonb_insert               
4753 -----------------------------------------
4754  {"a": {"b": "value", "c": "new_value"}}
4755 (1 row)
4757 select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"');
4758 ERROR:  cannot replace existing key
4759 HINT:  Try using the function jsonb_set to replace key value.
4760 select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true);
4761 ERROR:  cannot replace existing key
4762 HINT:  Try using the function jsonb_set to replace key value.
4763 -- jsonb subscript
4764 select ('123'::jsonb)['a'];
4765  jsonb 
4766 -------
4768 (1 row)
4770 select ('123'::jsonb)[0];
4771  jsonb 
4772 -------
4774 (1 row)
4776 select ('123'::jsonb)[NULL];
4777  jsonb 
4778 -------
4780 (1 row)
4782 select ('{"a": 1}'::jsonb)['a'];
4783  jsonb 
4784 -------
4786 (1 row)
4788 select ('{"a": 1}'::jsonb)[0];
4789  jsonb 
4790 -------
4792 (1 row)
4794 select ('{"a": 1}'::jsonb)['not_exist'];
4795  jsonb 
4796 -------
4798 (1 row)
4800 select ('{"a": 1}'::jsonb)[NULL];
4801  jsonb 
4802 -------
4804 (1 row)
4806 select ('[1, "2", null]'::jsonb)['a'];
4807  jsonb 
4808 -------
4810 (1 row)
4812 select ('[1, "2", null]'::jsonb)[0];
4813  jsonb 
4814 -------
4816 (1 row)
4818 select ('[1, "2", null]'::jsonb)['1'];
4819  jsonb 
4820 -------
4821  "2"
4822 (1 row)
4824 select ('[1, "2", null]'::jsonb)[1.0];
4825 ERROR:  subscript type is not supported
4826 LINE 1: select ('[1, "2", null]'::jsonb)[1.0];
4827                                          ^
4828 HINT:  Jsonb subscript must be coerced to either integer or text
4829 select ('[1, "2", null]'::jsonb)[2];
4830  jsonb 
4831 -------
4832  null
4833 (1 row)
4835 select ('[1, "2", null]'::jsonb)[3];
4836  jsonb 
4837 -------
4839 (1 row)
4841 select ('[1, "2", null]'::jsonb)[-2];
4842  jsonb 
4843 -------
4844  "2"
4845 (1 row)
4847 select ('[1, "2", null]'::jsonb)[1]['a'];
4848  jsonb 
4849 -------
4851 (1 row)
4853 select ('[1, "2", null]'::jsonb)[1][0];
4854  jsonb 
4855 -------
4857 (1 row)
4859 select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['b'];
4860  jsonb 
4861 -------
4862  "c"
4863 (1 row)
4865 select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d'];
4866    jsonb   
4867 -----------
4868  [1, 2, 3]
4869 (1 row)
4871 select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d'][1];
4872  jsonb 
4873 -------
4875 (1 row)
4877 select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']['a'];
4878  jsonb 
4879 -------
4881 (1 row)
4883 select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1'];
4884      jsonb     
4885 ---------------
4886  {"a2": "aaa"}
4887 (1 row)
4889 select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2'];
4890  jsonb 
4891 -------
4892  "aaa"
4893 (1 row)
4895 select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']['a3'];
4896  jsonb 
4897 -------
4899 (1 row)
4901 select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1'];
4902          jsonb         
4903 -----------------------
4904  ["aaa", "bbb", "ccc"]
4905 (1 row)
4907 select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1'][2];
4908  jsonb 
4909 -------
4910  "ccc"
4911 (1 row)
4913 -- slices are not supported
4914 select ('{"a": 1}'::jsonb)['a':'b'];
4915 ERROR:  jsonb subscript does not support slices
4916 LINE 1: select ('{"a": 1}'::jsonb)['a':'b'];
4917                                        ^
4918 select ('[1, "2", null]'::jsonb)[1:2];
4919 ERROR:  jsonb subscript does not support slices
4920 LINE 1: select ('[1, "2", null]'::jsonb)[1:2];
4921                                            ^
4922 select ('[1, "2", null]'::jsonb)[:2];
4923 ERROR:  jsonb subscript does not support slices
4924 LINE 1: select ('[1, "2", null]'::jsonb)[:2];
4925                                           ^
4926 select ('[1, "2", null]'::jsonb)[1:];
4927 ERROR:  jsonb subscript does not support slices
4928 LINE 1: select ('[1, "2", null]'::jsonb)[1:];
4929                                          ^
4930 select ('[1, "2", null]'::jsonb)[:];
4931 ERROR:  jsonb subscript does not support slices
4932 create TEMP TABLE test_jsonb_subscript (
4933        id int,
4934        test_json jsonb
4936 insert into test_jsonb_subscript values
4937 (1, '{}'), -- empty jsonb
4938 (2, '{"key": "value"}'); -- jsonb with data
4939 -- update empty jsonb
4940 update test_jsonb_subscript set test_json['a'] = '1' where id = 1;
4941 select * from test_jsonb_subscript;
4942  id |    test_json     
4943 ----+------------------
4944   2 | {"key": "value"}
4945   1 | {"a": 1}
4946 (2 rows)
4948 -- update jsonb with some data
4949 update test_jsonb_subscript set test_json['a'] = '1' where id = 2;
4950 select * from test_jsonb_subscript;
4951  id |        test_json         
4952 ----+--------------------------
4953   1 | {"a": 1}
4954   2 | {"a": 1, "key": "value"}
4955 (2 rows)
4957 -- replace jsonb
4958 update test_jsonb_subscript set test_json['a'] = '"test"';
4959 select * from test_jsonb_subscript;
4960  id |           test_json           
4961 ----+-------------------------------
4962   1 | {"a": "test"}
4963   2 | {"a": "test", "key": "value"}
4964 (2 rows)
4966 -- replace by object
4967 update test_jsonb_subscript set test_json['a'] = '{"b": 1}'::jsonb;
4968 select * from test_jsonb_subscript;
4969  id |            test_json            
4970 ----+---------------------------------
4971   1 | {"a": {"b": 1}}
4972   2 | {"a": {"b": 1}, "key": "value"}
4973 (2 rows)
4975 -- replace by array
4976 update test_jsonb_subscript set test_json['a'] = '[1, 2, 3]'::jsonb;
4977 select * from test_jsonb_subscript;
4978  id |            test_json             
4979 ----+----------------------------------
4980   1 | {"a": [1, 2, 3]}
4981   2 | {"a": [1, 2, 3], "key": "value"}
4982 (2 rows)
4984 -- use jsonb subscription in where clause
4985 select * from test_jsonb_subscript where test_json['key'] = '"value"';
4986  id |            test_json             
4987 ----+----------------------------------
4988   2 | {"a": [1, 2, 3], "key": "value"}
4989 (1 row)
4991 select * from test_jsonb_subscript where test_json['key_doesnt_exists'] = '"value"';
4992  id | test_json 
4993 ----+-----------
4994 (0 rows)
4996 select * from test_jsonb_subscript where test_json['key'] = '"wrong_value"';
4997  id | test_json 
4998 ----+-----------
4999 (0 rows)
5001 -- NULL
5002 update test_jsonb_subscript set test_json[NULL] = '1';
5003 ERROR:  jsonb subscript in assignment must not be null
5004 update test_jsonb_subscript set test_json['another_key'] = NULL;
5005 select * from test_jsonb_subscript;
5006  id |                       test_json                       
5007 ----+-------------------------------------------------------
5008   1 | {"a": [1, 2, 3], "another_key": null}
5009   2 | {"a": [1, 2, 3], "key": "value", "another_key": null}
5010 (2 rows)
5012 -- NULL as jsonb source
5013 insert into test_jsonb_subscript values (3, NULL);
5014 update test_jsonb_subscript set test_json['a'] = '1' where id = 3;
5015 select * from test_jsonb_subscript;
5016  id |                       test_json                       
5017 ----+-------------------------------------------------------
5018   1 | {"a": [1, 2, 3], "another_key": null}
5019   2 | {"a": [1, 2, 3], "key": "value", "another_key": null}
5020   3 | {"a": 1}
5021 (3 rows)
5023 update test_jsonb_subscript set test_json = NULL where id = 3;
5024 update test_jsonb_subscript set test_json[0] = '1';
5025 select * from test_jsonb_subscript;
5026  id |                           test_json                           
5027 ----+---------------------------------------------------------------
5028   1 | {"0": 1, "a": [1, 2, 3], "another_key": null}
5029   2 | {"0": 1, "a": [1, 2, 3], "key": "value", "another_key": null}
5030   3 | [1]
5031 (3 rows)
5033 -- Fill the gaps logic
5034 delete from test_jsonb_subscript;
5035 insert into test_jsonb_subscript values (1, '[0]');
5036 update test_jsonb_subscript set test_json[5] = '1';
5037 select * from test_jsonb_subscript;
5038  id |           test_json            
5039 ----+--------------------------------
5040   1 | [0, null, null, null, null, 1]
5041 (1 row)
5043 update test_jsonb_subscript set test_json[-4] = '1';
5044 select * from test_jsonb_subscript;
5045  id |          test_json          
5046 ----+-----------------------------
5047   1 | [0, null, 1, null, null, 1]
5048 (1 row)
5050 update test_jsonb_subscript set test_json[-8] = '1';
5051 ERROR:  path element at position 1 is out of range: -8
5052 select * from test_jsonb_subscript;
5053  id |          test_json          
5054 ----+-----------------------------
5055   1 | [0, null, 1, null, null, 1]
5056 (1 row)
5058 -- keep consistent values position
5059 delete from test_jsonb_subscript;
5060 insert into test_jsonb_subscript values (1, '[]');
5061 update test_jsonb_subscript set test_json[5] = '1';
5062 select * from test_jsonb_subscript;
5063  id |             test_json             
5064 ----+-----------------------------------
5065   1 | [null, null, null, null, null, 1]
5066 (1 row)
5068 -- create the whole path
5069 delete from test_jsonb_subscript;
5070 insert into test_jsonb_subscript values (1, '{}');
5071 update test_jsonb_subscript set test_json['a'][0]['b'][0]['c'] = '1';
5072 select * from test_jsonb_subscript;
5073  id |         test_json          
5074 ----+----------------------------
5075   1 | {"a": [{"b": [{"c": 1}]}]}
5076 (1 row)
5078 delete from test_jsonb_subscript;
5079 insert into test_jsonb_subscript values (1, '{}');
5080 update test_jsonb_subscript set test_json['a'][2]['b'][2]['c'][2] = '1';
5081 select * from test_jsonb_subscript;
5082  id |                            test_json                             
5083 ----+------------------------------------------------------------------
5084   1 | {"a": [null, null, {"b": [null, null, {"c": [null, null, 1]}]}]}
5085 (1 row)
5087 -- create the whole path with already existing keys
5088 delete from test_jsonb_subscript;
5089 insert into test_jsonb_subscript values (1, '{"b": 1}');
5090 update test_jsonb_subscript set test_json['a'][0] = '2';
5091 select * from test_jsonb_subscript;
5092  id |     test_json      
5093 ----+--------------------
5094   1 | {"a": [2], "b": 1}
5095 (1 row)
5097 -- the start jsonb is an object, first subscript is treated as a key
5098 delete from test_jsonb_subscript;
5099 insert into test_jsonb_subscript values (1, '{}');
5100 update test_jsonb_subscript set test_json[0]['a'] = '1';
5101 select * from test_jsonb_subscript;
5102  id |    test_json    
5103 ----+-----------------
5104   1 | {"0": {"a": 1}}
5105 (1 row)
5107 -- the start jsonb is an array
5108 delete from test_jsonb_subscript;
5109 insert into test_jsonb_subscript values (1, '[]');
5110 update test_jsonb_subscript set test_json[0]['a'] = '1';
5111 update test_jsonb_subscript set test_json[2]['b'] = '2';
5112 select * from test_jsonb_subscript;
5113  id |         test_json          
5114 ----+----------------------------
5115   1 | [{"a": 1}, null, {"b": 2}]
5116 (1 row)
5118 -- overwriting an existing path
5119 delete from test_jsonb_subscript;
5120 insert into test_jsonb_subscript values (1, '{}');
5121 update test_jsonb_subscript set test_json['a']['b'][1] = '1';
5122 update test_jsonb_subscript set test_json['a']['b'][10] = '1';
5123 select * from test_jsonb_subscript;
5124  id |                                 test_json                                  
5125 ----+----------------------------------------------------------------------------
5126   1 | {"a": {"b": [null, 1, null, null, null, null, null, null, null, null, 1]}}
5127 (1 row)
5129 delete from test_jsonb_subscript;
5130 insert into test_jsonb_subscript values (1, '[]');
5131 update test_jsonb_subscript set test_json[0][0][0] = '1';
5132 update test_jsonb_subscript set test_json[0][0][1] = '1';
5133 select * from test_jsonb_subscript;
5134  id | test_json  
5135 ----+------------
5136   1 | [[[1, 1]]]
5137 (1 row)
5139 delete from test_jsonb_subscript;
5140 insert into test_jsonb_subscript values (1, '{}');
5141 update test_jsonb_subscript set test_json['a']['b'][10] = '1';
5142 update test_jsonb_subscript set test_json['a'][10][10] = '1';
5143 select * from test_jsonb_subscript;
5144  id |                                                                      test_json                                                                       
5145 ----+------------------------------------------------------------------------------------------------------------------------------------------------------
5146   1 | {"a": {"b": [null, null, null, null, null, null, null, null, null, null, 1], "10": [null, null, null, null, null, null, null, null, null, null, 1]}}
5147 (1 row)
5149 -- an empty sub element
5150 delete from test_jsonb_subscript;
5151 insert into test_jsonb_subscript values (1, '{"a": {}}');
5152 update test_jsonb_subscript set test_json['a']['b']['c'][2] = '1';
5153 select * from test_jsonb_subscript;
5154  id |              test_json               
5155 ----+--------------------------------------
5156   1 | {"a": {"b": {"c": [null, null, 1]}}}
5157 (1 row)
5159 delete from test_jsonb_subscript;
5160 insert into test_jsonb_subscript values (1, '{"a": []}');
5161 update test_jsonb_subscript set test_json['a'][1]['c'][2] = '1';
5162 select * from test_jsonb_subscript;
5163  id |               test_json               
5164 ----+---------------------------------------
5165   1 | {"a": [null, {"c": [null, null, 1]}]}
5166 (1 row)
5168 -- trying replace assuming a composite object, but it's an element or a value
5169 delete from test_jsonb_subscript;
5170 insert into test_jsonb_subscript values (1, '{"a": 1}');
5171 update test_jsonb_subscript set test_json['a']['b'] = '1';
5172 ERROR:  cannot replace existing key
5173 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5174 update test_jsonb_subscript set test_json['a']['b']['c'] = '1';
5175 ERROR:  cannot replace existing key
5176 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5177 update test_jsonb_subscript set test_json['a'][0] = '1';
5178 ERROR:  cannot replace existing key
5179 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5180 update test_jsonb_subscript set test_json['a'][0]['c'] = '1';
5181 ERROR:  cannot replace existing key
5182 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5183 update test_jsonb_subscript set test_json['a'][0][0] = '1';
5184 ERROR:  cannot replace existing key
5185 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5186 -- trying replace assuming a composite object, but it's a raw scalar
5187 delete from test_jsonb_subscript;
5188 insert into test_jsonb_subscript values (1, 'null');
5189 update test_jsonb_subscript set test_json[0] = '1';
5190 ERROR:  cannot replace existing key
5191 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5192 update test_jsonb_subscript set test_json[0][0] = '1';
5193 ERROR:  cannot replace existing key
5194 DETAIL:  The path assumes key is a composite object, but it is a scalar value.
5195 -- jsonb to tsvector
5196 select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb);
5197                                 to_tsvector                                
5198 ---------------------------------------------------------------------------
5199  'aaa':1 'bbb':2 'ccc':4 'ddd':3 'eee':6 'fff':7 'ggg':8 'hhh':10 'iii':11
5200 (1 row)
5202 -- jsonb to tsvector with config
5203 select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb);
5204                                 to_tsvector                                
5205 ---------------------------------------------------------------------------
5206  'aaa':1 'bbb':2 'ccc':4 'ddd':3 'eee':6 'fff':7 'ggg':8 'hhh':10 'iii':11
5207 (1 row)
5209 -- jsonb to tsvector with stop words
5210 select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::jsonb);
5211                                 to_tsvector                                 
5212 ----------------------------------------------------------------------------
5213  'aaa':1 'bbb':3 'ccc':5 'ddd':4 'eee':8 'fff':9 'ggg':10 'hhh':12 'iii':13
5214 (1 row)
5216 -- jsonb to tsvector with numeric values
5217 select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::jsonb);
5218            to_tsvector           
5219 ---------------------------------
5220  'aaa':1 'bbb':3 'ccc':5 'ddd':4
5221 (1 row)
5223 -- jsonb_to_tsvector
5224 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"');
5225                                    jsonb_to_tsvector                                    
5226 ----------------------------------------------------------------------------------------
5227  '123':8 '456':12 'aaa':2 'b':6 'bbb':4 'c':10 'd':14 'f':18 'fals':20 'g':22 'true':16
5228 (1 row)
5230 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"');
5231        jsonb_to_tsvector        
5232 --------------------------------
5233  'b':2 'c':4 'd':6 'f':8 'g':10
5234 (1 row)
5236 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"');
5237  jsonb_to_tsvector 
5238 -------------------
5239  'aaa':1 'bbb':3
5240 (1 row)
5242 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"');
5243  jsonb_to_tsvector 
5244 -------------------
5245  '123':1 '456':3
5246 (1 row)
5248 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"');
5249  jsonb_to_tsvector 
5250 -------------------
5251  'fals':3 'true':1
5252 (1 row)
5254 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]');
5255         jsonb_to_tsvector        
5256 ---------------------------------
5257  '123':5 '456':7 'aaa':1 'bbb':3
5258 (1 row)
5260 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"');
5261                                    jsonb_to_tsvector                                    
5262 ----------------------------------------------------------------------------------------
5263  '123':8 '456':12 'aaa':2 'b':6 'bbb':4 'c':10 'd':14 'f':18 'fals':20 'g':22 'true':16
5264 (1 row)
5266 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"');
5267        jsonb_to_tsvector        
5268 --------------------------------
5269  'b':2 'c':4 'd':6 'f':8 'g':10
5270 (1 row)
5272 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"');
5273  jsonb_to_tsvector 
5274 -------------------
5275  'aaa':1 'bbb':3
5276 (1 row)
5278 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"');
5279  jsonb_to_tsvector 
5280 -------------------
5281  '123':1 '456':3
5282 (1 row)
5284 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"');
5285  jsonb_to_tsvector 
5286 -------------------
5287  'fals':3 'true':1
5288 (1 row)
5290 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]');
5291         jsonb_to_tsvector        
5292 ---------------------------------
5293  '123':5 '456':7 'aaa':1 'bbb':3
5294 (1 row)
5296 -- to_tsvector corner cases
5297 select to_tsvector('""'::jsonb);
5298  to_tsvector 
5299 -------------
5301 (1 row)
5303 select to_tsvector('{}'::jsonb);
5304  to_tsvector 
5305 -------------
5307 (1 row)
5309 select to_tsvector('[]'::jsonb);
5310  to_tsvector 
5311 -------------
5313 (1 row)
5315 select to_tsvector('null'::jsonb);
5316  to_tsvector 
5317 -------------
5319 (1 row)
5321 -- jsonb_to_tsvector corner cases
5322 select jsonb_to_tsvector('""'::jsonb, '"all"');
5323  jsonb_to_tsvector 
5324 -------------------
5326 (1 row)
5328 select jsonb_to_tsvector('{}'::jsonb, '"all"');
5329  jsonb_to_tsvector 
5330 -------------------
5332 (1 row)
5334 select jsonb_to_tsvector('[]'::jsonb, '"all"');
5335  jsonb_to_tsvector 
5336 -------------------
5338 (1 row)
5340 select jsonb_to_tsvector('null'::jsonb, '"all"');
5341  jsonb_to_tsvector 
5342 -------------------
5344 (1 row)
5346 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '""');
5347 ERROR:  wrong flag in flag array: ""
5348 HINT:  Possible values are: "string", "numeric", "boolean", "key", and "all".
5349 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '{}');
5350 ERROR:  wrong flag type, only arrays and scalars are allowed
5351 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '[]');
5352  jsonb_to_tsvector 
5353 -------------------
5355 (1 row)
5357 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, 'null');
5358 ERROR:  flag array element is not a string
5359 HINT:  Possible values are: "string", "numeric", "boolean", "key", and "all".
5360 select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["all", null]');
5361 ERROR:  flag array element is not a string
5362 HINT:  Possible values are: "string", "numeric", "boolean", "key", and "all".
5363 -- ts_headline for jsonb
5364 select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'));
5365                                                    ts_headline                                                    
5366 ------------------------------------------------------------------------------------------------------------------
5367  {"a": "aaa <b>bbb</b>", "b": {"c": "ccc <b>ddd</b> fff", "c1": "ccc1 ddd1"}, "d": ["ggg <b>hhh</b>", "iii jjj"]}
5368 (1 row)
5370 select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'));
5371                                           ts_headline                                          
5372 -----------------------------------------------------------------------------------------------
5373  {"a": "aaa <b>bbb</b>", "b": {"c": "ccc <b>ddd</b> fff"}, "d": ["ggg <b>hhh</b>", "iii jjj"]}
5374 (1 row)
5376 select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >');
5377                                             ts_headline                                            
5378 ---------------------------------------------------------------------------------------------------
5379  {"a": "aaa <bbb>", "b": {"c": "ccc <ddd> fff", "c1": "ccc1 ddd1"}, "d": ["ggg <hhh>", "iii jjj"]}
5380 (1 row)
5382 select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >');
5383                                             ts_headline                                            
5384 ---------------------------------------------------------------------------------------------------
5385  {"a": "aaa <bbb>", "b": {"c": "ccc <ddd> fff", "c1": "ccc1 ddd1"}, "d": ["ggg <hhh>", "iii jjj"]}
5386 (1 row)
5388 -- corner cases for ts_headline with jsonb
5389 select ts_headline('null'::jsonb, tsquery('aaa & bbb'));
5390  ts_headline 
5391 -------------
5392  null
5393 (1 row)
5395 select ts_headline('{}'::jsonb, tsquery('aaa & bbb'));
5396  ts_headline 
5397 -------------
5398  {}
5399 (1 row)
5401 select ts_headline('[]'::jsonb, tsquery('aaa & bbb'));
5402  ts_headline 
5403 -------------
5404  []
5405 (1 row)
5407 -- casts
5408 select 'true'::jsonb::bool;
5409  bool 
5410 ------
5412 (1 row)
5414 select '[]'::jsonb::bool;
5415 ERROR:  cannot cast jsonb array to type boolean
5416 select '1.0'::jsonb::float;
5417  float8 
5418 --------
5419       1
5420 (1 row)
5422 select '[1.0]'::jsonb::float;
5423 ERROR:  cannot cast jsonb array to type double precision
5424 select '12345'::jsonb::int4;
5425  int4  
5426 -------
5427  12345
5428 (1 row)
5430 select '"hello"'::jsonb::int4;
5431 ERROR:  cannot cast jsonb string to type integer
5432 select '12345'::jsonb::numeric;
5433  numeric 
5434 ---------
5435    12345
5436 (1 row)
5438 select '{}'::jsonb::numeric;
5439 ERROR:  cannot cast jsonb object to type numeric
5440 select '12345.05'::jsonb::numeric;
5441  numeric  
5442 ----------
5443  12345.05
5444 (1 row)
5446 select '12345.05'::jsonb::float4;
5447   float4  
5448 ----------
5449  12345.05
5450 (1 row)
5452 select '12345.05'::jsonb::float8;
5453   float8  
5454 ----------
5455  12345.05
5456 (1 row)
5458 select '12345.05'::jsonb::int2;
5459  int2  
5460 -------
5461  12345
5462 (1 row)
5464 select '12345.05'::jsonb::int4;
5465  int4  
5466 -------
5467  12345
5468 (1 row)
5470 select '12345.05'::jsonb::int8;
5471  int8  
5472 -------
5473  12345
5474 (1 row)
5476 select '12345.0000000000000000000000000000000000000000000005'::jsonb::numeric;
5477                        numeric                        
5478 ------------------------------------------------------
5479  12345.0000000000000000000000000000000000000000000005
5480 (1 row)
5482 select '12345.0000000000000000000000000000000000000000000005'::jsonb::float4;
5483  float4 
5484 --------
5485   12345
5486 (1 row)
5488 select '12345.0000000000000000000000000000000000000000000005'::jsonb::float8;
5489  float8 
5490 --------
5491   12345
5492 (1 row)
5494 select '12345.0000000000000000000000000000000000000000000005'::jsonb::int2;
5495  int2  
5496 -------
5497  12345
5498 (1 row)
5500 select '12345.0000000000000000000000000000000000000000000005'::jsonb::int4;
5501  int4  
5502 -------
5503  12345
5504 (1 row)
5506 select '12345.0000000000000000000000000000000000000000000005'::jsonb::int8;
5507  int8  
5508 -------
5509  12345
5510 (1 row)