Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(690)

Side by Side Diff: third_party/sqlite/sqlite-src-3170000/ext/fts5/test/fts5aa.test

Issue 2747283002: [sql] Import reference version of SQLite 3.17.. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # 2014 June 17
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 regression tests for SQLite library. The
12 # focus of this script is testing the FTS5 module.
13 #
14
15 source [file join [file dirname [info script]] fts5_common.tcl]
16 set testprefix fts5aa
17
18 # If SQLITE_ENABLE_FTS5 is not defined, omit this file.
19 ifcapable !fts5 {
20 finish_test
21 return
22 }
23
24 foreach_detail_mode $::testprefix {
25
26 do_execsql_test 1.0 {
27 CREATE VIRTUAL TABLE t1 USING fts5(a, b, c);
28 SELECT name, sql FROM sqlite_master;
29 } {
30 t1 {CREATE VIRTUAL TABLE t1 USING fts5(a, b, c)}
31 t1_data {CREATE TABLE 't1_data'(id INTEGER PRIMARY KEY, block BLOB)}
32 t1_idx {CREATE TABLE 't1_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WIT HOUT ROWID}
33 t1_content {CREATE TABLE 't1_content'(id INTEGER PRIMARY KEY, c0, c1, c2)}
34 t1_docsize {CREATE TABLE 't1_docsize'(id INTEGER PRIMARY KEY, sz BLOB)}
35 t1_config {CREATE TABLE 't1_config'(k PRIMARY KEY, v) WITHOUT ROWID}
36 }
37
38 do_execsql_test 1.1 {
39 DROP TABLE t1;
40 SELECT name, sql FROM sqlite_master;
41 } {
42 }
43
44 #-------------------------------------------------------------------------
45 #
46
47 do_execsql_test 2.0 {
48 CREATE VIRTUAL TABLE t1 USING fts5(x, y, detail=%DETAIL%);
49 }
50 do_execsql_test 2.1 {
51 INSERT INTO t1 VALUES('a b c', 'd e f');
52 }
53
54 do_test 2.2 {
55 execsql { SELECT fts5_decode(id, block) FROM t1_data WHERE id==10 }
56 } {/{{structure} {lvl=0 nMerge=0 nSeg=1 {id=[0123456789]* leaves=1..1}}}/}
57
58 foreach w {a b c d e f} {
59 do_execsql_test 2.3.$w.asc {
60 SELECT rowid FROM t1 WHERE t1 MATCH $w;
61 } {1}
62 do_execsql_test 2.3.$w.desc {
63 SELECT rowid FROM t1 WHERE t1 MATCH $w ORDER BY rowid DESC;
64 } {1}
65 }
66
67 do_execsql_test 2.4 {
68 INSERT INTO t1(t1) VALUES('integrity-check');
69 }
70
71
72 #-------------------------------------------------------------------------
73 #
74 reset_db
75 do_execsql_test 3.0 {
76 CREATE VIRTUAL TABLE t1 USING fts5(x,y, detail=%DETAIL%);
77 }
78 foreach {i x y} {
79 1 {g f d b f} {h h e i a}
80 2 {f i g j e} {i j c f f}
81 3 {e e i f a} {e h f d f}
82 4 {h j f j i} {h a c f j}
83 5 {d b j c g} {f e i b e}
84 6 {a j a e e} {j d f d e}
85 7 {g i j c h} {j d h c a}
86 8 {j j i d d} {e e d f b}
87 9 {c j j d c} {h j i f g}
88 10 {b f h i a} {c f b b j}
89 } {
90 do_execsql_test 3.$i.1 { INSERT INTO t1 VALUES($x, $y) }
91 do_execsql_test 3.$i.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
92 if {[set_test_counter errors]} break
93 }
94
95 #-------------------------------------------------------------------------
96 #
97 reset_db
98 do_execsql_test 4.0 {
99 CREATE VIRTUAL TABLE t1 USING fts5(x,y, detail=%DETAIL%);
100 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
101 }
102 foreach {i x y} {
103 1 {g f d b f} {h h e i a}
104 2 {f i g j e} {i j c f f}
105 3 {e e i f a} {e h f d f}
106 4 {h j f j i} {h a c f j}
107 5 {d b j c g} {f e i b e}
108 6 {a j a e e} {j d f d e}
109 7 {g i j c h} {j d h c a}
110 8 {j j i d d} {e e d f b}
111 9 {c j j d c} {h j i f g}
112 10 {b f h i a} {c f b b j}
113 } {
114 do_execsql_test 4.$i.1 { INSERT INTO t1 VALUES($x, $y) }
115 do_execsql_test 4.$i.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
116 if {[set_test_counter errors]} break
117 }
118
119 #-------------------------------------------------------------------------
120 #
121 reset_db
122 do_execsql_test 5.0 {
123 CREATE VIRTUAL TABLE t1 USING fts5(x,y, detail=%DETAIL%);
124 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
125 }
126 foreach {i x y} {
127 1 {dd abc abc abc abcde} {aaa dd ddd ddd aab}
128 2 {dd aab d aaa b} {abcde c aaa aaa aaa}
129 3 {abcde dd b b dd} {abc abc d abc ddddd}
130 4 {aaa abcde dddd dddd abcde} {abc b b abcde abc}
131 5 {aab dddd d dddd c} {ddd abcde dddd abcde c}
132 6 {ddd dd b aab abcde} {d ddddd dddd c abc}
133 7 {d ddddd ddd c abcde} {c aab d abcde ddd}
134 8 {abcde aaa aab c c} {ddd c dddd b aaa}
135 9 {abcde aab ddddd c aab} {dddd dddd b c dd}
136 10 {ddd abcde dddd dd c} {dddd c c d abcde}
137 } {
138 do_execsql_test 5.$i.1 { INSERT INTO t1 VALUES($x, $y) }
139 do_execsql_test 5.$i.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
140 if {[set_test_counter errors]} break
141 }
142
143 #-------------------------------------------------------------------------
144 #
145 reset_db
146 do_execsql_test 6.0 {
147 CREATE VIRTUAL TABLE t1 USING fts5(x,y, detail=%DETAIL%);
148 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
149 }
150
151 do_execsql_test 6.1 {
152 INSERT INTO t1(rowid, x, y) VALUES(22, 'a b c', 'c b a');
153 REPLACE INTO t1(rowid, x, y) VALUES(22, 'd e f', 'f e d');
154 }
155
156 do_execsql_test 6.2 {
157 INSERT INTO t1(t1) VALUES('integrity-check')
158 }
159
160 do_execsql_test 6.3 {
161 REPLACE INTO t1(rowid, x, y) VALUES('22', 'l l l', 'l l l');
162 }
163
164 do_execsql_test 6.4 {
165 REPLACE INTO t1(x, y) VALUES('x y z', 'x y z');
166 }
167
168 do_execsql_test 6.5 {
169 INSERT INTO t1(t1) VALUES('integrity-check')
170 }
171
172 do_execsql_test 6.6 {
173 SELECT rowid, * FROM t1;
174 } {
175 22 {l l l} {l l l}
176 23 {x y z} {x y z}
177 }
178
179 #-------------------------------------------------------------------------
180 #
181 reset_db
182 expr srand(0)
183 do_execsql_test 7.0 {
184 CREATE VIRTUAL TABLE t1 USING fts5(x,y,z);
185 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
186 }
187
188 proc doc {} {
189 set v [list aaa aab abc abcde b c d dd ddd dddd ddddd]
190 set ret [list]
191 for {set j 0} {$j < 20} {incr j} {
192 lappend ret [lindex $v [expr int(rand()*[llength $v])]]
193 }
194 return $ret
195 }
196
197 proc dump_structure {} {
198 db eval {SELECT fts5_decode(id, block) AS t FROM t1_data WHERE id=10} {
199 foreach lvl [lrange $t 1 end] {
200 set seg [string repeat . [expr [llength $lvl]-2]]
201 puts "[lrange $lvl 0 1] $seg"
202 }
203 }
204 }
205
206 for {set i 1} {$i <= 10} {incr i} {
207 do_test 7.$i {
208 for {set j 0} {$j < 10} {incr j} {
209 set x [doc]
210 set y [doc]
211 set z [doc]
212 set rowid [expr int(rand() * 100)]
213 execsql { REPLACE INTO t1(rowid,x,y,z) VALUES($rowid, $x, $y, $z) }
214 }
215 execsql { INSERT INTO t1(t1) VALUES('integrity-check'); }
216 } {}
217 if {[set_test_counter errors]} break
218 }
219
220 #-------------------------------------------------------------------------
221 #
222 reset_db
223 do_execsql_test 8.0 {
224 CREATE VIRTUAL TABLE t1 USING fts5(x, prefix="1,2,3");
225 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
226 }
227
228 do_execsql_test 8.1 {
229 INSERT INTO t1 VALUES('the quick brown fox');
230 INSERT INTO t1(t1) VALUES('integrity-check');
231 }
232
233
234 #-------------------------------------------------------------------------
235 #
236 reset_db
237
238 expr srand(0)
239
240 do_execsql_test 9.0 {
241 CREATE VIRTUAL TABLE t1 USING fts5(x,y,z, prefix="1,2,3");
242 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
243 }
244
245 proc doc {} {
246 set v [list aaa aab abc abcde b c d dd ddd dddd ddddd]
247 set ret [list]
248 for {set j 0} {$j < 20} {incr j} {
249 lappend ret [lindex $v [expr int(rand()*[llength $v])]]
250 }
251 return $ret
252 }
253
254 proc dump_structure {} {
255 db eval {SELECT fts5_decode(id, block) AS t FROM t1_data WHERE id=10} {
256 foreach lvl [lrange $t 1 end] {
257 set seg [string repeat . [expr [llength $lvl]-2]]
258 puts "[lrange $lvl 0 1] $seg"
259 }
260 }
261 }
262
263 for {set i 1} {$i <= 10} {incr i} {
264 do_test 9.$i {
265 for {set j 0} {$j < 100} {incr j} {
266 set x [doc]
267 set y [doc]
268 set z [doc]
269 set rowid [expr int(rand() * 100)]
270 execsql { REPLACE INTO t1(rowid,x,y,z) VALUES($rowid, $x, $y, $z) }
271 }
272 execsql { INSERT INTO t1(t1) VALUES('integrity-check'); }
273 } {}
274 if {[set_test_counter errors]} break
275 }
276
277
278 #-------------------------------------------------------------------------
279 #
280 reset_db
281 do_execsql_test 10.0 {
282 CREATE VIRTUAL TABLE t1 USING fts5(x,y, detail=%DETAIL%);
283 }
284 set d10 {
285 1 {g f d b f} {h h e i a}
286 2 {f i g j e} {i j c f f}
287 3 {e e i f a} {e h f d f}
288 4 {h j f j i} {h a c f j}
289 5 {d b j c g} {f e i b e}
290 6 {a j a e e} {j d f d e}
291 7 {g i j c h} {j d h c a}
292 8 {j j i d d} {e e d f b}
293 9 {c j j d c} {h j i f g}
294 10 {b f h i a} {c f b b j}
295 }
296 foreach {rowid x y} $d10 {
297 do_execsql_test 10.1.$rowid.1 { INSERT INTO t1 VALUES($x, $y) }
298 do_execsql_test 10.1.$rowid.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
299 }
300 foreach rowid {5 9 8 1 2 4 10 7 3 5 6} {
301 do_execsql_test 10.2.$rowid.1 { DELETE FROM t1 WHERE rowid = $rowid }
302 do_execsql_test 10.2.$rowid.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
303 }
304 foreach {rowid x y} $d10 {
305 do_execsql_test 10.3.$rowid.1 { INSERT INTO t1 VALUES($x, $y) }
306 do_execsql_test 10.3.$rowid.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
307 }
308
309 do_execsql_test 10.4.1 { DELETE FROM t1 }
310 do_execsql_test 10.4.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
311
312 #-------------------------------------------------------------------------
313 #
314 do_catchsql_test 11.1 {
315 CREATE VIRTUAL TABLE t2 USING fts5(a, b, c, rank, detail=%DETAIL%);
316 } {1 {reserved fts5 column name: rank}}
317 do_catchsql_test 11.2 {
318 CREATE VIRTUAL TABLE rank USING fts5(a, b, c, detail=%DETAIL%);
319 } {1 {reserved fts5 table name: rank}}
320 do_catchsql_test 11.3 {
321 CREATE VIRTUAL TABLE t2 USING fts5(a, b, c, rowid, detail=%DETAIL%);
322 } {1 {reserved fts5 column name: rowid}}
323
324 #-------------------------------------------------------------------------
325 #
326 do_execsql_test 12.1 {
327 CREATE VIRTUAL TABLE t2 USING fts5(x,y, detail=%DETAIL%);
328 } {}
329
330 do_catchsql_test 12.2 {
331 SELECT t2 FROM t2 WHERE t2 MATCH '*stuff'
332 } {1 {unknown special query: stuff}}
333
334 do_test 12.3 {
335 set res [db eval { SELECT t2 FROM t2 WHERE t2 MATCH '* reads ' }]
336 string is integer $res
337 } {1}
338
339 #-------------------------------------------------------------------------
340 #
341 reset_db
342 do_execsql_test 13.1 {
343 CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
344 INSERT INTO t1(rowid, x) VALUES(1, 'o n e'), (2, 't w o');
345 } {}
346
347 do_execsql_test 13.2 {
348 SELECT rowid FROM t1 WHERE t1 MATCH 'o';
349 } {1 2}
350
351 do_execsql_test 13.4 {
352 DELETE FROM t1 WHERE rowid=2;
353 } {}
354
355 do_execsql_test 13.5 {
356 SELECT rowid FROM t1 WHERE t1 MATCH 'o';
357 } {1}
358
359 do_execsql_test 13.6 {
360 SELECT rowid FROM t1 WHERE t1 MATCH '""';
361 } {}
362
363 #-------------------------------------------------------------------------
364 #
365 reset_db
366 do_execsql_test 14.1 {
367 CREATE VIRTUAL TABLE t1 USING fts5(x, y, detail=%DETAIL%);
368 INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
369 WITH d(x,y) AS (
370 SELECT NULL, 'xyz xyz xyz xyz xyz xyz'
371 UNION ALL
372 SELECT NULL, 'xyz xyz xyz xyz xyz xyz' FROM d
373 )
374 INSERT INTO t1 SELECT * FROM d LIMIT 200;
375 }
376
377 do_execsql_test 15.x {
378 INSERT INTO t1(t1) VALUES('integrity-check');
379 }
380
381 do_test 14.2 {
382 set nRow 0
383 db eval { SELECT * FROM t1 WHERE t1 MATCH 'xyz' } {
384 db eval {
385 BEGIN;
386 CREATE TABLE t2(a, b);
387 ROLLBACK;
388 }
389 incr nRow
390 }
391 set nRow
392 } {200}
393
394 do_test 14.3 {
395 set nRow 0
396 db eval { BEGIN; }
397 db eval { SELECT * FROM t1 WHERE t1 MATCH 'xyz' } {
398 db eval {
399 SAVEPOINT aaa;
400 CREATE TABLE t2(a, b);
401 ROLLBACK TO aaa;
402 RELEASE aaa;
403 }
404 incr nRow
405 }
406 set nRow
407 } {200}
408
409 do_execsql_test 15.0 {
410 INSERT INTO t1(t1) VALUES('integrity-check');
411 }
412 do_execsql_test 15.1 {
413 UPDATE t1_content SET c1 = 'xyz xyz xyz xyz xyz abc' WHERE rowid = 1;
414 }
415 do_catchsql_test 15.2 {
416 INSERT INTO t1(t1) VALUES('integrity-check');
417 } {1 {database disk image is malformed}}
418
419 #-------------------------------------------------------------------------
420 #
421 do_execsql_test 16.1 {
422 CREATE VIRTUAL TABLE n1 USING fts5(a);
423 INSERT INTO n1 VALUES('a b c d');
424 }
425
426 proc funk {} {
427 db eval { UPDATE n1_config SET v=50 WHERE k='version' }
428 set fd [db incrblob main n1_data block 10]
429 fconfigure $fd -encoding binary -translation binary
430 puts -nonewline $fd "\x44\x45"
431 close $fd
432 }
433 db func funk funk
434
435 # This test case corrupts the structure record within the first invocation
436 # of function funk(). Which used to cause the bm25() function to throw an
437 # exception. But since bm25() can now used the cached structure record,
438 # it never sees the corruption introduced by funk() and so the following
439 # statement no longer fails.
440 #
441 do_catchsql_test 16.2 {
442 SELECT funk(), bm25(n1), funk() FROM n1 WHERE n1 MATCH 'a+b+c+d'
443 } {0 {{} -1e-06 {}}}
444 # {1 {SQL logic error or missing database}}
445
446 #-------------------------------------------------------------------------
447 #
448 reset_db
449 do_execsql_test 17.1 {
450 CREATE VIRTUAL TABLE b2 USING fts5(x, detail=%DETAIL%);
451 INSERT INTO b2 VALUES('a');
452 INSERT INTO b2 VALUES('b');
453 INSERT INTO b2 VALUES('c');
454 }
455
456 do_test 17.2 {
457 set res [list]
458 db eval { SELECT * FROM b2 ORDER BY rowid ASC } {
459 lappend res [execsql { SELECT * FROM b2 ORDER BY rowid ASC }]
460 }
461 set res
462 } {{a b c} {a b c} {a b c}}
463
464 if {[string match n* %DETAIL%]==0} {
465 reset_db
466 do_execsql_test 17.3 {
467 CREATE VIRTUAL TABLE c2 USING fts5(x, y, detail=%DETAIL%);
468 INSERT INTO c2 VALUES('x x x', 'x x x');
469 SELECT rowid FROM c2 WHERE c2 MATCH 'y:x';
470 } {1}
471 }
472
473 #-------------------------------------------------------------------------
474 #
475 reset_db
476 do_execsql_test 17.1 {
477 CREATE VIRTUAL TABLE uio USING fts5(ttt, detail=%DETAIL%);
478 INSERT INTO uio VALUES(NULL);
479 INSERT INTO uio SELECT NULL FROM uio;
480 INSERT INTO uio SELECT NULL FROM uio;
481 INSERT INTO uio SELECT NULL FROM uio;
482 INSERT INTO uio SELECT NULL FROM uio;
483 INSERT INTO uio SELECT NULL FROM uio;
484 INSERT INTO uio SELECT NULL FROM uio;
485 INSERT INTO uio SELECT NULL FROM uio;
486 INSERT INTO uio SELECT NULL FROM uio;
487 SELECT count(*) FROM uio;
488 } {256}
489
490 do_execsql_test 17.2 {
491 SELECT count(*) FROM uio WHERE rowid BETWEEN 8 AND 17
492 } {10}
493 do_execsql_test 17.3 {
494 SELECT rowid FROM uio WHERE rowid BETWEEN 8 AND 17
495 } {8 9 10 11 12 13 14 15 16 17}
496 do_execsql_test 17.4 {
497 SELECT rowid FROM uio WHERE rowid BETWEEN 8 AND 17 ORDER BY rowid DESC
498 } {17 16 15 14 13 12 11 10 9 8}
499 do_execsql_test 17.5 {
500 SELECT count(*) FROM uio
501 } {256}
502
503 do_execsql_test 17.6 {
504 INSERT INTO uio(rowid) VALUES(9223372036854775807);
505 INSERT INTO uio(rowid) VALUES(-9223372036854775808);
506 SELECT count(*) FROM uio;
507 } {258}
508 do_execsql_test 17.7 {
509 SELECT min(rowid), max(rowid) FROM uio;
510 } {-9223372036854775808 9223372036854775807}
511
512 do_execsql_test 17.8 {
513 INSERT INTO uio DEFAULT VALUES;
514 SELECT min(rowid), max(rowid), count(*) FROM uio;
515 } {-9223372036854775808 9223372036854775807 259}
516
517 do_execsql_test 17.9 {
518 SELECT min(rowid), max(rowid), count(*) FROM uio WHERE rowid < 10;
519 } {-9223372036854775808 9 10}
520
521 #--------------------------------------------------------------------
522 #
523 do_execsql_test 18.1 {
524 CREATE VIRTUAL TABLE t1 USING fts5(a, b, detail=%DETAIL%);
525 CREATE VIRTUAL TABLE t2 USING fts5(c, d, detail=%DETAIL%);
526 INSERT INTO t1 VALUES('abc*', NULL);
527 INSERT INTO t2 VALUES(1, 'abcdefg');
528 }
529 do_execsql_test 18.2 {
530 SELECT t1.rowid, t2.rowid FROM t1, t2 WHERE t2 MATCH t1.a AND t1.rowid = t2.c
531 } {1 1}
532 do_execsql_test 18.3 {
533 SELECT t1.rowid, t2.rowid FROM t2, t1 WHERE t2 MATCH t1.a AND t1.rowid = t2.c
534 } {1 1}
535
536 #--------------------------------------------------------------------
537 # fts5 table in the temp schema.
538 #
539 reset_db
540 do_execsql_test 19.0 {
541 CREATE VIRTUAL TABLE temp.t1 USING fts5(x, detail=%DETAIL%);
542 INSERT INTO t1 VALUES('x y z');
543 INSERT INTO t1 VALUES('w x 1');
544 SELECT rowid FROM t1 WHERE t1 MATCH 'x';
545 } {1 2}
546
547 #--------------------------------------------------------------------
548 # Test that 6 and 7 byte varints can be read.
549 #
550 reset_db
551 do_execsql_test 20.0 {
552 CREATE VIRTUAL TABLE temp.tmp USING fts5(x, detail=%DETAIL%);
553 }
554 set ::ids [list \
555 0 [expr 1<<36] [expr 2<<36] [expr 1<<43] [expr 2<<43]
556 ]
557 do_test 20.1 {
558 foreach id $::ids {
559 execsql { INSERT INTO tmp(rowid, x) VALUES($id, 'x y z') }
560 }
561 execsql { SELECT rowid FROM tmp WHERE tmp MATCH 'y' }
562 } $::ids
563
564 }
565
566
567 finish_test
568
569
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698