Fix a problem causing the recovery extension to use excessive memory and CPU time...
[sqlite.git] / test / json102.test
blob15a54b47c4bba3cbdd1a2035c29ab216873cb49e
1 # 2015-08-12
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
6 #    May you do good and not evil.
7 #    May you find forgiveness for yourself and forgive others.
8 #    May you share freely, never taking more than you give.
10 #***********************************************************************
11 # This file implements tests for JSON SQL functions extension to the
12 # SQLite library.
14 # This file contains tests automatically generated from the json1
15 # documentation.
18 set testdir [file dirname $argv0]
19 source $testdir/tester.tcl
21 do_execsql_test json102-100 {
22   SELECT json_object('ex','[52,3.14159]');
23 } {{{"ex":"[52,3.14159]"}}}
24 do_execsql_test json102-100b {
25   SELECT json(jsonb_object('ex','[52,3.14159]'));
26 } {{{"ex":"[52,3.14159]"}}}
27 do_execsql_test json102-110 {
28   SELECT json_object('ex',json('[52,3.14159]'));
29 } {{{"ex":[52,3.14159]}}}
30 do_execsql_test json102-110-2 {
31   SELECT json(jsonb_object('ex',json('[52,3.14159]')));
32 } {{{"ex":[52,3.14159]}}}
33 do_execsql_test json102-110-3 {
34   SELECT json_object('ex',jsonb('[52,3.14159]'));
35 } {{{"ex":[52,3.14159]}}}
36 do_execsql_test json102-110-3 {
37   SELECT json(jsonb_object('ex',jsonb('[52,3.14159]')));
38 } {{{"ex":[52,3.14159]}}}
39 do_execsql_test json102-120 {
40   SELECT json_object('ex',json_array(52,3.14159));
41 } {{{"ex":[52,3.14159]}}}
42 do_execsql_test json102-120-2 {
43   SELECT json(jsonb_object('ex',json_array(52,3.14159)));
44 } {{{"ex":[52,3.14159]}}}
45 do_execsql_test json102-120-3 {
46   SELECT json_object('ex',jsonb_array(52,3.14159));
47 } {{{"ex":[52,3.14159]}}}
48 do_execsql_test json102-120-4 {
49   SELECT json(jsonb_object('ex',jsonb_array(52,3.14159)));
50 } {{{"ex":[52,3.14159]}}}
51 do_execsql_test json102-130 {
52   SELECT json(' { "this" : "is", "a": [ "test" ] } ');
53 } {{{"this":"is","a":["test"]}}}
54 do_execsql_test json102-130b {
55   SELECT json(jsonb(' { "this" : "is", "a": [ "test" ] } '));
56 } {{{"this":"is","a":["test"]}}}
57 do_execsql_test json102-140 {
58   SELECT json_array(1,2,'3',4);
59 } {{[1,2,"3",4]}}
60 do_execsql_test json102-140b {
61   SELECT json(jsonb_array(1,2,'3',4));
62 } {{[1,2,"3",4]}}
63 do_execsql_test json102-150 {
64   SELECT json_array('[1,2]');
65 } {{["[1,2]"]}}
66 do_execsql_test json102-150b {
67   SELECT json(jsonb_array('[1,2]'));
68 } {{["[1,2]"]}}
69 do_execsql_test json102-160 {
70   SELECT json_array(json_array(1,2));
71 } {{[[1,2]]}}
72 do_execsql_test json102-160-2 {
73   SELECT json_array(jsonb_array(1,2));
74 } {{[[1,2]]}}
75 do_execsql_test json102-160-3 {
76   SELECT json(jsonb_array(json_array(1,2)));
77 } {{[[1,2]]}}
78 do_execsql_test json102-160-4 {
79   SELECT json(jsonb_array(jsonb_array(1,2)));
80 } {{[[1,2]]}}
81 do_execsql_test json102-170 {
82   SELECT json_array(1,null,'3','[4,5]','{"six":7.7}');
83 } {{[1,null,"3","[4,5]","{\"six\":7.7}"]}}
84 do_execsql_test json102-170b {
85   SELECT json(jsonb_array(1,null,'3','[4,5]','{"six":7.7}'));
86 } {{[1,null,"3","[4,5]","{\"six\":7.7}"]}}
87 do_execsql_test json102-180 {
88   SELECT json_array(1,null,'3',json('[4,5]'),json('{"six":7.7}'));
89 } {{[1,null,"3",[4,5],{"six":7.7}]}}
90 do_execsql_test json102-180-2 {
91   SELECT json_array(1,null,'3',jsonb('[4,5]'),json('{"six":7.7}'));
92 } {{[1,null,"3",[4,5],{"six":7.7}]}}
93 do_execsql_test json102-180-3 {
94   SELECT json(jsonb_array(1,null,'3',json('[4,5]'),json('{"six":7.7}')));
95 } {{[1,null,"3",[4,5],{"six":7.7}]}}
96 do_execsql_test json102-180-4 {
97   SELECT json(jsonb_array(1,null,'3',jsonb('[4,5]'),jsonb('{"six":7.7}')));
98 } {{[1,null,"3",[4,5],{"six":7.7}]}}
99 do_execsql_test json102-190 {
100   SELECT json_array_length('[1,2,3,4]');
101 } {{4}}
102 do_execsql_test json102-190b {
103   SELECT json_array_length(jsonb('[1,2,3,4]'));
104 } {{4}}
105 do_execsql_test json102-191 {
106   SELECT json_array_length( json_remove('[1,2,3,4]','$[2]') );
107 } {{3}}
108 do_execsql_test json102-191b {
109   SELECT json_array_length( jsonb_remove('[1,2,3,4]','$[2]') );
110 } {{3}}
111 do_execsql_test json102-200 {
112   SELECT json_array_length('[1,2,3,4]', '$');
113 } {{4}}
114 do_execsql_test json102-200b {
115   SELECT json_array_length(jsonb('[1,2,3,4]'), '$');
116 } {{4}}
117 do_execsql_test json102-210 {
118   SELECT json_array_length('[1,2,3,4]', '$[2]');
119 } {{0}}
120 do_execsql_test json102-210b {
121   SELECT json_array_length(jsonb('[1,2,3,4]'), '$[2]');
122 } {{0}}
123 do_execsql_test json102-220 {
124   SELECT json_array_length('{"one":[1,2,3]}');
125 } {{0}}
126 do_execsql_test json102-220 {
127   SELECT json_array_length('{"one":[1,2,3]}');
128 } {{0}}
129 do_execsql_test json102-230b {
130   SELECT json_array_length(jsonb('{"one":[1,2,3]}'), '$.one');
131 } {{3}}
132 do_execsql_test json102-240 {
133   SELECT json_array_length('{"one":[1,2,3]}', '$.two');
134 } {{}}
135 do_execsql_test json102-240b {
136   SELECT json_array_length(jsonb('{"one":[1,2,3]}'), '$.two');
137 } {{}}
138 do_execsql_test json102-250 {
139   SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$');
140 } {{{"a":2,"c":[4,5,{"f":7}]}}}
141 do_execsql_test json102-250-2 {
142   SELECT json_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$');
143 } {{{"a":2,"c":[4,5,{"f":7}]}}}
144 do_execsql_test json102-250-3 {
145   SELECT json(jsonb_extract('{"a":2,"c":[4,5,{"f":7}]}', '$'));
146 } {{{"a":2,"c":[4,5,{"f":7}]}}}
147 do_execsql_test json102-250-4 {
148   SELECT json(jsonb_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$'));
149 } {{{"a":2,"c":[4,5,{"f":7}]}}}
150 do_execsql_test json102-260 {
151   SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c');
152 } {{[4,5,{"f":7}]}}
153 do_execsql_test json102-260-2 {
154   SELECT json_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$.c');
155 } {{[4,5,{"f":7}]}}
156 do_execsql_test json102-260-3 {
157   SELECT json(jsonb_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c'));
158 } {{[4,5,{"f":7}]}}
159 do_execsql_test json102-260-4 {
160   SELECT json(jsonb_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$.c'));
161 } {{[4,5,{"f":7}]}}
162 do_execsql_test json102-270 {
163   SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]');
164 } {{{"f":7}}}
165 do_execsql_test json102-270-2 {
166   SELECT json_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$.c[2]');
167 } {{{"f":7}}}
168 do_execsql_test json102-270-3 {
169   SELECT json(jsonb_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$.c[2]'));
170 } {{{"f":7}}}
171 do_execsql_test json102-270-4 {
172   SELECT json(jsonb_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]'));
173 } {{{"f":7}}}
174 do_execsql_test json102-280 {
175   SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f');
176 } {{7}}
177 do_execsql_test json102-280b {
178   SELECT jsonb_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f');
179 } {{7}}
180 do_execsql_test json102-290 {
181   SELECT json_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a');
182 } {{[[4,5],2]}}
183 do_execsql_test json102-290-2 {
184   SELECT json_extract(jsonb('{"a":2,"c":[4,5],"f":7}'),'$.c','$.a');
185 } {{[[4,5],2]}}
186 do_execsql_test json102-290-3 {
187   SELECT json(jsonb_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a'));
188 } {{[[4,5],2]}}
189 do_execsql_test json102-290-4 {
190   SELECT json(jsonb_extract(jsonb('{"a":2,"c":[4,5],"f":7}'),'$.c','$.a'));
191 } {{[[4,5],2]}}
192 do_execsql_test json102-300 {
193   SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x');
194 } {{}}
195 do_execsql_test json102-300b {
196   SELECT jsonb_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x');
197 } {{}}
198 do_execsql_test json102-310 {
199   SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a');
200 } {{[null,2]}}
201 do_execsql_test json102-310-2 {
202   SELECT json_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$.x', '$.a');
203 } {{[null,2]}}
204 do_execsql_test json102-310-3 {
205   SELECT json(jsonb_extract(jsonb('{"a":2,"c":[4,5,{"f":7}]}'), '$.x', '$.a'));
206 } {{[null,2]}}
207 do_execsql_test json102-310-43 {
208   SELECT json(jsonb_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a'));
209 } {{[null,2]}}
210 do_execsql_test json102-320 {
211   SELECT json_insert('{"a":2,"c":4}', '$.a', 99);
212 } {{{"a":2,"c":4}}}
213 do_execsql_test json102-320-2 {
214   SELECT json_insert(jsonb('{"a":2,"c":4}'), '$.a', 99);
215 } {{{"a":2,"c":4}}}
216 do_execsql_test json102-320-3 {
217   SELECT json(jsonb_insert('{"a":2,"c":4}', '$.a', 99));
218 } {{{"a":2,"c":4}}}
219 do_execsql_test json102-320-4 {
220   SELECT json(jsonb_insert(jsonb('{"a":2,"c":4}'), '$.a', 99));
221 } {{{"a":2,"c":4}}}
222 do_execsql_test json102-330 {
223   SELECT json_insert('{"a":2,"c":4}', '$.e', 99);
224 } {{{"a":2,"c":4,"e":99}}}
225 do_execsql_test json102-330-2 {
226   SELECT json_insert(jsonb('{"a":2,"c":4}'), '$.e', 99);
227 } {{{"a":2,"c":4,"e":99}}}
228 do_execsql_test json102-330-3 {
229   SELECT json(jsonb_insert('{"a":2,"c":4}', '$.e', 99));
230 } {{{"a":2,"c":4,"e":99}}}
231 do_execsql_test json102-330-4 {
232   SELECT json(jsonb_insert(jsonb('{"a":2,"c":4}'), '$.e', 99));
233 } {{{"a":2,"c":4,"e":99}}}
234 do_execsql_test json102-340 {
235   SELECT json_replace('{"a":2,"c":4}', '$.a', 99);
236 } {{{"a":99,"c":4}}}
237 do_execsql_test json102-340-2 {
238   SELECT json_replace(jsonb('{"a":2,"c":4}'), '$.a', 99);
239 } {{{"a":99,"c":4}}}
240 do_execsql_test json102-340-3 {
241   SELECT json(jsonb_replace('{"a":2,"c":4}', '$.a', 99));
242 } {{{"a":99,"c":4}}}
243 do_execsql_test json102-340-4 {
244   SELECT json(jsonb_replace(jsonb('{"a":2,"c":4}'), '$.a', 99));
245 } {{{"a":99,"c":4}}}
246 do_execsql_test json102-350 {
247   SELECT json_replace('{"a":2,"c":4}', '$.e', 99);
248 } {{{"a":2,"c":4}}}
249 do_execsql_test json102-350-2 {
250   SELECT json_replace(jsonb('{"a":2,"c":4}'), '$.e', 99);
251 } {{{"a":2,"c":4}}}
252 do_execsql_test json102-350-3 {
253   SELECT json(jsonb_replace('{"a":2,"c":4}', '$.e', 99));
254 } {{{"a":2,"c":4}}}
255 do_execsql_test json102-350-4 {
256   SELECT json(jsonb_replace(jsonb('{"a":2,"c":4}'), '$.e', 99));
257 } {{{"a":2,"c":4}}}
258 do_execsql_test json102-360 {
259   SELECT json_set('{"a":2,"c":4}', '$.a', 99);
260 } {{{"a":99,"c":4}}}
261 do_execsql_test json102-360-2 {
262   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.a', 99);
263 } {{{"a":99,"c":4}}}
264 do_execsql_test json102-360-3 {
265   SELECT json(jsonb_set('{"a":2,"c":4}', '$.a', 99));
266 } {{{"a":99,"c":4}}}
267 do_execsql_test json102-360-4 {
268   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.a', 99));
269 } {{{"a":99,"c":4}}}
270 do_execsql_test json102-370 {
271   SELECT json_set('{"a":2,"c":4}', '$.e', 99);
272 } {{{"a":2,"c":4,"e":99}}}
273 do_execsql_test json102-370-2 {
274   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.e', 99);
275 } {{{"a":2,"c":4,"e":99}}}
276 do_execsql_test json102-370-3 {
277   SELECT json(jsonb_set('{"a":2,"c":4}', '$.e', 99));
278 } {{{"a":2,"c":4,"e":99}}}
279 do_execsql_test json102-370-4 {
280   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.e', 99));
281 } {{{"a":2,"c":4,"e":99}}}
282 do_execsql_test json102-380 {
283   SELECT json_set('{"a":2,"c":4}', '$.c', '[97,96]');
284 } {{{"a":2,"c":"[97,96]"}}}
285 do_execsql_test json102-380-2 {
286   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.c', '[97,96]');
287 } {{{"a":2,"c":"[97,96]"}}}
288 do_execsql_test json102-380-3 {
289   SELECT json(jsonb_set('{"a":2,"c":4}', '$.c', '[97,96]'));
290 } {{{"a":2,"c":"[97,96]"}}}
291 do_execsql_test json102-380-4 {
292   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.c', '[97,96]'));
293 } {{{"a":2,"c":"[97,96]"}}}
294 do_execsql_test json102-390 {
295   SELECT json_set('{"a":2,"c":4}', '$.c', json('[97,96]'));
296 } {{{"a":2,"c":[97,96]}}}
297 do_execsql_test json102-390-2 {
298   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.c', json('[97,96]'));
299 } {{{"a":2,"c":[97,96]}}}
300 do_execsql_test json102-390-3 {
301   SELECT json(jsonb_set('{"a":2,"c":4}', '$.c', json('[97,96]')));
302 } {{{"a":2,"c":[97,96]}}}
303 do_execsql_test json102-390-4 {
304   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.c', json('[97,96]')));
305 } {{{"a":2,"c":[97,96]}}}
306 do_execsql_test json102-390-5 {
307   SELECT json_set('{"a":2,"c":4}', '$.c', jsonb('[97,96]'));
308 } {{{"a":2,"c":[97,96]}}}
309 do_execsql_test json102-390-6 {
310   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.c', jsonb('[97,96]'));
311 } {{{"a":2,"c":[97,96]}}}
312 do_execsql_test json102-390-7 {
313   SELECT json(jsonb_set('{"a":2,"c":4}', '$.c', jsonb('[97,96]')));
314 } {{{"a":2,"c":[97,96]}}}
315 do_execsql_test json102-390-8 {
316   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.c', jsonb('[97,96]')));
317 } {{{"a":2,"c":[97,96]}}}
318 do_execsql_test json102-400 {
319   SELECT json_set('{"a":2,"c":4}', '$.c', json_array(97,96));
320 } {{{"a":2,"c":[97,96]}}}
321 do_execsql_test json102-400-2 {
322   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.c', json_array(97,96));
323 } {{{"a":2,"c":[97,96]}}}
324 do_execsql_test json102-400-3 {
325   SELECT json(jsonb_set('{"a":2,"c":4}', '$.c', json_array(97,96)));
326 } {{{"a":2,"c":[97,96]}}}
327 do_execsql_test json102-400-4 {
328   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.c', json_array(97,96)));
329 } {{{"a":2,"c":[97,96]}}}
330 do_execsql_test json102-400-5 {
331   SELECT json_set('{"a":2,"c":4}', '$.c', jsonb_array(97,96));
332 } {{{"a":2,"c":[97,96]}}}
333 do_execsql_test json102-400-6 {
334   SELECT json_set(jsonb('{"a":2,"c":4}'), '$.c', jsonb_array(97,96));
335 } {{{"a":2,"c":[97,96]}}}
336 do_execsql_test json102-400-7 {
337   SELECT json(jsonb_set('{"a":2,"c":4}', '$.c', jsonb_array(97,96)));
338 } {{{"a":2,"c":[97,96]}}}
339 do_execsql_test json102-400-8 {
340   SELECT json(jsonb_set(jsonb('{"a":2,"c":4}'), '$.c', jsonb_array(97,96)));
341 } {{{"a":2,"c":[97,96]}}}
342 do_execsql_test json102-410 {
343   SELECT json_object('a',2,'c',4);
344 } {{{"a":2,"c":4}}}
345 do_execsql_test json102-410b {
346   SELECT json(jsonb_object('a',2,'c',4));
347 } {{{"a":2,"c":4}}}
348 do_execsql_test json102-420 {
349   SELECT json_object('a',2,'c','{e:5}');
350 } {{{"a":2,"c":"{e:5}"}}}
351 do_execsql_test json102-420b {
352   SELECT json(jsonb_object('a',2,'c','{e:5}'));
353 } {{{"a":2,"c":"{e:5}"}}}
354 do_execsql_test json102-430 {
355   SELECT json_object('a',2,'c',json_object('e',5));
356 } {{{"a":2,"c":{"e":5}}}}
357 do_execsql_test json102-430-2 {
358   SELECT json(jsonb_object('a',2,'c',json_object('e',5)));
359 } {{{"a":2,"c":{"e":5}}}}
360 do_execsql_test json102-430-3 {
361   SELECT json_object('a',2,'c',jsonb_object('e',5));
362 } {{{"a":2,"c":{"e":5}}}}
363 do_execsql_test json102-430-4 {
364   SELECT json(jsonb_object('a',2,'c',jsonb_object('e',5)));
365 } {{{"a":2,"c":{"e":5}}}}
366 do_execsql_test json102-440 {
367   SELECT json_remove('[0,1,2,3,4]','$[2]');
368 } {{[0,1,3,4]}}
369 do_execsql_test json102-440-2 {
370   SELECT json_remove(jsonb('[0,1,2,3,4]'),'$[2]');
371 } {{[0,1,3,4]}}
372 do_execsql_test json102-440-3 {
373   SELECT json(jsonb_remove('[0,1,2,3,4]','$[2]'));
374 } {{[0,1,3,4]}}
375 do_execsql_test json102-440-4 {
376   SELECT json(jsonb_remove(jsonb('[0,1,2,3,4]'),'$[2]'));
377 } {{[0,1,3,4]}}
378 do_execsql_test json102-450 {
379   SELECT json_remove('[0,1,2,3,4]','$[2]','$[0]');
380 } {{[1,3,4]}}
381 do_execsql_test json102-450-2 {
382   SELECT json_remove(jsonb('[0,1,2,3,4]'),'$[2]','$[0]');
383 } {{[1,3,4]}}
384 do_execsql_test json102-450-3 {
385   SELECT json(jsonb_remove('[0,1,2,3,4]','$[2]','$[0]'));
386 } {{[1,3,4]}}
387 do_execsql_test json102-450-4 {
388   SELECT json(jsonb_remove(jsonb('[0,1,2,3,4]'),'$[2]','$[0]'));
389 } {{[1,3,4]}}
390 do_execsql_test json102-460 {
391   SELECT json_remove('[0,1,2,3,4]','$[0]','$[2]');
392 } {{[1,2,4]}}
393 do_execsql_test json102-460-2 {
394   SELECT json_remove(jsonb('[0,1,2,3,4]'),'$[0]','$[2]');
395 } {{[1,2,4]}}
396 do_execsql_test json102-460-3 {
397   SELECT json(jsonb_remove('[0,1,2,3,4]','$[0]','$[2]'));
398 } {{[1,2,4]}}
399 do_execsql_test json102-460-4 {
400   SELECT json(jsonb_remove(jsonb('[0,1,2,3,4]'),'$[0]','$[2]'));
401 } {{[1,2,4]}}
402 do_execsql_test json102-470 {
403   SELECT json_remove('{"x":25,"y":42}');
404 } {{{"x":25,"y":42}}}
405 do_execsql_test json102-470-2 {
406   SELECT json_remove(jsonb('{"x":25,"y":42}'));
407 } {{{"x":25,"y":42}}}
408 do_execsql_test json102-470-3 {
409   SELECT json(jsonb_remove('{"x":25,"y":42}'));
410 } {{{"x":25,"y":42}}}
411 do_execsql_test json102-470-4 {
412   SELECT json(jsonb_remove(jsonb('{"x":25,"y":42}')));
413 } {{{"x":25,"y":42}}}
414 do_execsql_test json102-480 {
415   SELECT json_remove('{"x":25,"y":42}','$.z');
416 } {{{"x":25,"y":42}}}
417 do_execsql_test json102-480-2 {
418   SELECT json_remove(jsonb('{"x":25,"y":42}'),'$.z');
419 } {{{"x":25,"y":42}}}
420 do_execsql_test json102-480-3 {
421   SELECT json(jsonb_remove('{"x":25,"y":42}','$.z'));
422 } {{{"x":25,"y":42}}}
423 do_execsql_test json102-480-4 {
424   SELECT json(jsonb_remove(jsonb('{"x":25,"y":42}'),'$.z'));
425 } {{{"x":25,"y":42}}}
426 do_execsql_test json102-490 {
427   SELECT json_remove('{"x":25,"y":42}','$.y');
428 } {{{"x":25}}}
429 do_execsql_test json102-490-2 {
430   SELECT json_remove(jsonb('{"x":25,"y":42}'),'$.y');
431 } {{{"x":25}}}
432 do_execsql_test json102-490-3 {
433   SELECT json(jsonb_remove('{"x":25,"y":42}','$.y'));
434 } {{{"x":25}}}
435 do_execsql_test json102-490-4 {
436   SELECT json(jsonb_remove(jsonb('{"x":25,"y":42}'),'$.y'));
437 } {{{"x":25}}}
438 do_execsql_test json102-500 {
439   SELECT json_remove('{"x":25,"y":42}','$');
440 } {{}}
441 do_execsql_test json102-500-2 {
442   SELECT json_remove(jsonb('{"x":25,"y":42}'),'$');
443 } {{}}
444 do_execsql_test json102-500-3 {
445   SELECT json(jsonb_remove('{"x":25,"y":42}','$'));
446 } {{}}
447 do_execsql_test json102-500-4 {
448   SELECT json(jsonb_remove(jsonb('{"x":25,"y":42}'),'$'));
449 } {{}}
450 do_execsql_test json102-510 {
451   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}');
452 } {{object}}
453 do_execsql_test json102-510b {
454   SELECT json_type(x'cc0f1761cb0b133235332e350102001778');
455 } {{object}}
456 do_execsql_test json102-520 {
457   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$');
458 } {{object}}
459 do_execsql_test json102-520b {
460   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$');
461 } {{object}}
462 do_execsql_test json102-530 {
463   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a');
464 } {{array}}
465 do_execsql_test json102-530b {
466   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a');
467 } {{array}}
468 do_execsql_test json102-540 {
469   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[0]');
470 } {{integer}}
471 do_execsql_test json102-540b {
472   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[0]');
473 } {{integer}}
474 do_execsql_test json102-550 {
475   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[1]');
476 } {{real}}
477 do_execsql_test json102-550b {
478   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[1]');
479 } {{real}}
480 do_execsql_test json102-560 {
481   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[2]');
482 } {{true}}
483 do_execsql_test json102-560b {
484   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[2]');
485 } {{true}}
486 do_execsql_test json102-570 {
487   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[3]');
488 } {{false}}
489 do_execsql_test json102-570b {
490   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[3]');
491 } {{false}}
492 do_execsql_test json102-580 {
493   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[4]');
494 } {{null}}
495 do_execsql_test json102-580b {
496   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[4]');
497 } {{null}}
498 do_execsql_test json102-590 {
499   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[5]');
500 } {{text}}
501 do_execsql_test json102-590b {
502   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[5]');
503 } {{text}}
504 do_execsql_test json102-600 {
505   SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[6]');
506 } {{}}
507 do_execsql_test json102-600b {
508   SELECT json_type(x'cc0f1761cb0b133235332e350102001778','$.a[6]');
509 } {{}}
510 do_execsql_test json102-610 {
511   SELECT json_valid(char(123)||'"x":35'||char(125));
512 } {{1}}
513 do_execsql_test json102-620 {
514   SELECT json_valid(char(123)||'"x":35');
515 } {{0}}
517 ifcapable vtab {
518 do_execsql_test json102-1000 {
519   CREATE TABLE user(name,phone,phoneb);
520   INSERT INTO user(name,phone) VALUES
521      ('Alice','["919-555-2345","804-555-3621"]'),
522      ('Bob','["201-555-8872"]'),
523      ('Cindy','["704-555-9983"]'),
524      ('Dave','["336-555-8421","704-555-4321","803-911-4421"]');
525   UPDATE user SET phoneb=jsonb(phone);
526   SELECT DISTINCT user.name
527     FROM user, json_each(user.phone)
528    WHERE json_each.value LIKE '704-%'
529    ORDER BY 1;
530 } {Cindy Dave}
531 do_execsql_test json102-1000b {
532   SELECT DISTINCT user.name
533     FROM user, json_each(user.phoneb)
534    WHERE json_each.value LIKE '704-%'
535    ORDER BY 1;
536 } {Cindy Dave}
538 do_execsql_test json102-1010 {
539   UPDATE user
540      SET phone=json_extract(phone,'$[0]')
541    WHERE json_array_length(phone)<2;
542   SELECT name, substr(phone,1,5) FROM user ORDER BY name;
543 } {Alice {["919} Bob 201-5 Cindy 704-5 Dave {["336}}
544 do_execsql_test json102-1011 {
545   SELECT name FROM user WHERE phone LIKE '704-%'
546   UNION
547   SELECT user.name
548     FROM user, json_each(user.phone)
549    WHERE json_valid(user.phone)
550      AND json_each.value LIKE '704-%';
551 } {Cindy Dave}
553 do_execsql_test json102-1100 {
554   CREATE TABLE big(json JSON);
555   INSERT INTO big(json) VALUES('{
556     "id":123,
557     "stuff":[1,2,3,4],
558     "partlist":[
559        {"uuid":"bb108722-572e-11e5-9320-7f3b63a4ca74"},
560        {"uuid":"c690dc14-572e-11e5-95f9-dfc8861fd535"},
561        {"subassembly":[
562           {"uuid":"6fa5181e-5721-11e5-a04e-57f3d7b32808"}
563        ]}
564     ]
565   }');
566   INSERT INTO big(json) VALUES('{
567     "id":456,
568     "stuff":["hello","world","xyzzy"],
569     "partlist":[
570        {"uuid":false},
571        {"uuid":"c690dc14-572e-11e5-95f9-dfc8861fd535"}
572     ]
573   }');
574 } {}
575 set correct_answer [list \
576     1 {$.id} 123 \
577     1 {$.stuff[0]} 1 \
578     1 {$.stuff[1]} 2 \
579     1 {$.stuff[2]} 3 \
580     1 {$.stuff[3]} 4 \
581     1 {$.partlist[0].uuid} bb108722-572e-11e5-9320-7f3b63a4ca74 \
582     1 {$.partlist[1].uuid} c690dc14-572e-11e5-95f9-dfc8861fd535 \
583     1 {$.partlist[2].subassembly[0].uuid} 6fa5181e-5721-11e5-a04e-57f3d7b32808 \
584     2 {$.id} 456 \
585     2 {$.stuff[0]} hello \
586     2 {$.stuff[1]} world \
587     2 {$.stuff[2]} xyzzy \
588     2 {$.partlist[0].uuid} 0 \
589     2 {$.partlist[1].uuid} c690dc14-572e-11e5-95f9-dfc8861fd535]
590 do_execsql_test json102-1110 {
591   SELECT big.rowid, fullkey, value
592     FROM big, json_tree(big.json)
593    WHERE json_tree.type NOT IN ('object','array')
594    ORDER BY +big.rowid, +json_tree.id
595 } $correct_answer
596 do_execsql_test json102-1110b {
597   SELECT big.rowid, fullkey, value
598     FROM big, json_tree(jsonb(big.json))
599    WHERE json_tree.type NOT IN ('object','array')
600    ORDER BY +big.rowid, +json_tree.id
601 } $correct_answer
602 do_execsql_test json102-1120 {
603   SELECT big.rowid, fullkey, atom
604     FROM big, json_tree(big.json)
605    WHERE atom IS NOT NULL
606    ORDER BY +big.rowid, +json_tree.id
607 } $correct_answer
609 do_execsql_test json102-1130 {
610   SELECT DISTINCT json_extract(big.json,'$.id')
611     FROM big, json_tree(big.json,'$.partlist')
612    WHERE json_tree.key='uuid'
613      AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808';
614 } {123}
615 do_execsql_test json102-1131 {
616   SELECT DISTINCT json_extract(big.json,'$.id')
617     FROM big, json_tree(big.json,'$')
618    WHERE json_tree.key='uuid'
619      AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808';
620 } {123}
621 do_execsql_test json102-1132 {
622   SELECT DISTINCT json_extract(big.json,'$.id')
623     FROM big, json_tree(big.json)
624    WHERE json_tree.key='uuid'
625      AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808';
626 } {123}
627 } ;# end ifcapable vtab
629 #-------------------------------------------------------------------------
630 # Test that json_valid() correctly identifies non-ascii range 
631 # characters as non-whitespace.
633 do_execsql_test json102-1201 { SELECT json_valid(char(32)  || '"xyz"') } 1
634 do_execsql_test json102-1202 { SELECT json_valid(char(200) || '"xyz"') } 0
636 # Off-by-one error in jsonAppendString()
638 for {set i 0} {$i<100} {incr i} {
639   set str abcdef[string repeat \" [expr {$i+50}]]uvwxyz
640   do_test json102-[format %d [expr {$i+1300}]] {
641     db eval {SELECT json_extract(json_array($::str),'$[0]')==$::str}
642   } {1}
645 #-------------------------------------------------------------------------
646 # 2017-04-08 ticket b93be8729a895a528e2849fca99f7
647 # JSON extension accepts invalid numeric values
649 # JSON does not allow leading zeros.  But the JSON extension was
650 # allowing them.  The following tests verify that the problem is now
651 # fixed.
653 foreach {id j x0 x5} {
654   1401 {'{"x":01}'} 0 0
655   1402 {'{"x":-01}'} 0 0
656   1403 {'{"x":0}'} 1 1
657   1404 {'{"x":-0}'} 1 1
658   1405 {'{"x":0.1}'} 1 1
659   1406 {'{"x":-0.1}'} 1 1
660   1407 {'{"x":0.0000}'} 1 1
661   1408 {'{"x":-0.0000}'} 1 1
662   1409 {'{"x":01.5}'} 0 0
663   1410 {'{"x":-01.5}'} 0 0
664   1411 {'{"x":00}'} 0 0
665   1412 {'{"x":-00}'} 0 0
666   1413 {'{"x":+0}'} 0 1
667   1414 {'{"x":+5}'} 0 1
668   1415 {'{"x":+5.5}'} 0 1
669 } {
670   do_execsql_test json102-$id "
671      SELECT json_valid($j), NOT json_error_position($j);
672   " [list $x0 $x5]
675 #------------------------------------------------------------------------
676 # 2017-04-10 ticket 6c9b5514077fed34551f98e64c09a10dc2fc8e16
677 # JSON extension accepts strings containing control characters.
679 # The JSON spec requires that all control characters be escaped.
681 do_execsql_test json102-1500 {
682   WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<0x20)
683   SELECT x FROM c WHERE json_valid(printf('{"a":"x%sz"}', char(x))) ORDER BY x;
684 } {32}
686 # All control characters are escaped
688 do_execsql_test json102-1501 {
689   WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<0x1f)
690   SELECT sum(json_valid(json_quote('a'||char(x)||'z'))) FROM c ORDER BY x;
691 } {31}
693 # 2022-01-10 tests for -> and ->> operators
695 reset_db
696 do_execsql_test json102-1600 {
697   CREATE TABLE t1(id INTEGER PRIMARY KEY, x JSON);
698   INSERT INTO t1(id,x) VALUES
699    (1, '{"a":null}'),
700    (2, '{"a":123}'),
701    (3, '{"a":4.5}'),
702    (4, '{"a":"six"}'),
703    (5, '{"a":[7,8]}'),
704    (6, '{"a":{"b":9}}'),
705    (7, '{"b":999}');
706   SELECT
707     id,
708     x->'a' AS '->',
709     CASE WHEN subtype(x->'a') THEN 'json' ELSE typeof(x->'a') END AS 'type',
710     x->>'a' AS '->>',
711     CASE WHEN subtype(x->>'a') THEN 'json' ELSE typeof(x->>'a') END AS 'type',
712     json_extract(x,'$.a') AS 'json_extract',
713     CASE WHEN subtype(json_extract(x,'$.a'))
714          THEN 'json' ELSE typeof(json_extract(x,'$.a')) END AS 'type'
715     FROM t1 ORDER BY id;
716 } [list \
717   1 null      json {}        null     {}        null          \
718   2 123       json 123       integer  123       integer       \
719   3 4.5       json 4.5       real     4.5       real          \
720   4 {"six"}   json six       text     six       text          \
721   5 {[7,8]}   json {[7,8]}   text     {[7,8]}   json          \
722   6 {{"b":9}} json {{"b":9}} text     {{"b":9}} json          \
723   7 {}        null {}        null     {}        null
725 do_execsql_test json102-1610 {
726   DELETE FROM t1;
727   INSERT INTO t1(x) VALUES('[null,123,4.5,"six",[7,8],{"b":9}]');
728   WITH c(y) AS (VALUES(0),(1),(2),(3),(4),(5),(6))
729   SELECT
730     y,
731     x->y AS '->',
732     CASE WHEN subtype(x->y) THEN 'json' ELSE typeof(x->y) END AS 'type',
733     x->>y AS '->>',
734     CASE WHEN subtype(x->>y) THEN 'json' ELSE typeof(x->>y) END AS 'type',
735     json_extract(x,format('$[%d]',y)) AS 'json_extract',
736     CASE WHEN subtype(json_extract(x,format('$[%d]',y)))
737       THEN 'json' ELSE typeof(json_extract(x,format('$[%d]',y))) END AS 'type'
738   FROM c, t1 ORDER BY y;    
739 } [list \
740   0 null      json {}        null    {}        null       \
741   1 123       json 123       integer 123       integer    \
742   2 4.5       json 4.5       real    4.5       real       \
743   3 {"six"}   json six       text    six       text       \
744   4 {[7,8]}   json {[7,8]}   text    {[7,8]}   json       \
745   5 {{"b":9}} json {{"b":9}} text    {{"b":9}} json       \
746   6 {}        null {}        null    {}        null
749 reset_db
750 do_execsql_test json102-1700 {
751   CREATE TABLE t1(a1 DATE, a2 INTEGER PRIMARY KEY, a3 INTEGER, memo TEXT);
752   CREATE INDEX t1x1 ON t1(a3, a1, memo->>'y');
753   INSERT INTO t1(a2,a1,a3,memo) VALUES (876, '2023-08-03', 5, '{"x":77,"y":4}');
755 do_execsql_test json102-1710 {
756   UPDATE t1 SET memo = JSON_REMOVE(memo, '$.y');
757   PRAGMA integrity_check;
758   SELECT * FROM t1;
759 } {ok 2023-08-03 876 5 {{"x":77}}}
760 do_execsql_test json102-1720 {
761   UPDATE t1 SET memo = JSON_SET(memo, '$.y', 6)
762     WHERE a2 IN (876) AND JSON_TYPE(memo, '$.y') IS NULL;
763   PRAGMA integrity_check;
764   SELECT * FROM t1;
765 } {ok 2023-08-03 876 5 {{"x":77,"y":6}}}
767 finish_test