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 |