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

Side by Side Diff: third_party/sqlite/sqlite-src-3170000/ext/fts5/test/fts5vocab.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 # 2015 Apr 24
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 # The tests in this file focus on testing the fts5vocab module.
13 #
14
15 source [file join [file dirname [info script]] fts5_common.tcl]
16 set testprefix fts5vocab
17
18 # If SQLITE_ENABLE_FTS5 is defined, omit this file.
19 ifcapable !fts5 {
20 finish_test
21 return
22 }
23
24 foreach_detail_mode $testprefix {
25
26 proc null_list_entries {iFirst nInterval L} {
27 for {set i $iFirst} {$i < [llength $L]} {incr i $nInterval} {
28 lset L $i {}
29 }
30 return $L
31 }
32
33 proc star_from_row {L} {
34 if {[detail_is_full]==0} {
35 set L [null_list_entries 2 3 $L]
36 }
37 return $L
38 }
39
40 proc star_from_col {L} {
41 if {[detail_is_col]} {
42 set L [null_list_entries 3 4 $L]
43 }
44 if {[detail_is_none]} {
45 set L [null_list_entries 1 4 $L]
46 set L [null_list_entries 3 4 $L]
47 }
48 return $L
49 }
50
51 proc row_to_col {L} {
52 if {[detail_is_none]==0} { error "this is for detail=none mode" }
53 set ret [list]
54 foreach {a b c} $L {
55 lappend ret $a {} $b {}
56 }
57 set ret
58 }
59
60 if 1 {
61
62 do_execsql_test 1.1.1 {
63 CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1, detail=%DETAIL%);
64 CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, 'row');
65 PRAGMA table_info = v1;
66 } {
67 0 term {} 0 {} 0
68 1 doc {} 0 {} 0
69 2 cnt {} 0 {} 0
70 }
71
72 do_execsql_test 1.1.2 {
73 CREATE VIRTUAL TABLE v2 USING fts5vocab(t1, 'col');
74 PRAGMA table_info = v2;
75 } {
76 0 term {} 0 {} 0
77 1 col {} 0 {} 0
78 2 doc {} 0 {} 0
79 3 cnt {} 0 {} 0
80 }
81
82 do_execsql_test 1.2.1 { SELECT * FROM v1 } { }
83 do_execsql_test 1.2.2 { SELECT * FROM v2 } { }
84
85 do_execsql_test 1.3 {
86 INSERT INTO t1 VALUES('x y z');
87 INSERT INTO t1 VALUES('x x x');
88 }
89
90 do_execsql_test 1.4.1 {
91 SELECT * FROM v1;
92 } [star_from_row {x 2 4 y 1 1 z 1 1}]
93
94 do_execsql_test 1.4.2 {
95 SELECT * FROM v2;
96 } [star_from_col {x one 2 4 y one 1 1 z one 1 1}]
97
98 do_execsql_test 1.5.1 {
99 BEGIN;
100 INSERT INTO t1 VALUES('a b c');
101 SELECT * FROM v1 WHERE term<'d';
102 } [star_from_row {a 1 1 b 1 1 c 1 1}]
103
104 do_execsql_test 1.5.2 {
105 SELECT * FROM v2 WHERE term<'d';
106 COMMIT;
107 } [star_from_col {a one 1 1 b one 1 1 c one 1 1}]
108
109 do_execsql_test 1.6 {
110 DELETE FROM t1 WHERE one = 'a b c';
111 SELECT * FROM v1;
112 } [star_from_row {x 2 4 y 1 1 z 1 1}]
113
114 #-------------------------------------------------------------------------
115 #
116 do_execsql_test 2.0 {
117 CREATE VIRTUAL TABLE tt USING fts5(a, b, detail=%DETAIL%);
118 INSERT INTO tt VALUES('d g b f d f', 'f c e c d a');
119 INSERT INTO tt VALUES('f a e a a b', 'e d c f d d');
120 INSERT INTO tt VALUES('b c a a a b', 'f f c c b c');
121 INSERT INTO tt VALUES('f d c a c e', 'd g d e g d');
122 INSERT INTO tt VALUES('g d e f a g x', 'f f d a a b');
123 INSERT INTO tt VALUES('g c f b c g', 'a g f d c b');
124 INSERT INTO tt VALUES('c e c f g b', 'f e d b g a');
125 INSERT INTO tt VALUES('g d e f d e', 'a c d b a g');
126 INSERT INTO tt VALUES('e f a c c b', 'b f e a f d y');
127 INSERT INTO tt VALUES('c c a a c f', 'd g a e b g');
128 }
129
130 set res_row [star_from_row {
131 a 10 20 b 9 14 c 9 20 d 9 19
132 e 8 13 f 10 20 g 7 14 x 1 1
133 y 1 1
134 }]
135 set res_col [star_from_col {
136 a a 6 11 a b 7 9
137 b a 6 7 b b 7 7
138 c a 6 12 c b 5 8
139 d a 4 6 d b 9 13
140 e a 6 7 e b 6 6
141 f a 9 10 f b 7 10
142 g a 5 7 g b 5 7
143 x a 1 1 y b 1 1
144 }]
145 if {[detail_is_none]} {
146 set res_col [row_to_col $res_row]
147 }
148
149 foreach {tn tbl resname} {
150 1 "fts5vocab(tt, 'col')" res_col
151 2 "fts5vocab(tt, 'row')" res_row
152 3 "fts5vocab(tt, \"row\")" res_row
153 4 "fts5vocab(tt, [row])" res_row
154 5 "fts5vocab(tt, `row`)" res_row
155
156 6 "fts5vocab('tt', 'row')" res_row
157 7 "fts5vocab(\"tt\", \"row\")" res_row
158 8 "fts5vocab([tt], [row])" res_row
159 9 "fts5vocab(`tt`, `row`)" res_row
160 } {
161 do_execsql_test 2.$tn "
162 DROP TABLE IF EXISTS tv;
163 CREATE VIRTUAL TABLE tv USING $tbl;
164 SELECT * FROM tv;
165 " [set $resname]
166 }
167
168 #-------------------------------------------------------------------------
169 # Test errors in the CREATE VIRTUAL TABLE statement.
170 #
171 foreach {tn sql} {
172 1 { CREATE VIRTUAL TABLE aa USING fts5vocab() }
173 2 { CREATE VIRTUAL TABLE aa USING fts5vocab(x) }
174 3 { CREATE VIRTUAL TABLE aa USING fts5vocab(x,y,z) }
175 4 { CREATE VIRTUAL TABLE temp.aa USING fts5vocab(x,y,z,y) }
176 } {
177 do_catchsql_test 3.$tn $sql {1 {wrong number of vtable arguments}}
178 }
179
180 do_catchsql_test 4.0 {
181 CREATE VIRTUAL TABLE cc USING fts5vocab(tbl, unknown);
182 } {1 {fts5vocab: unknown table type: 'unknown'}}
183
184 do_catchsql_test 4.1 {
185 ATTACH 'test.db' AS aux;
186 CREATE VIRTUAL TABLE aux.cc USING fts5vocab(main, tbl, row);
187 } {1 {wrong number of vtable arguments}}
188
189 #-------------------------------------------------------------------------
190 # Test fts5vocab tables created in the temp schema.
191 #
192 reset_db
193 forcedelete test.db2
194 do_execsql_test 5.0 {
195 ATTACH 'test.db2' AS aux;
196 CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
197 CREATE VIRTUAL TABLE temp.t1 USING fts5(x, detail=%DETAIL%);
198 CREATE VIRTUAL TABLE aux.t1 USING fts5(x, detail=%DETAIL%);
199
200 INSERT INTO main.t1 VALUES('a b c');
201 INSERT INTO main.t1 VALUES('d e f');
202 INSERT INTO main.t1 VALUES('a e c');
203
204 INSERT INTO temp.t1 VALUES('1 2 3');
205 INSERT INTO temp.t1 VALUES('4 5 6');
206 INSERT INTO temp.t1 VALUES('1 5 3');
207
208 INSERT INTO aux.t1 VALUES('x y z');
209 INSERT INTO aux.t1 VALUES('m n o');
210 INSERT INTO aux.t1 VALUES('x n z');
211 }
212
213 breakpoint
214 do_execsql_test 5.1 {
215 CREATE VIRTUAL TABLE temp.vm USING fts5vocab(main, t1, row);
216 CREATE VIRTUAL TABLE temp.vt1 USING fts5vocab(t1, row);
217 CREATE VIRTUAL TABLE temp.vt2 USING fts5vocab(temp, t1, row);
218 CREATE VIRTUAL TABLE temp.va USING fts5vocab(aux, t1, row);
219 }
220
221 do_execsql_test 5.2 { SELECT * FROM vm } [star_from_row {
222 a 2 2 b 1 1 c 2 2 d 1 1 e 2 2 f 1 1
223 }]
224 do_execsql_test 5.3 { SELECT * FROM vt1 } [star_from_row {
225 1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1
226 }]
227 do_execsql_test 5.4 { SELECT * FROM vt2 } [star_from_row {
228 1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1
229 }]
230 do_execsql_test 5.5 { SELECT * FROM va } [star_from_row {
231 m 1 1 n 2 2 o 1 1 x 2 2 y 1 1 z 2 2
232 }]
233
234 #-------------------------------------------------------------------------
235 #
236 do_execsql_test 6.0 {
237 CREATE TABLE iii(iii);
238 CREATE TABLE jjj(x);
239 }
240
241 do_catchsql_test 6.1 {
242 CREATE VIRTUAL TABLE vocab1 USING fts5vocab(iii, row);
243 SELECT * FROM vocab1;
244 } {1 {no such fts5 table: main.iii}}
245
246 do_catchsql_test 6.2 {
247 CREATE VIRTUAL TABLE vocab2 USING fts5vocab(jjj, row);
248 SELECT * FROM vocab2;
249 } {1 {no such fts5 table: main.jjj}}
250
251 do_catchsql_test 6.2 {
252 CREATE VIRTUAL TABLE vocab3 USING fts5vocab(lll, row);
253 SELECT * FROM vocab3;
254 } {1 {no such fts5 table: main.lll}}
255
256 #-------------------------------------------------------------------------
257 # Test single term queries on fts5vocab tables (i.e. those with term=?
258 # constraints in the WHERE clause).
259 #
260 do_execsql_test 7.0 {
261 CREATE VIRTUAL TABLE tx USING fts5(one, two, detail=%DETAIL%);
262 INSERT INTO tx VALUES('g a ggg g a b eee', 'cc d aa ff g ee');
263 INSERT INTO tx VALUES('dd fff i a i jjj', 'f fff hh jj e f');
264 INSERT INTO tx VALUES('ggg a f f fff dd aa', 'd ggg f f j gg ddd');
265 INSERT INTO tx VALUES('e bb h jjj ii gg', 'e aa e f c fff');
266 INSERT INTO tx VALUES('j ff aa a h', 'h a j bbb bb');
267 INSERT INTO tx VALUES('cc i ff c d f', 'dd ii fff f c cc d');
268 INSERT INTO tx VALUES('jjj g i bb cc eee', 'hhh iii aaa b bbb aaa');
269 INSERT INTO tx VALUES('hhh hhh hhh bb fff f', 'fff gg aa ii h a');
270 INSERT INTO tx VALUES('b c cc aaa iii ggg f', 'iii ff ee a ff c cc');
271 INSERT INTO tx VALUES('hhh b hhh aaa j i i', 'dd ee ee aa bbb iii');
272 INSERT INTO tx VALUES('hh dd h b g ff i', 'ccc bb cc ccc f a d');
273 INSERT INTO tx VALUES('g d b ggg jj', 'fff jj ff jj g gg ee');
274 INSERT INTO tx VALUES('g ee ggg ggg cc bb eee', 'aa j jjj bbb dd eee ff');
275 INSERT INTO tx VALUES('c jjj hh ddd dd h', 'e aaa h jjj gg');
276
277 CREATE VIRTUAL TABLE txr USING fts5vocab(tx, row);
278 CREATE VIRTUAL TABLE txc USING fts5vocab(tx, col);
279 }
280
281 proc cont {L elem} {
282 set n 0
283 foreach e $L { if {$elem==$e} {incr n} }
284 set n
285 }
286 db func cont cont
287
288 foreach {term} {
289 a aa aaa
290 b bb bbb
291 c cc ccc
292 d dd ddd
293 e ee eee
294 f ff fff
295 g gg ggg
296 h hh hhh
297 i ii iii
298 j jj jjj
299 } {
300 set resr [db eval {
301 SELECT $term,
302 sum(cont(one || ' ' || two, $term) > 0),
303 sum(cont(one || ' ' || two, $term))
304 FROM tx
305 }]
306 if {[lindex $resr 1]==0} {set resr [list]}
307
308 set r1 [db eval {
309 SELECT $term, 'one', sum(cont(one, $term)>0), sum(cont(one, $term)) FROM tx
310 }]
311 if {[lindex $r1 2]==0} {set r1 [list]}
312
313 set r2 [db eval {
314 SELECT $term, 'two', sum(cont(two, $term)>0), sum(cont(two, $term)) FROM tx
315 }]
316 if {[lindex $r2 2]==0} {set r2 [list]}
317
318 set resc [concat $r1 $r2]
319
320 set resc [star_from_col $resc]
321 set resr [star_from_row $resr]
322 if {[detail_is_none]} { set resc [row_to_col $resr] }
323 do_execsql_test 7.$term.1 {SELECT * FROM txc WHERE term=$term} $resc
324 do_execsql_test 7.$term.2 {SELECT * FROM txr WHERE term=$term} $resr
325 }
326
327 do_execsql_test 7.1 {
328 CREATE TABLE txr_c AS SELECT * FROM txr;
329 CREATE TABLE txc_c AS SELECT * FROM txc;
330 }
331
332 # Test range queries on the fts5vocab tables created above.
333 #
334 foreach {tn a b} {
335 1 a jjj
336 2 bb j
337 3 ccc ddd
338 4 dd xyz
339 5 xzy dd
340 6 h hh
341 } {
342 do_execsql_test 7.2.$tn.1 {
343 SELECT * FROM txr WHERE term>=$a
344 } [db eval {SELECT * FROM txr_c WHERE term>=$a}]
345 do_execsql_test 7.2.$tn.2 {
346 SELECT * FROM txr WHERE term<=$b
347 } [db eval {SELECT * FROM txr_c WHERE term <=$b}]
348 do_execsql_test 7.2.$tn.3 {
349 SELECT * FROM txr WHERE term>=$a AND term<=$b
350 } [db eval {SELECT * FROM txr_c WHERE term>=$a AND term <=$b}]
351
352 do_execsql_test 7.2.$tn.4 {
353 SELECT * FROM txc WHERE term>=$a
354 } [db eval {SELECT * FROM txc_c WHERE term>=$a}]
355 do_execsql_test 7.2.$tn.5 {
356 SELECT * FROM txc WHERE term<=$b
357 } [db eval {SELECT * FROM txc_c WHERE term <=$b}]
358 do_execsql_test 7.2.$tn.6 {
359 SELECT * FROM txc WHERE term>=$a AND term<=$b
360 } [db eval {SELECT * FROM txc_c WHERE term>=$a AND term <=$b}]
361
362 do_execsql_test 7.2.$tn.7 {
363 SELECT * FROM txr WHERE term>$a
364 } [db eval {SELECT * FROM txr_c WHERE term>$a}]
365 do_execsql_test 7.2.$tn.8 {
366 SELECT * FROM txr WHERE term<$b
367 } [db eval {SELECT * FROM txr_c WHERE term<$b}]
368 do_execsql_test 7.2.$tn.9 {
369 SELECT * FROM txr WHERE term>$a AND term<$b
370 } [db eval {SELECT * FROM txr_c WHERE term>$a AND term <$b}]
371
372 do_execsql_test 7.2.$tn.10 {
373 SELECT * FROM txc WHERE term>$a
374 } [db eval {SELECT * FROM txc_c WHERE term>$a}]
375 do_execsql_test 7.2.$tn.11 {
376 SELECT * FROM txc WHERE term<$b
377 } [db eval {SELECT * FROM txc_c WHERE term<$b}]
378 do_execsql_test 7.2.$tn.12 {
379 SELECT * FROM txc WHERE term>$a AND term<$b
380 } [db eval {SELECT * FROM txc_c WHERE term>$a AND term <$b}]
381 }
382
383 do_execsql_test 7.3.1 {
384 SELECT count(*) FROM txr, txr_c WHERE txr.term = txr_c.term;
385 } {30}
386
387 if {![detail_is_none]} {
388 do_execsql_test 7.3.2 {
389 SELECT count(*) FROM txc, txc_c
390 WHERE txc.term = txc_c.term AND txc.col=txc_c.col;
391 } {57}
392 }
393
394 }
395
396 #-------------------------------------------------------------------------
397 # Test the fts5vocab tables response to a specific types of corruption:
398 # where the fts5 index contains hits for columns that do not exist.
399 #
400 do_execsql_test 8.0 {
401 CREATE VIRTUAL TABLE x1 USING fts5(a, b, c, detail=%DETAIL%);
402 INSERT INTO x1 VALUES('a b c', 'd e f', 'g h i');
403 INSERT INTO x1 VALUES('g h i', 'a b c', 'd e f');
404 INSERT INTO x1 VALUES('d e f', 'g h i', 'a b c');
405 CREATE VIRTUAL TABLE x1_r USING fts5vocab(x1, row);
406 CREATE VIRTUAL TABLE x1_c USING fts5vocab(x1, col);
407 }
408
409 set resr [star_from_row {a 3 3 b 3 3 c 3 3 d 3 3 e 3 3 f 3 3 g 3 3 h 3 3 i 3 3}]
410 set resc [star_from_col {
411 a a 1 1 a b 1 1 a c 1 1 b a 1 1
412 b b 1 1 b c 1 1 c a 1 1 c b 1 1
413 c c 1 1 d a 1 1 d b 1 1 d c 1 1
414 e a 1 1 e b 1 1 e c 1 1 f a 1 1
415 f b 1 1 f c 1 1 g a 1 1 g b 1 1
416 g c 1 1 h a 1 1 h b 1 1 h c 1 1
417 i a 1 1 i b 1 1 i c 1 1
418 }]
419 if {[detail_is_none]} { set resc [row_to_col $resr] }
420
421 do_execsql_test 8.1.1 { SELECT * FROM x1_r; } $resr
422 do_execsql_test 8.1.2 { SELECT * FROM x1_c } $resc
423
424 do_execsql_test 8.2 {
425 PRAGMA writable_schema = 1;
426 UPDATE sqlite_master
427 SET sql = 'CREATE VIRTUAL TABLE x1 USING fts5(a, detail=%DETAIL%)'
428 WHERE name = 'x1';
429 }
430 db close
431 sqlite3 db test.db
432 sqlite3_fts5_may_be_corrupt 1
433
434 do_execsql_test 8.2.1 { SELECT * FROM x1_r } $resr
435
436 if {[detail_is_none]} {
437 do_execsql_test 8.2.2 { SELECT * FROM x1_c } $resc
438 } else {
439 do_catchsql_test 8.2.2 {
440 SELECT * FROM x1_c
441 } {1 {database disk image is malformed}}
442 }
443
444 sqlite3_fts5_may_be_corrupt 0
445 }
446
447 #-------------------------------------------------------------------------
448 # Test that both "ORDER BY term" and "ORDER BY term DESC" work.
449 #
450 reset_db
451 do_execsql_test 9.1 {
452 CREATE VIRTUAL TABLE x1 USING fts5(x);
453 INSERT INTO x1 VALUES('def ABC ghi');
454 INSERT INTO x1 VALUES('DEF abc GHI');
455 }
456
457 do_execsql_test 9.2 {
458 CREATE VIRTUAL TABLE rrr USING fts5vocab(x1, row);
459 SELECT * FROM rrr
460 } {
461 abc 2 2 def 2 2 ghi 2 2
462 }
463 do_execsql_test 9.3 {
464 SELECT * FROM rrr ORDER BY term ASC
465 } {
466 abc 2 2 def 2 2 ghi 2 2
467 }
468 do_execsql_test 9.4 {
469 SELECT * FROM rrr ORDER BY term DESC
470 } {
471 ghi 2 2 def 2 2 abc 2 2
472 }
473 do_test 9.5 {
474 set e2 [db eval { EXPLAIN SELECT * FROM rrr ORDER BY term ASC }]
475 expr [lsearch $e2 SorterSort]<0
476 } 1
477 do_test 9.6 {
478 set e2 [db eval { EXPLAIN SELECT * FROM rrr ORDER BY term DESC }]
479 expr [lsearch $e2 SorterSort]<0
480 } 0
481
482
483
484 finish_test
485
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698