OLD | NEW |
1 # 2015 Apr 24 | 1 # 2015 Apr 24 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 # The tests in this file focus on testing the fts5vocab module. | 12 # The tests in this file focus on testing the fts5vocab module. |
13 # | 13 # |
14 | 14 |
15 source [file join [file dirname [info script]] fts5_common.tcl] | 15 source [file join [file dirname [info script]] fts5_common.tcl] |
16 set testprefix fts5vocab | 16 set testprefix fts5vocab |
17 | 17 |
18 # If SQLITE_ENABLE_FTS5 is defined, omit this file. | 18 # If SQLITE_ENABLE_FTS5 is defined, omit this file. |
19 ifcapable !fts5 { | 19 ifcapable !fts5 { |
20 finish_test | 20 finish_test |
21 return | 21 return |
22 } | 22 } |
23 | 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 { |
24 | 61 |
25 do_execsql_test 1.1.1 { | 62 do_execsql_test 1.1.1 { |
26 CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1); | 63 CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1, detail=%DETAIL%); |
27 CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, 'row'); | 64 CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, 'row'); |
28 PRAGMA table_info = v1; | 65 PRAGMA table_info = v1; |
29 } { | 66 } { |
30 0 term {} 0 {} 0 | 67 0 term {} 0 {} 0 |
31 1 doc {} 0 {} 0 | 68 1 doc {} 0 {} 0 |
32 2 cnt {} 0 {} 0 | 69 2 cnt {} 0 {} 0 |
33 } | 70 } |
34 | 71 |
35 do_execsql_test 1.1.2 { | 72 do_execsql_test 1.1.2 { |
36 CREATE VIRTUAL TABLE v2 USING fts5vocab(t1, 'col'); | 73 CREATE VIRTUAL TABLE v2 USING fts5vocab(t1, 'col'); |
37 PRAGMA table_info = v2; | 74 PRAGMA table_info = v2; |
38 } { | 75 } { |
39 0 term {} 0 {} 0 | 76 0 term {} 0 {} 0 |
40 1 col {} 0 {} 0 | 77 1 col {} 0 {} 0 |
41 2 doc {} 0 {} 0 | 78 2 doc {} 0 {} 0 |
42 3 cnt {} 0 {} 0 | 79 3 cnt {} 0 {} 0 |
43 } | 80 } |
44 | 81 |
45 do_execsql_test 1.2.1 { SELECT * FROM v1 } { } | 82 do_execsql_test 1.2.1 { SELECT * FROM v1 } { } |
46 do_execsql_test 1.2.2 { SELECT * FROM v2 } { } | 83 do_execsql_test 1.2.2 { SELECT * FROM v2 } { } |
47 | 84 |
48 do_execsql_test 1.3 { | 85 do_execsql_test 1.3 { |
49 INSERT INTO t1 VALUES('x y z'); | 86 INSERT INTO t1 VALUES('x y z'); |
50 INSERT INTO t1 VALUES('x x x'); | 87 INSERT INTO t1 VALUES('x x x'); |
51 } | 88 } |
52 | 89 |
53 do_execsql_test 1.4.1 { | 90 do_execsql_test 1.4.1 { |
54 SELECT * FROM v1; | 91 SELECT * FROM v1; |
55 } {x 2 4 y 1 1 z 1 1} | 92 } [star_from_row {x 2 4 y 1 1 z 1 1}] |
56 | 93 |
57 do_execsql_test 1.4.2 { | 94 do_execsql_test 1.4.2 { |
58 SELECT * FROM v2; | 95 SELECT * FROM v2; |
59 } {x one 2 4 y one 1 1 z one 1 1} | 96 } [star_from_col {x one 2 4 y one 1 1 z one 1 1}] |
60 | 97 |
61 do_execsql_test 1.5.1 { | 98 do_execsql_test 1.5.1 { |
62 BEGIN; | 99 BEGIN; |
63 INSERT INTO t1 VALUES('a b c'); | 100 INSERT INTO t1 VALUES('a b c'); |
64 SELECT * FROM v1 WHERE term<'d'; | 101 SELECT * FROM v1 WHERE term<'d'; |
65 } {a 1 1 b 1 1 c 1 1} | 102 } [star_from_row {a 1 1 b 1 1 c 1 1}] |
66 | 103 |
67 do_execsql_test 1.5.2 { | 104 do_execsql_test 1.5.2 { |
68 SELECT * FROM v2 WHERE term<'d'; | 105 SELECT * FROM v2 WHERE term<'d'; |
69 COMMIT; | 106 COMMIT; |
70 } {a one 1 1 b one 1 1 c one 1 1} | 107 } [star_from_col {a one 1 1 b one 1 1 c one 1 1}] |
71 | 108 |
72 do_execsql_test 1.6 { | 109 do_execsql_test 1.6 { |
73 DELETE FROM t1 WHERE one = 'a b c'; | 110 DELETE FROM t1 WHERE one = 'a b c'; |
74 SELECT * FROM v1; | 111 SELECT * FROM v1; |
75 } {x 2 4 y 1 1 z 1 1} | 112 } [star_from_row {x 2 4 y 1 1 z 1 1}] |
76 | 113 |
77 #------------------------------------------------------------------------- | 114 #------------------------------------------------------------------------- |
78 # | 115 # |
79 do_execsql_test 2.0 { | 116 do_execsql_test 2.0 { |
80 CREATE VIRTUAL TABLE tt USING fts5(a, b); | 117 CREATE VIRTUAL TABLE tt USING fts5(a, b, detail=%DETAIL%); |
81 INSERT INTO tt VALUES('d g b f d f', 'f c e c d a'); | 118 INSERT INTO tt VALUES('d g b f d f', 'f c e c d a'); |
82 INSERT INTO tt VALUES('f a e a a b', 'e d c f d d'); | 119 INSERT INTO tt VALUES('f a e a a b', 'e d c f d d'); |
83 INSERT INTO tt VALUES('b c a a a b', 'f f c c b c'); | 120 INSERT INTO tt VALUES('b c a a a b', 'f f c c b c'); |
84 INSERT INTO tt VALUES('f d c a c e', 'd g d e g d'); | 121 INSERT INTO tt VALUES('f d c a c e', 'd g d e g d'); |
85 INSERT INTO tt VALUES('g d e f a g x', 'f f d a a b'); | 122 INSERT INTO tt VALUES('g d e f a g x', 'f f d a a b'); |
86 INSERT INTO tt VALUES('g c f b c g', 'a g f d c b'); | 123 INSERT INTO tt VALUES('g c f b c g', 'a g f d c b'); |
87 INSERT INTO tt VALUES('c e c f g b', 'f e d b g a'); | 124 INSERT INTO tt VALUES('c e c f g b', 'f e d b g a'); |
88 INSERT INTO tt VALUES('g d e f d e', 'a c d b a g'); | 125 INSERT INTO tt VALUES('g d e f d e', 'a c d b a g'); |
89 INSERT INTO tt VALUES('e f a c c b', 'b f e a f d y'); | 126 INSERT INTO tt VALUES('e f a c c b', 'b f e a f d y'); |
90 INSERT INTO tt VALUES('c c a a c f', 'd g a e b g'); | 127 INSERT INTO tt VALUES('c c a a c f', 'd g a e b g'); |
91 } | 128 } |
92 | 129 |
93 set res_col { | 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 { |
94 a a 6 11 a b 7 9 | 136 a a 6 11 a b 7 9 |
95 b a 6 7 b b 7 7 | 137 b a 6 7 b b 7 7 |
96 c a 6 12 c b 5 8 | 138 c a 6 12 c b 5 8 |
97 d a 4 6 d b 9 13 | 139 d a 4 6 d b 9 13 |
98 e a 6 7 e b 6 6 | 140 e a 6 7 e b 6 6 |
99 f a 9 10 f b 7 10 | 141 f a 9 10 f b 7 10 |
100 g a 5 7 g b 5 7 | 142 g a 5 7 g b 5 7 |
101 x a 1 1 y b 1 1 | 143 x a 1 1 y b 1 1 |
102 } | 144 }] |
103 set res_row { | 145 if {[detail_is_none]} { |
104 a 10 20 b 9 14 c 9 20 d 9 19 | 146 set res_col [row_to_col $res_row] |
105 e 8 13 f 10 20 g 7 14 x 1 1 | |
106 y 1 1 | |
107 } | 147 } |
108 | 148 |
109 foreach {tn tbl resname} { | 149 foreach {tn tbl resname} { |
110 1 "fts5vocab(tt, 'col')" res_col | 150 1 "fts5vocab(tt, 'col')" res_col |
111 2 "fts5vocab(tt, 'row')" res_row | 151 2 "fts5vocab(tt, 'row')" res_row |
112 3 "fts5vocab(tt, \"row\")" res_row | 152 3 "fts5vocab(tt, \"row\")" res_row |
113 4 "fts5vocab(tt, [row])" res_row | 153 4 "fts5vocab(tt, [row])" res_row |
114 5 "fts5vocab(tt, `row`)" res_row | 154 5 "fts5vocab(tt, `row`)" res_row |
115 | 155 |
116 6 "fts5vocab('tt', 'row')" res_row | 156 6 "fts5vocab('tt', 'row')" res_row |
(...skipping 29 matching lines...) Expand all Loading... |
146 CREATE VIRTUAL TABLE aux.cc USING fts5vocab(main, tbl, row); | 186 CREATE VIRTUAL TABLE aux.cc USING fts5vocab(main, tbl, row); |
147 } {1 {wrong number of vtable arguments}} | 187 } {1 {wrong number of vtable arguments}} |
148 | 188 |
149 #------------------------------------------------------------------------- | 189 #------------------------------------------------------------------------- |
150 # Test fts5vocab tables created in the temp schema. | 190 # Test fts5vocab tables created in the temp schema. |
151 # | 191 # |
152 reset_db | 192 reset_db |
153 forcedelete test.db2 | 193 forcedelete test.db2 |
154 do_execsql_test 5.0 { | 194 do_execsql_test 5.0 { |
155 ATTACH 'test.db2' AS aux; | 195 ATTACH 'test.db2' AS aux; |
156 CREATE VIRTUAL TABLE t1 USING fts5(x); | 196 CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%); |
157 CREATE VIRTUAL TABLE temp.t1 USING fts5(x); | 197 CREATE VIRTUAL TABLE temp.t1 USING fts5(x, detail=%DETAIL%); |
158 CREATE VIRTUAL TABLE aux.t1 USING fts5(x); | 198 CREATE VIRTUAL TABLE aux.t1 USING fts5(x, detail=%DETAIL%); |
159 | 199 |
160 INSERT INTO main.t1 VALUES('a b c'); | 200 INSERT INTO main.t1 VALUES('a b c'); |
161 INSERT INTO main.t1 VALUES('d e f'); | 201 INSERT INTO main.t1 VALUES('d e f'); |
162 INSERT INTO main.t1 VALUES('a e c'); | 202 INSERT INTO main.t1 VALUES('a e c'); |
163 | 203 |
164 INSERT INTO temp.t1 VALUES('1 2 3'); | 204 INSERT INTO temp.t1 VALUES('1 2 3'); |
165 INSERT INTO temp.t1 VALUES('4 5 6'); | 205 INSERT INTO temp.t1 VALUES('4 5 6'); |
166 INSERT INTO temp.t1 VALUES('1 5 3'); | 206 INSERT INTO temp.t1 VALUES('1 5 3'); |
167 | 207 |
168 INSERT INTO aux.t1 VALUES('x y z'); | 208 INSERT INTO aux.t1 VALUES('x y z'); |
169 INSERT INTO aux.t1 VALUES('m n o'); | 209 INSERT INTO aux.t1 VALUES('m n o'); |
170 INSERT INTO aux.t1 VALUES('x n z'); | 210 INSERT INTO aux.t1 VALUES('x n z'); |
171 } | 211 } |
172 | 212 |
173 breakpoint | 213 breakpoint |
174 do_execsql_test 5.1 { | 214 do_execsql_test 5.1 { |
175 CREATE VIRTUAL TABLE temp.vm USING fts5vocab(main, t1, row); | 215 CREATE VIRTUAL TABLE temp.vm USING fts5vocab(main, t1, row); |
176 CREATE VIRTUAL TABLE temp.vt1 USING fts5vocab(t1, row); | 216 CREATE VIRTUAL TABLE temp.vt1 USING fts5vocab(t1, row); |
177 CREATE VIRTUAL TABLE temp.vt2 USING fts5vocab(temp, t1, row); | 217 CREATE VIRTUAL TABLE temp.vt2 USING fts5vocab(temp, t1, row); |
178 CREATE VIRTUAL TABLE temp.va USING fts5vocab(aux, t1, row); | 218 CREATE VIRTUAL TABLE temp.va USING fts5vocab(aux, t1, row); |
179 } | 219 } |
180 | 220 |
181 do_execsql_test 5.2 { SELECT * FROM vm } { | 221 do_execsql_test 5.2 { SELECT * FROM vm } [star_from_row { |
182 a 2 2 b 1 1 c 2 2 d 1 1 e 2 2 f 1 1 | 222 a 2 2 b 1 1 c 2 2 d 1 1 e 2 2 f 1 1 |
183 } | 223 }] |
184 do_execsql_test 5.3 { SELECT * FROM vt1 } { | 224 do_execsql_test 5.3 { SELECT * FROM vt1 } [star_from_row { |
185 1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1 | 225 1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1 |
186 } | 226 }] |
187 do_execsql_test 5.4 { SELECT * FROM vt2 } { | 227 do_execsql_test 5.4 { SELECT * FROM vt2 } [star_from_row { |
188 1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1 | 228 1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1 |
189 } | 229 }] |
190 do_execsql_test 5.5 { SELECT * FROM va } { | 230 do_execsql_test 5.5 { SELECT * FROM va } [star_from_row { |
191 m 1 1 n 2 2 o 1 1 x 2 2 y 1 1 z 2 2 | 231 m 1 1 n 2 2 o 1 1 x 2 2 y 1 1 z 2 2 |
192 } | 232 }] |
193 | 233 |
194 #------------------------------------------------------------------------- | 234 #------------------------------------------------------------------------- |
195 # | 235 # |
196 do_execsql_test 6.0 { | 236 do_execsql_test 6.0 { |
197 CREATE TABLE iii(iii); | 237 CREATE TABLE iii(iii); |
198 CREATE TABLE jjj(x); | 238 CREATE TABLE jjj(x); |
199 } | 239 } |
200 | 240 |
201 do_catchsql_test 6.1 { | 241 do_catchsql_test 6.1 { |
202 CREATE VIRTUAL TABLE vocab1 USING fts5vocab(iii, row); | 242 CREATE VIRTUAL TABLE vocab1 USING fts5vocab(iii, row); |
203 SELECT * FROM vocab1; | 243 SELECT * FROM vocab1; |
204 } {1 {no such fts5 table: main.iii}} | 244 } {1 {no such fts5 table: main.iii}} |
205 | 245 |
206 do_catchsql_test 6.2 { | 246 do_catchsql_test 6.2 { |
207 CREATE VIRTUAL TABLE vocab2 USING fts5vocab(jjj, row); | 247 CREATE VIRTUAL TABLE vocab2 USING fts5vocab(jjj, row); |
208 SELECT * FROM vocab2; | 248 SELECT * FROM vocab2; |
209 } {1 {no such fts5 table: main.jjj}} | 249 } {1 {no such fts5 table: main.jjj}} |
210 | 250 |
211 do_catchsql_test 6.2 { | 251 do_catchsql_test 6.2 { |
212 CREATE VIRTUAL TABLE vocab3 USING fts5vocab(lll, row); | 252 CREATE VIRTUAL TABLE vocab3 USING fts5vocab(lll, row); |
213 SELECT * FROM vocab3; | 253 SELECT * FROM vocab3; |
214 } {1 {no such fts5 table: main.lll}} | 254 } {1 {no such fts5 table: main.lll}} |
215 | 255 |
216 #------------------------------------------------------------------------- | 256 #------------------------------------------------------------------------- |
217 # Test single term queries on fts5vocab tables (i.e. those with term=? | 257 # Test single term queries on fts5vocab tables (i.e. those with term=? |
218 # constraints in the WHERE clause). | 258 # constraints in the WHERE clause). |
219 # | 259 # |
220 do_execsql_test 7.0 { | 260 do_execsql_test 7.0 { |
221 CREATE VIRTUAL TABLE tx USING fts5(one, two); | 261 CREATE VIRTUAL TABLE tx USING fts5(one, two, detail=%DETAIL%); |
222 INSERT INTO tx VALUES('g a ggg g a b eee', 'cc d aa ff g ee'); | 262 INSERT INTO tx VALUES('g a ggg g a b eee', 'cc d aa ff g ee'); |
223 INSERT INTO tx VALUES('dd fff i a i jjj', 'f fff hh jj e f'); | 263 INSERT INTO tx VALUES('dd fff i a i jjj', 'f fff hh jj e f'); |
224 INSERT INTO tx VALUES('ggg a f f fff dd aa', 'd ggg f f j gg ddd'); | 264 INSERT INTO tx VALUES('ggg a f f fff dd aa', 'd ggg f f j gg ddd'); |
225 INSERT INTO tx VALUES('e bb h jjj ii gg', 'e aa e f c fff'); | 265 INSERT INTO tx VALUES('e bb h jjj ii gg', 'e aa e f c fff'); |
226 INSERT INTO tx VALUES('j ff aa a h', 'h a j bbb bb'); | 266 INSERT INTO tx VALUES('j ff aa a h', 'h a j bbb bb'); |
227 INSERT INTO tx VALUES('cc i ff c d f', 'dd ii fff f c cc d'); | 267 INSERT INTO tx VALUES('cc i ff c d f', 'dd ii fff f c cc d'); |
228 INSERT INTO tx VALUES('jjj g i bb cc eee', 'hhh iii aaa b bbb aaa'); | 268 INSERT INTO tx VALUES('jjj g i bb cc eee', 'hhh iii aaa b bbb aaa'); |
229 INSERT INTO tx VALUES('hhh hhh hhh bb fff f', 'fff gg aa ii h a'); | 269 INSERT INTO tx VALUES('hhh hhh hhh bb fff f', 'fff gg aa ii h a'); |
230 INSERT INTO tx VALUES('b c cc aaa iii ggg f', 'iii ff ee a ff c cc'); | 270 INSERT INTO tx VALUES('b c cc aaa iii ggg f', 'iii ff ee a ff c cc'); |
231 INSERT INTO tx VALUES('hhh b hhh aaa j i i', 'dd ee ee aa bbb iii'); | 271 INSERT INTO tx VALUES('hhh b hhh aaa j i i', 'dd ee ee aa bbb iii'); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 SELECT $term, 'one', sum(cont(one, $term)>0), sum(cont(one, $term)) FROM tx | 309 SELECT $term, 'one', sum(cont(one, $term)>0), sum(cont(one, $term)) FROM tx |
270 }] | 310 }] |
271 if {[lindex $r1 2]==0} {set r1 [list]} | 311 if {[lindex $r1 2]==0} {set r1 [list]} |
272 | 312 |
273 set r2 [db eval { | 313 set r2 [db eval { |
274 SELECT $term, 'two', sum(cont(two, $term)>0), sum(cont(two, $term)) FROM tx | 314 SELECT $term, 'two', sum(cont(two, $term)>0), sum(cont(two, $term)) FROM tx |
275 }] | 315 }] |
276 if {[lindex $r2 2]==0} {set r2 [list]} | 316 if {[lindex $r2 2]==0} {set r2 [list]} |
277 | 317 |
278 set resc [concat $r1 $r2] | 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] } |
279 do_execsql_test 7.$term.1 {SELECT * FROM txc WHERE term=$term} $resc | 323 do_execsql_test 7.$term.1 {SELECT * FROM txc WHERE term=$term} $resc |
280 do_execsql_test 7.$term.2 {SELECT * FROM txr WHERE term=$term} $resr | 324 do_execsql_test 7.$term.2 {SELECT * FROM txr WHERE term=$term} $resr |
281 } | 325 } |
282 | 326 |
283 do_execsql_test 7.1 { | 327 do_execsql_test 7.1 { |
284 CREATE TABLE txr_c AS SELECT * FROM txr; | 328 CREATE TABLE txr_c AS SELECT * FROM txr; |
285 CREATE TABLE txc_c AS SELECT * FROM txc; | 329 CREATE TABLE txc_c AS SELECT * FROM txc; |
286 } | 330 } |
287 | 331 |
288 # Test range queries on the fts5vocab tables created above. | 332 # Test range queries on the fts5vocab tables created above. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 } [db eval {SELECT * FROM txc_c WHERE term<$b}] | 377 } [db eval {SELECT * FROM txc_c WHERE term<$b}] |
334 do_execsql_test 7.2.$tn.12 { | 378 do_execsql_test 7.2.$tn.12 { |
335 SELECT * FROM txc WHERE term>$a AND term<$b | 379 SELECT * FROM txc WHERE term>$a AND term<$b |
336 } [db eval {SELECT * FROM txc_c WHERE term>$a AND term <$b}] | 380 } [db eval {SELECT * FROM txc_c WHERE term>$a AND term <$b}] |
337 } | 381 } |
338 | 382 |
339 do_execsql_test 7.3.1 { | 383 do_execsql_test 7.3.1 { |
340 SELECT count(*) FROM txr, txr_c WHERE txr.term = txr_c.term; | 384 SELECT count(*) FROM txr, txr_c WHERE txr.term = txr_c.term; |
341 } {30} | 385 } {30} |
342 | 386 |
343 do_execsql_test 7.3.2 { | 387 if {![detail_is_none]} { |
344 SELECT count(*) FROM txc, txc_c | 388 do_execsql_test 7.3.2 { |
345 WHERE txc.term = txc_c.term AND txc.col=txc_c.col; | 389 SELECT count(*) FROM txc, txc_c |
346 } {57} | 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 |
347 | 483 |
348 finish_test | 484 finish_test |
349 | 485 |
OLD | NEW |