OLD | NEW |
(Empty) | |
| 1 # 2015 September 05 |
| 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 # |
| 12 |
| 13 source [file join [file dirname [info script]] fts5_common.tcl] |
| 14 set testprefix fts5simple |
| 15 |
| 16 # If SQLITE_ENABLE_FTS5 is defined, omit this file. |
| 17 ifcapable !fts5 { |
| 18 finish_test |
| 19 return |
| 20 } |
| 21 |
| 22 if 1 { |
| 23 |
| 24 #------------------------------------------------------------------------- |
| 25 # |
| 26 set doc "x x [string repeat {y } 50]z z" |
| 27 do_execsql_test 1.0 { |
| 28 CREATE VIRTUAL TABLE t1 USING fts5(x); |
| 29 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); |
| 30 BEGIN; |
| 31 INSERT INTO t1 VALUES($doc); |
| 32 COMMIT; |
| 33 } |
| 34 |
| 35 do_execsql_test 1.1 { |
| 36 INSERT INTO t1(t1) VALUES('integrity-check'); |
| 37 } |
| 38 |
| 39 #------------------------------------------------------------------------- |
| 40 # |
| 41 reset_db |
| 42 do_execsql_test 2.0 { |
| 43 CREATE VIRTUAL TABLE t1 USING fts5(x); |
| 44 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); |
| 45 INSERT INTO t1 VALUES('a b c'); |
| 46 INSERT INTO t1 VALUES('d e f'); |
| 47 INSERT INTO t1(t1) VALUES('optimize'); |
| 48 } |
| 49 |
| 50 do_execsql_test 2.1 { |
| 51 INSERT INTO t1(t1) VALUES('integrity-check'); |
| 52 } {} |
| 53 |
| 54 |
| 55 #------------------------------------------------------------------------- |
| 56 # |
| 57 reset_db |
| 58 do_execsql_test 3.0 { |
| 59 CREATE VIRTUAL TABLE t1 USING fts5(x, prefix='1,2'); |
| 60 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); |
| 61 BEGIN; |
| 62 INSERT INTO t1 VALUES('one'); |
| 63 SELECT * FROM t1 WHERE t1 MATCH 'o*'; |
| 64 } {one} |
| 65 |
| 66 do_execsql_test 3.1 { |
| 67 INSERT INTO t1(t1) VALUES('integrity-check'); |
| 68 } {} |
| 69 |
| 70 #------------------------------------------------------------------------- |
| 71 reset_db |
| 72 do_execsql_test 4.1 { |
| 73 CREATE VIRTUAL TABLE t11 USING fts5(content); |
| 74 INSERT INTO t11(t11, rank) VALUES('pgsz', 32); |
| 75 INSERT INTO t11 VALUES('another'); |
| 76 INSERT INTO t11 VALUES('string'); |
| 77 INSERT INTO t11 VALUES('of'); |
| 78 INSERT INTO t11 VALUES('text'); |
| 79 } |
| 80 do_test 4.2 { |
| 81 execsql { INSERT INTO t11(t11) VALUES('optimize') } |
| 82 } {} |
| 83 do_execsql_test 4.3 { |
| 84 INSERT INTO t11(t11) VALUES('integrity-check'); |
| 85 } {} |
| 86 |
| 87 #db eval { SELECT fts5_decode(rowid, block) as x FROM t11_data } { puts $x } |
| 88 |
| 89 #------------------------------------------------------------------------- |
| 90 reset_db |
| 91 set doc [string repeat "x y " 5] |
| 92 do_execsql_test 5.1 { |
| 93 CREATE VIRTUAL TABLE yy USING fts5(content); |
| 94 INSERT INTO yy(yy, rank) VALUES('pgsz', 32); |
| 95 BEGIN; |
| 96 INSERT INTO yy VALUES($doc); |
| 97 INSERT INTO yy VALUES($doc); |
| 98 INSERT INTO yy VALUES($doc); |
| 99 INSERT INTO yy VALUES($doc); |
| 100 INSERT INTO yy VALUES($doc); |
| 101 INSERT INTO yy VALUES($doc); |
| 102 INSERT INTO yy VALUES($doc); |
| 103 INSERT INTO yy VALUES($doc); |
| 104 COMMIT; |
| 105 } |
| 106 |
| 107 do_execsql_test 5.2 { |
| 108 SELECT rowid FROM yy WHERE yy MATCH 'y' ORDER BY rowid ASC |
| 109 } {1 2 3 4 5 6 7 8} |
| 110 |
| 111 do_execsql_test 5.3 { |
| 112 SELECT rowid FROM yy WHERE yy MATCH 'y' ORDER BY rowid DESC |
| 113 } {8 7 6 5 4 3 2 1} |
| 114 |
| 115 #db eval { SELECT fts5_decode(rowid, block) as x FROM yy_data } { puts $x } |
| 116 |
| 117 #------------------------------------------------------------------------- |
| 118 reset_db |
| 119 do_execsql_test 5.1 { |
| 120 CREATE VIRTUAL TABLE tt USING fts5(content); |
| 121 INSERT INTO tt(tt, rank) VALUES('pgsz', 32); |
| 122 INSERT INTO tt VALUES('aa'); |
| 123 } |
| 124 |
| 125 do_execsql_test 5.2 { |
| 126 SELECT rowid FROM tt WHERE tt MATCH 'a*'; |
| 127 } {1} |
| 128 |
| 129 do_execsql_test 5.3 { |
| 130 DELETE FROM tt; |
| 131 BEGIN; |
| 132 INSERT INTO tt VALUES('aa'); |
| 133 INSERT INTO tt VALUES('ab'); |
| 134 COMMIT; |
| 135 } {} |
| 136 |
| 137 do_execsql_test 5.4 { |
| 138 SELECT rowid FROM tt WHERE tt MATCH 'a*'; |
| 139 } {1 2} |
| 140 |
| 141 do_execsql_test 5.5 { |
| 142 DELETE FROM tt; |
| 143 BEGIN; |
| 144 INSERT INTO tt VALUES('aa'); |
| 145 INSERT INTO tt VALUES('ab'); |
| 146 INSERT INTO tt VALUES('aa'); |
| 147 INSERT INTO tt VALUES('ab'); |
| 148 INSERT INTO tt VALUES('aa'); |
| 149 INSERT INTO tt VALUES('ab'); |
| 150 INSERT INTO tt VALUES('aa'); |
| 151 INSERT INTO tt VALUES('ab'); |
| 152 COMMIT; |
| 153 SELECT rowid FROM tt WHERE tt MATCH 'a*'; |
| 154 } {1 2 3 4 5 6 7 8} |
| 155 |
| 156 do_execsql_test 5.6 { |
| 157 INSERT INTO tt(tt) VALUES('integrity-check'); |
| 158 } |
| 159 |
| 160 reset_db |
| 161 do_execsql_test 5.7 { |
| 162 CREATE VIRTUAL TABLE tt USING fts5(content); |
| 163 INSERT INTO tt(tt, rank) VALUES('pgsz', 32); |
| 164 INSERT INTO tt VALUES('aa ab ac ad ae af'); |
| 165 } |
| 166 |
| 167 do_execsql_test 5.8 { |
| 168 SELECT rowid FROM tt WHERE tt MATCH 'a*'; |
| 169 } {1} |
| 170 |
| 171 #------------------------------------------------------------------------- |
| 172 |
| 173 reset_db |
| 174 do_execsql_test 6.1 { |
| 175 CREATE VIRTUAL TABLE xyz USING fts5(x, y, z); |
| 176 INSERT INTO xyz VALUES('x', 'y', 'z'); |
| 177 } |
| 178 |
| 179 do_catchsql_test 6.2 { |
| 180 SELECT * FROM xyz WHERE xyz MATCH '' |
| 181 } {1 {fts5: syntax error near ""}} |
| 182 do_catchsql_test 6.3 { |
| 183 SELECT * FROM xyz WHERE xyz MATCH NULL |
| 184 } {1 {fts5: syntax error near ""}} |
| 185 |
| 186 #------------------------------------------------------------------------- |
| 187 |
| 188 do_execsql_test 7.1 { |
| 189 CREATE VIRTUAL TABLE ft2 USING fts5(content); |
| 190 INSERT INTO ft2(rowid, content) VALUES(1, 'a b c'); |
| 191 INSERT INTO ft2(rowid, content) VALUES(2, 'a b d'); |
| 192 } |
| 193 |
| 194 do_catchsql_test 7.2 { |
| 195 BEGIN; |
| 196 UPDATE ft2 SET rowid=2 WHERE rowid=1; |
| 197 } {1 {constraint failed}} |
| 198 |
| 199 do_execsql_test 7.3 { |
| 200 COMMIT; |
| 201 INSERT INTO ft2(ft2) VALUES('integrity-check'); |
| 202 } {} |
| 203 |
| 204 do_execsql_test 7.4 { |
| 205 SELECT * FROM ft2; |
| 206 } {{a b c} {a b d}} |
| 207 |
| 208 #------------------------------------------------------------------------- |
| 209 # |
| 210 reset_db |
| 211 do_execsql_test 8.1 { |
| 212 CREATE VIRTUAL TABLE ft2 USING fts5(content); |
| 213 INSERT INTO ft2(rowid, content) VALUES(1, 'a b'); |
| 214 } |
| 215 |
| 216 do_execsql_test 8.2 { |
| 217 BEGIN; |
| 218 INSERT INTO ft2(rowid, content) VALUES(4, 'a x'); |
| 219 } |
| 220 |
| 221 do_execsql_test 8.3 { |
| 222 INSERT INTO ft2(ft2) VALUES('integrity-check'); |
| 223 } |
| 224 |
| 225 #------------------------------------------------------------------------- |
| 226 # Check that the "table function" syntax works. |
| 227 # |
| 228 reset_db |
| 229 do_execsql_test 9.1 { |
| 230 CREATE VIRTUAL TABLE ft2 USING fts5(content); |
| 231 INSERT INTO ft2(rowid, content) VALUES(1, 'a b'); |
| 232 INSERT INTO ft2(rowid, content) VALUES(2, 'a b c d'); |
| 233 INSERT INTO ft2(rowid, content) VALUES(3, 'c d e f'); |
| 234 } |
| 235 |
| 236 do_execsql_test 9.2 { |
| 237 SELECT rowid FROM ft2('a'); |
| 238 } {1 2} |
| 239 |
| 240 do_execsql_test 9.3 { |
| 241 SELECT rowid FROM ft2('b AND c'); |
| 242 } {2} |
| 243 |
| 244 #------------------------------------------------------------------------- |
| 245 # |
| 246 do_execsql_test 10.0 { |
| 247 CREATE VIRTUAL TABLE t3 USING fts5(a, b, c); |
| 248 INSERT INTO t3 VALUES('bac aab bab', 'c bac c', 'acb aba abb'); -- 1 |
| 249 INSERT INTO t3 VALUES('bab abc c', 'acb c abb', 'c aaa c'); -- 2 |
| 250 } |
| 251 |
| 252 do_execsql_test 10.1 { |
| 253 SELECT rowid FROM t3('c: c*'); |
| 254 } {2} |
| 255 |
| 256 do_execsql_test 10.2 { |
| 257 SELECT rowid FROM t3('b: acb'); |
| 258 } {2} |
| 259 |
| 260 #------------------------------------------------------------------------- |
| 261 # Test that character 0x1A is allowed in fts5 barewords. |
| 262 # |
| 263 do_test 11.0 { |
| 264 execsql "CREATE VIRTUAL TABLE t4 USING fts5(x, tokenize=\"ascii tokenchars '\x
1A'\")" |
| 265 execsql " |
| 266 INSERT INTO t4 VALUES('a b c \x1A'); |
| 267 INSERT INTO t4 VALUES('a b c d\x1A'); |
| 268 INSERT INTO t4 VALUES('a b c \x1Ag'); |
| 269 INSERT INTO t4 VALUES('a b c d'); |
| 270 " |
| 271 } {} |
| 272 |
| 273 do_test 11.1 { |
| 274 execsql "SELECT rowid FROM t4('\x1A')" |
| 275 } {1} |
| 276 do_test 11.2 { |
| 277 execsql "SELECT rowid FROM t4('\x1A*')" |
| 278 } {1 3} |
| 279 do_test 11.3 { |
| 280 execsql "SELECT rowid FROM t4('d\x1A')" |
| 281 } {2} |
| 282 |
| 283 do_test 11.4 { |
| 284 catchsql "SELECT rowid FROM t4('d\x1B')" |
| 285 } {/fts5: syntax error/} |
| 286 do_test 11.5 { |
| 287 catchsql "SELECT rowid FROM t4('d\x19')" |
| 288 } {/fts5: syntax error/} |
| 289 |
| 290 #------------------------------------------------------------------------- |
| 291 # |
| 292 do_test 12.1 { |
| 293 execsql { |
| 294 CREATE VIRTUAL TABLE xx USING fts5(x,y); |
| 295 BEGIN; |
| 296 INSERT INTO xx VALUES('1 2 3', 'a b c'); |
| 297 } |
| 298 } {} |
| 299 |
| 300 do_execsql_test 12.2 { |
| 301 SELECT rowid FROM xx('x:a'); |
| 302 COMMIT; |
| 303 } {} |
| 304 |
| 305 #------------------------------------------------------------------------- |
| 306 # Try an UPDATE OR REPLACE query. |
| 307 # |
| 308 do_execsql_test 13.1 { |
| 309 CREATE VIRTUAL TABLE xy USING fts5(x); |
| 310 INSERT INTO xy(rowid, x) VALUES(1, '1 2 3'); |
| 311 INSERT INTO xy(rowid, x) VALUES(2, '2 3 4'); |
| 312 INSERT INTO xy(rowid, x) VALUES(3, '3 4 5'); |
| 313 } |
| 314 |
| 315 do_execsql_test 13.2 { |
| 316 UPDATE OR REPLACE xy SET rowid=3 WHERE rowid = 2; |
| 317 SELECT rowid, x FROM xy; |
| 318 } { |
| 319 1 {1 2 3} |
| 320 3 {2 3 4} |
| 321 } |
| 322 |
| 323 do_execsql_test 13.3 { |
| 324 INSERT INTO xy(xy) VALUES('integrity-check'); |
| 325 } |
| 326 |
| 327 #------------------------------------------------------------------------- |
| 328 # |
| 329 do_execsql_test 14.1 { |
| 330 CREATE VIRTUAL TABLE ttt USING fts5(x); |
| 331 BEGIN; |
| 332 INSERT INTO ttt(rowid, x) VALUES(1, 'a b c'); |
| 333 INSERT INTO ttt(rowid, x) VALUES(2, 'a b c'); |
| 334 INSERT INTO ttt(rowid, x) VALUES(3, 'a b c'); |
| 335 COMMIT; |
| 336 } |
| 337 do_test 14.2 { |
| 338 fts5_level_segs ttt |
| 339 } {1} |
| 340 |
| 341 #------------------------------------------------------------------------- |
| 342 db func rnddoc fts5_rnddoc |
| 343 do_execsql_test 14.3 { |
| 344 CREATE VIRTUAL TABLE x1 USING fts5(x); |
| 345 INSERT INTO x1(x1, rank) VALUES('pgsz', 32); |
| 346 |
| 347 WITH ii(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM ii WHERE i<10 ) |
| 348 INSERT INTO x1 SELECT rnddoc(5) FROM ii; |
| 349 } |
| 350 |
| 351 do_execsql_test 14.4 { |
| 352 SELECT rowid, x, x1 FROM x1 WHERE x1 MATCH '*reads' |
| 353 } {0 {} 3} |
| 354 |
| 355 #------------------------------------------------------------------------- |
| 356 reset_db |
| 357 do_execsql_test 15.0 { |
| 358 CREATE VIRTUAL TABLE x2 USING fts5(x, prefix=1); |
| 359 INSERT INTO x2 VALUES('ab'); |
| 360 } |
| 361 |
| 362 do_execsql_test 15.1 { |
| 363 INSERT INTO x2(x2) VALUES('integrity-check'); |
| 364 } |
| 365 |
| 366 #------------------------------------------------------------------------- |
| 367 foreach_detail_mode $testprefix { |
| 368 reset_db |
| 369 fts5_aux_test_functions db |
| 370 do_execsql_test 16.0 { |
| 371 CREATE VIRTUAL TABLE x3 USING fts5(x, detail=%DETAIL%); |
| 372 INSERT INTO x3 VALUES('a b c d e f'); |
| 373 } |
| 374 do_execsql_test 16.1 { |
| 375 SELECT fts5_test_poslist(x3) FROM x3('(a NOT b) OR c'); |
| 376 } {2.0.2} |
| 377 |
| 378 do_execsql_test 16.1 { |
| 379 SELECT fts5_test_poslist(x3) FROM x3('a OR c'); |
| 380 } {{0.0.0 1.0.2}} |
| 381 } |
| 382 |
| 383 } |
| 384 |
| 385 #------------------------------------------------------------------------- |
| 386 reset_db |
| 387 do_execsql_test 17.0 { |
| 388 CREATE VIRTUAL TABLE x3 USING fts5(x); |
| 389 INSERT INTO x3 VALUES('a b c'); |
| 390 } |
| 391 |
| 392 do_execsql_test 17.1 { |
| 393 SELECT rowid FROM x3('b AND d'); |
| 394 } |
| 395 |
| 396 #------------------------------------------------------------------------- |
| 397 do_execsql_test 18.1 { |
| 398 CREATE VIRTUAL TABLE x4 USING fts5(x); |
| 399 SELECT rowid FROM x4('""'); |
| 400 } |
| 401 |
| 402 #------------------------------------------------------------------------- |
| 403 reset_db |
| 404 do_execsql_test 19.1 { |
| 405 CREATE VIRTUAL TABLE x1 USING fts5(a,b,c); |
| 406 } |
| 407 |
| 408 do_catchsql_test 19.2 { |
| 409 SELECT * FROM x1 WHERE x1 MATCH 'c0 AND (c1 AND (c2 AND (c3 AND (c4 AND (c5 AN
D (c6 AND (c7 AND (c8 AND (c9 AND (c10 AND (c11 AND (c12 AND (c13 AND (c14 AND (
c15 AND (c16 AND (c17 AND (c18 AND (c19 AND (c20 AND (c21 AND (c22 AND (c23 AND
(c24 AND (c25 AND (c26 AND (c27 AND (c28 AND (c29 AND (c30 AND (c31 AND (c32 AND
(c33 AND (c34 AND (c35 AND (c36 AND (c37 AND (c38 AND (c39 AND (c40 AND (c41 AN
D (c42 AND (c43 AND (c44 AND (c45 AND (c46 AND (c47 AND (c48 AND (c49 AND (c50 A
ND (c51 AND (c52 AND (c53 AND (c54 AND (c55 AND (c56 AND (c57 AND (c58 AND (c59
AND (c60 AND (c61 AND (c62 AND (c63 AND (c64 AND (c65 AND (c66 AND (c67 AND (c68
AND (c69 AND (c70 AND (c71 AND (c72 AND (c73 AND (c74 AND (c75 AND (c76 AND (c7
7 AND (c78 AND (c79 AND (c80 AND (c81 AND (c82 AND (c83 AND (c84 AND (c85 AND (c
86 AND (c87 AND (c88 AND (c89 AND (c90 AND (c91 AND (c92 AND (c93 AND (c94 AND (
c95 AND (c96 AND (c97 AND (c98 AND (c99 AND (c100 AND (c101 AND (c102 AND (c103
AND (c104 AND (c105 AND (c106 AND (c107 AND (c108 AND (c109 AND (c110 AND (c111
AND (c112 AND (c113 AND (c114 AND (c115 AND (c116 AND (c117 AND (c118 AND (c119
AND (c120 AND (c121 AND (c122 AND (c123 AND (c124 AND (c125 AND (c126 AND (c127
AND (c128 AND (c129 AND (c130 AND (c131 AND (c132 AND (c133 AND (c134 AND (c135
AND (c136 AND (c137 AND (c138 AND (c139 AND (c140 AND (c141 AND (c142 AND (c143
AND (c144 AND (c145 AND (c146 AND (c147 AND (c148 AND (c149 AND (c150 AND (c151
AND (c152 AND (c153 AND (c154 AND (c155 AND (c156 AND (c157 AND (c158 AND (c159
AND (c160 AND (c161 AND (c162 AND (c163 AND (c164 AND (c165 AND (c166 AND (c167
AND (c168 AND (c169 AND (c170 AND (c171 AND (c172 AND (c173 AND (c174 AND (c175
AND (c176 AND (c177 AND (c178 AND (c179 AND (c180 AND (c181 AND (c182 AND (c183
AND (c184 AND (c185 AND (c186 AND (c187 AND (c188 AND (c189 AND (c190 AND (c191
AND (c192 AND (c193 AND (c194 AND (c195 AND (c196 AND (c197 AND (c198 AND (c199
AND c200))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))'; |
| 410 } {1 {fts5: parser stack overflow}} |
| 411 |
| 412 #------------------------------------------------------------------------- |
| 413 reset_db |
| 414 breakpoint |
| 415 do_execsql_test 20.0 { |
| 416 CREATE VIRTUAL TABLE x1 USING fts5(x); |
| 417 INSERT INTO x1(x1, rank) VALUES('pgsz', 32); |
| 418 INSERT INTO x1(rowid, x) VALUES(11111, 'onetwothree'); |
| 419 } |
| 420 do_test 20.1 { |
| 421 for {set i 1} {$i <= 200} {incr i} { |
| 422 execsql { INSERT INTO x1(rowid, x) VALUES($i, 'one two three'); } |
| 423 } |
| 424 execsql { INSERT INTO x1(x1) VALUES('optimize'); } |
| 425 execsql { DELETE FROM x1 WHERE rowid = 4; } |
| 426 } {} |
| 427 do_execsql_test 20.2 { |
| 428 INSERT INTO x1(x1) VALUES('optimize'); |
| 429 INSERT INTO x1(x1) VALUES('integrity-check'); |
| 430 } {} |
| 431 |
| 432 #------------------------------------------------------------------------- |
| 433 reset_db |
| 434 do_execsql_test 20.0 { |
| 435 CREATE VIRTUAL TABLE x1 USING fts5(x); |
| 436 INSERT INTO x1(x1, rank) VALUES('pgsz', 32); |
| 437 INSERT INTO x1(rowid, x) VALUES(11111, 'onetwothree'); |
| 438 } |
| 439 do_test 20.1 { |
| 440 for {set i 1} {$i <= 200} {incr i} { |
| 441 execsql { INSERT INTO x1(rowid, x) VALUES($i, 'one two three'); } |
| 442 } |
| 443 execsql { INSERT INTO x1(x1) VALUES('optimize'); } |
| 444 execsql { DELETE FROM x1 WHERE rowid = 4; } |
| 445 } {} |
| 446 do_execsql_test 20.2 { |
| 447 INSERT INTO x1(x1) VALUES('optimize'); |
| 448 INSERT INTO x1(x1) VALUES('integrity-check'); |
| 449 } {} |
| 450 |
| 451 #------------------------------------------------------------------------- |
| 452 reset_db |
| 453 set doc "a b [string repeat x 100000]" |
| 454 do_execsql_test 21.0 { |
| 455 CREATE VIRTUAL TABLE x1 USING fts5(x); |
| 456 INSERT INTO x1(rowid, x) VALUES(11111, $doc); |
| 457 INSERT INTO x1(rowid, x) VALUES(11112, $doc); |
| 458 } |
| 459 do_execsql_test 21.1 { |
| 460 INSERT INTO x1(x1) VALUES('integrity-check'); |
| 461 } |
| 462 do_execsql_test 21.2 { |
| 463 SELECT rowid FROM x1($doc); |
| 464 } {11111 11112} |
| 465 do_execsql_test 21.3 { |
| 466 DELETE FROM x1 WHERE rowid=11111; |
| 467 INSERT INTO x1(x1) VALUES('integrity-check'); |
| 468 SELECT rowid FROM x1($doc); |
| 469 } {11112} |
| 470 |
| 471 finish_test |
OLD | NEW |