OLD | NEW |
| (Empty) |
1 # 2015-08-12 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
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. | |
9 # | |
10 #*********************************************************************** | |
11 # This file implements tests for JSON SQL functions extension to the | |
12 # SQLite library. | |
13 # | |
14 # This file contains tests automatically generated from the json1 | |
15 # documentation. | |
16 # | |
17 | |
18 set testdir [file dirname $argv0] | |
19 source $testdir/tester.tcl | |
20 | |
21 ifcapable !json1 { | |
22 finish_test | |
23 return | |
24 } | |
25 | |
26 do_execsql_test json102-100 { | |
27 SELECT json_object('ex','[52,3.14159]'); | |
28 } {{{"ex":"[52,3.14159]"}}} | |
29 do_execsql_test json102-110 { | |
30 SELECT json_object('ex',json('[52,3.14159]')); | |
31 } {{{"ex":[52,3.14159]}}} | |
32 do_execsql_test json102-120 { | |
33 SELECT json_object('ex',json_array(52,3.14159)); | |
34 } {{{"ex":[52,3.14159]}}} | |
35 do_execsql_test json102-130 { | |
36 SELECT json(' { "this" : "is", "a": [ "test" ] } '); | |
37 } {{{"this":"is","a":["test"]}}} | |
38 do_execsql_test json102-140 { | |
39 SELECT json_array(1,2,'3',4); | |
40 } {{[1,2,"3",4]}} | |
41 do_execsql_test json102-150 { | |
42 SELECT json_array('[1,2]'); | |
43 } {{["[1,2]"]}} | |
44 do_execsql_test json102-160 { | |
45 SELECT json_array(json_array(1,2)); | |
46 } {{[[1,2]]}} | |
47 do_execsql_test json102-170 { | |
48 SELECT json_array(1,null,'3','[4,5]','{"six":7.7}'); | |
49 } {{[1,null,"3","[4,5]","{\"six\":7.7}"]}} | |
50 do_execsql_test json102-180 { | |
51 SELECT json_array(1,null,'3',json('[4,5]'),json('{"six":7.7}')); | |
52 } {{[1,null,"3",[4,5],{"six":7.7}]}} | |
53 do_execsql_test json102-190 { | |
54 SELECT json_array_length('[1,2,3,4]'); | |
55 } {{4}} | |
56 do_execsql_test json102-200 { | |
57 SELECT json_array_length('[1,2,3,4]', '$'); | |
58 } {{4}} | |
59 do_execsql_test json102-210 { | |
60 SELECT json_array_length('[1,2,3,4]', '$[2]'); | |
61 } {{0}} | |
62 do_execsql_test json102-220 { | |
63 SELECT json_array_length('{"one":[1,2,3]}'); | |
64 } {{0}} | |
65 do_execsql_test json102-230 { | |
66 SELECT json_array_length('{"one":[1,2,3]}', '$.one'); | |
67 } {{3}} | |
68 do_execsql_test json102-240 { | |
69 SELECT json_array_length('{"one":[1,2,3]}', '$.two'); | |
70 } {{}} | |
71 do_execsql_test json102-250 { | |
72 SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$'); | |
73 } {{{"a":2,"c":[4,5,{"f":7}]}}} | |
74 do_execsql_test json102-260 { | |
75 SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c'); | |
76 } {{[4,5,{"f":7}]}} | |
77 do_execsql_test json102-270 { | |
78 SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]'); | |
79 } {{{"f":7}}} | |
80 do_execsql_test json102-280 { | |
81 SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f'); | |
82 } {{7}} | |
83 do_execsql_test json102-290 { | |
84 SELECT json_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a'); | |
85 } {{[[4,5],2]}} | |
86 do_execsql_test json102-300 { | |
87 SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x'); | |
88 } {{}} | |
89 do_execsql_test json102-310 { | |
90 SELECT json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a'); | |
91 } {{[null,2]}} | |
92 do_execsql_test json102-320 { | |
93 SELECT json_insert('{"a":2,"c":4}', '$.a', 99); | |
94 } {{{"a":2,"c":4}}} | |
95 do_execsql_test json102-330 { | |
96 SELECT json_insert('{"a":2,"c":4}', '$.e', 99); | |
97 } {{{"a":2,"c":4,"e":99}}} | |
98 do_execsql_test json102-340 { | |
99 SELECT json_replace('{"a":2,"c":4}', '$.a', 99); | |
100 } {{{"a":99,"c":4}}} | |
101 do_execsql_test json102-350 { | |
102 SELECT json_replace('{"a":2,"c":4}', '$.e', 99); | |
103 } {{{"a":2,"c":4}}} | |
104 do_execsql_test json102-360 { | |
105 SELECT json_set('{"a":2,"c":4}', '$.a', 99); | |
106 } {{{"a":99,"c":4}}} | |
107 do_execsql_test json102-370 { | |
108 SELECT json_set('{"a":2,"c":4}', '$.e', 99); | |
109 } {{{"a":2,"c":4,"e":99}}} | |
110 do_execsql_test json102-380 { | |
111 SELECT json_set('{"a":2,"c":4}', '$.c', '[97,96]'); | |
112 } {{{"a":2,"c":"[97,96]"}}} | |
113 do_execsql_test json102-390 { | |
114 SELECT json_set('{"a":2,"c":4}', '$.c', json('[97,96]')); | |
115 } {{{"a":2,"c":[97,96]}}} | |
116 do_execsql_test json102-400 { | |
117 SELECT json_set('{"a":2,"c":4}', '$.c', json_array(97,96)); | |
118 } {{{"a":2,"c":[97,96]}}} | |
119 do_execsql_test json102-410 { | |
120 SELECT json_object('a',2,'c',4); | |
121 } {{{"a":2,"c":4}}} | |
122 do_execsql_test json102-420 { | |
123 SELECT json_object('a',2,'c','{e:5}'); | |
124 } {{{"a":2,"c":"{e:5}"}}} | |
125 do_execsql_test json102-430 { | |
126 SELECT json_object('a',2,'c',json_object('e',5)); | |
127 } {{{"a":2,"c":{"e":5}}}} | |
128 do_execsql_test json102-440 { | |
129 SELECT json_remove('[0,1,2,3,4]','$[2]'); | |
130 } {{[0,1,3,4]}} | |
131 do_execsql_test json102-450 { | |
132 SELECT json_remove('[0,1,2,3,4]','$[2]','$[0]'); | |
133 } {{[1,3,4]}} | |
134 do_execsql_test json102-460 { | |
135 SELECT json_remove('[0,1,2,3,4]','$[0]','$[2]'); | |
136 } {{[1,2,4]}} | |
137 do_execsql_test json102-470 { | |
138 SELECT json_remove('{"x":25,"y":42}'); | |
139 } {{{"x":25,"y":42}}} | |
140 do_execsql_test json102-480 { | |
141 SELECT json_remove('{"x":25,"y":42}','$.z'); | |
142 } {{{"x":25,"y":42}}} | |
143 do_execsql_test json102-490 { | |
144 SELECT json_remove('{"x":25,"y":42}','$.y'); | |
145 } {{{"x":25}}} | |
146 do_execsql_test json102-500 { | |
147 SELECT json_remove('{"x":25,"y":42}','$'); | |
148 } {{}} | |
149 do_execsql_test json102-510 { | |
150 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}'); | |
151 } {{object}} | |
152 do_execsql_test json102-520 { | |
153 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$'); | |
154 } {{object}} | |
155 do_execsql_test json102-530 { | |
156 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a'); | |
157 } {{array}} | |
158 do_execsql_test json102-540 { | |
159 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[0]'); | |
160 } {{integer}} | |
161 do_execsql_test json102-550 { | |
162 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[1]'); | |
163 } {{real}} | |
164 do_execsql_test json102-560 { | |
165 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[2]'); | |
166 } {{true}} | |
167 do_execsql_test json102-570 { | |
168 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[3]'); | |
169 } {{false}} | |
170 do_execsql_test json102-580 { | |
171 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[4]'); | |
172 } {{null}} | |
173 do_execsql_test json102-590 { | |
174 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[5]'); | |
175 } {{text}} | |
176 do_execsql_test json102-600 { | |
177 SELECT json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[6]'); | |
178 } {{}} | |
179 do_execsql_test json102-610 { | |
180 SELECT json_valid(char(123)||'"x":35'||char(125)); | |
181 } {{1}} | |
182 do_execsql_test json102-620 { | |
183 SELECT json_valid(char(123)||'"x":35'); | |
184 } {{0}} | |
185 | |
186 ifcapable vtab { | |
187 do_execsql_test json102-1000 { | |
188 CREATE TABLE user(name,phone); | |
189 INSERT INTO user(name,phone) VALUES | |
190 ('Alice','["919-555-2345","804-555-3621"]'), | |
191 ('Bob','["201-555-8872"]'), | |
192 ('Cindy','["704-555-9983"]'), | |
193 ('Dave','["336-555-8421","704-555-4321","803-911-4421"]'); | |
194 SELECT DISTINCT user.name | |
195 FROM user, json_each(user.phone) | |
196 WHERE json_each.value LIKE '704-%' | |
197 ORDER BY 1; | |
198 } {Cindy Dave} | |
199 | |
200 do_execsql_test json102-1010 { | |
201 UPDATE user | |
202 SET phone=json_extract(phone,'$[0]') | |
203 WHERE json_array_length(phone)<2; | |
204 SELECT name, substr(phone,1,5) FROM user ORDER BY name; | |
205 } {Alice {["919} Bob 201-5 Cindy 704-5 Dave {["336}} | |
206 do_execsql_test json102-1011 { | |
207 SELECT name FROM user WHERE phone LIKE '704-%' | |
208 UNION | |
209 SELECT user.name | |
210 FROM user, json_each(user.phone) | |
211 WHERE json_valid(user.phone) | |
212 AND json_each.value LIKE '704-%'; | |
213 } {Cindy Dave} | |
214 | |
215 do_execsql_test json102-1100 { | |
216 CREATE TABLE big(json JSON); | |
217 INSERT INTO big(json) VALUES('{ | |
218 "id":123, | |
219 "stuff":[1,2,3,4], | |
220 "partlist":[ | |
221 {"uuid":"bb108722-572e-11e5-9320-7f3b63a4ca74"}, | |
222 {"uuid":"c690dc14-572e-11e5-95f9-dfc8861fd535"}, | |
223 {"subassembly":[ | |
224 {"uuid":"6fa5181e-5721-11e5-a04e-57f3d7b32808"} | |
225 ]} | |
226 ] | |
227 }'); | |
228 INSERT INTO big(json) VALUES('{ | |
229 "id":456, | |
230 "stuff":["hello","world","xyzzy"], | |
231 "partlist":[ | |
232 {"uuid":false}, | |
233 {"uuid":"c690dc14-572e-11e5-95f9-dfc8861fd535"} | |
234 ] | |
235 }'); | |
236 } {} | |
237 set correct_answer [list \ | |
238 1 {$.id} 123 \ | |
239 1 {$.stuff[0]} 1 \ | |
240 1 {$.stuff[1]} 2 \ | |
241 1 {$.stuff[2]} 3 \ | |
242 1 {$.stuff[3]} 4 \ | |
243 1 {$.partlist[0].uuid} bb108722-572e-11e5-9320-7f3b63a4ca74 \ | |
244 1 {$.partlist[1].uuid} c690dc14-572e-11e5-95f9-dfc8861fd535 \ | |
245 1 {$.partlist[2].subassembly[0].uuid} 6fa5181e-5721-11e5-a04e-57f3d7b32808 \ | |
246 2 {$.id} 456 \ | |
247 2 {$.stuff[0]} hello \ | |
248 2 {$.stuff[1]} world \ | |
249 2 {$.stuff[2]} xyzzy \ | |
250 2 {$.partlist[0].uuid} 0 \ | |
251 2 {$.partlist[1].uuid} c690dc14-572e-11e5-95f9-dfc8861fd535] | |
252 do_execsql_test json102-1110 { | |
253 SELECT big.rowid, fullkey, value | |
254 FROM big, json_tree(big.json) | |
255 WHERE json_tree.type NOT IN ('object','array') | |
256 ORDER BY +big.rowid, +json_tree.id | |
257 } $correct_answer | |
258 do_execsql_test json102-1120 { | |
259 SELECT big.rowid, fullkey, atom | |
260 FROM big, json_tree(big.json) | |
261 WHERE atom IS NOT NULL | |
262 ORDER BY +big.rowid, +json_tree.id | |
263 } $correct_answer | |
264 | |
265 do_execsql_test json102-1130 { | |
266 SELECT DISTINCT json_extract(big.json,'$.id') | |
267 FROM big, json_tree(big.json,'$.partlist') | |
268 WHERE json_tree.key='uuid' | |
269 AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808'; | |
270 } {123} | |
271 do_execsql_test json102-1131 { | |
272 SELECT DISTINCT json_extract(big.json,'$.id') | |
273 FROM big, json_tree(big.json,'$') | |
274 WHERE json_tree.key='uuid' | |
275 AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808'; | |
276 } {123} | |
277 do_execsql_test json102-1132 { | |
278 SELECT DISTINCT json_extract(big.json,'$.id') | |
279 FROM big, json_tree(big.json) | |
280 WHERE json_tree.key='uuid' | |
281 AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808'; | |
282 } {123} | |
283 } ;# end ifcapable vtab | |
284 | |
285 #------------------------------------------------------------------------- | |
286 # Test that json_valid() correctly identifies non-ascii range | |
287 # characters as non-whitespace. | |
288 # | |
289 do_execsql_test json102-1201 { SELECT json_valid(char(32) || '"xyz"') } 1 | |
290 do_execsql_test json102-1202 { SELECT json_valid(char(200) || '"xyz"') } 0 | |
291 | |
292 # Off-by-one error in jsonAppendString() | |
293 # | |
294 for {set i 0} {$i<100} {incr i} { | |
295 set str abcdef[string repeat \" [expr {$i+50}]]uvwxyz | |
296 do_test json102-[format %d [expr {$i+1300}]] { | |
297 db eval {SELECT json_extract(json_array($::str),'$[0]')==$::str} | |
298 } {1} | |
299 } | |
300 | |
301 finish_test | |
OLD | NEW |