| OLD | NEW |
| (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 | |
| 16 source [file join [file dirname [info script]] fts5_common.tcl] | |
| 17 set testprefix fts5ac | |
| 18 | |
| 19 # If SQLITE_ENABLE_FTS5 is defined, omit this file. | |
| 20 ifcapable !fts5 { | |
| 21 finish_test | |
| 22 return | |
| 23 } | |
| 24 | |
| 25 set data { | |
| 26 0 {p o q e z k z p n f y u z y n y} {l o o l v v k} | |
| 27 1 {p k h h p y l l h i p v n} {p p l u r i f a j g e r r x w} | |
| 28 2 {l s z j k i m p s} {l w e j t j e e i t w r o p o} | |
| 29 3 {x g y m y m h p} {k j j b r e y y a k y} | |
| 30 4 {q m a i y i z} {o w a g k x g j m w e u k} | |
| 31 5 {k o a w y b s z} {s g l m m l m g p} | |
| 32 6 {d a q i z h b l c p k j g k} {p x u j x t v c z} | |
| 33 7 {f d a g o c t i} {w f c x l d r k i j} | |
| 34 8 {y g w u b q p o m j y b p a e k} {r i d k y w o z q m a t p} | |
| 35 9 {r k o m c c j s x m x m x m q r} {y r c a q d z k n x n} | |
| 36 10 {k j q m g q a j d} {d d e z g w h c d o o g x d} | |
| 37 11 {j z u m o y q j f w e e w t r j w} {g m o r x n t n w i f g l z f} | |
| 38 12 {s y w a w d o h x m k} {c w k z b p o r a} | |
| 39 13 {u t h x e g s k n g i} {f j w g c s r} | |
| 40 14 {b f i c s u z t k} {c k q s j u i z o} | |
| 41 15 {n a f n u s w h y n s i q e w} {x g e g a s s h n} | |
| 42 16 {k s q e j n p} {t r j f t o e k k l m i} | |
| 43 17 {g d t u w r o p m n m n p h b o u} {h s w o s l j e} | |
| 44 18 {f l q y q q g e e x j r} {n b r r g e i r t x q k} | |
| 45 19 {f i r g o a w e p i l o a w} {e k r z t d g h g i b d i e m} | |
| 46 20 {l d u u f p y} {g o m m u x m g l j t t x x u} | |
| 47 21 {m c d k x i c z l} {m i a i e u h} | |
| 48 22 {w b f o c g x y j} {z d w x d f h i p} | |
| 49 23 {w u i u x t c h k i b} {b y k h b v r t g j} | |
| 50 24 {h f d j s w s b a p k} {a q y u z e y m m j q r} | |
| 51 25 {d i x y x x k i y f s d j h z p n} {l l q m e t c w g y h t s v g} | |
| 52 26 {g s q w t d k x g f m j p k y} {r m b x e l t d} | |
| 53 27 {j l s q u g y v e c l o} {m f l m m m h g x x l n c} | |
| 54 28 {c t j g v r s b z j} {l c f y d t q n} | |
| 55 29 {e x z y w i h l} {b n b x e y q e n u m} | |
| 56 30 {g y y h j b w r} {q b q f u s k c k g r} | |
| 57 31 {g u l x l b r c m z b u c} {k g t b x k x n t e z d h o} | |
| 58 32 {w g v l z f b z h p s c v h} {g e w v m h k r g w a r f q} | |
| 59 33 {c g n f u d o y o b} {e y o h x x y y i z s b h a j} | |
| 60 34 {v y h c q u u s q y x x k s q} {d n r m y k n t i r n w e} | |
| 61 35 {o u c x l e b t a} {y b a x y f z x r} | |
| 62 36 {x p h l j a a u u j h} {x o f s z m b c q p} | |
| 63 37 {k q t i c a q n m v v} {v r z e f m y o} | |
| 64 38 {r w t t t t r v v o e p g h} {l w x a g a u h y} | |
| 65 39 {o p v g v b a g o} {j t q c r b b g y z} | |
| 66 40 {f s o r o d t h q f x l} {r d b m k i f s t d l m y x j w} | |
| 67 41 {t m o t m f m f} {i p i q j v n v m b q} | |
| 68 42 {t x w a r l w d t b c o d o} {a h f h w z d n s} | |
| 69 43 {t u q c d g p q x j o l c x c} {m n t o z z j a y} | |
| 70 44 {v d i i k b f s z r v r z y} {g n q y s x x m b x c l w} | |
| 71 45 {p v v a c s z y e o l} {m v t u d k m k q b d c v z r} | |
| 72 46 {f y k l d r q w r s t r e} {h m v r r l r r t f q e x y} | |
| 73 47 {w l n l t y x} {n h s l a f c h u f l x x m v n o} | |
| 74 48 {t n v i k e b p z p d j j l i o} {i v z p g u e j s i k n h w d c} | |
| 75 49 {z v x p n l t a j c} {e j l e n c e t a d} | |
| 76 50 {w u b x u i v h a i y m m r p m s} {s r h d o g z y f f x e} | |
| 77 51 {d c c x b c a x g} {p r a j v u y} | |
| 78 52 {f w g r c o d l t u e z h i} {j l l s s b j m} | |
| 79 53 {p m t f k i x} {u v y a z g w v v m x h i} | |
| 80 54 {l c z g l o j i c d e b} {b f v y w u i b e i y} | |
| 81 55 {r h c x f x a d s} {z x y k f l r b q c v} | |
| 82 56 {v x x c y h z x b g m o q n c} {h n b i t g h a q b c o r u} | |
| 83 57 {d g l o h t b s b r} {n u e p t i m u} | |
| 84 58 {t d y e t d c w u o s w x f c h} {i o s v y b r d r} | |
| 85 59 {l b a p q n d r} {k d c c d n y q h g a o p e x} | |
| 86 60 {f r z v m p k r} {x x r i s b a g f c} | |
| 87 61 {s a z i e r f i w c n y v z t k s} {y y i r y n l s b w i e k n} | |
| 88 62 {n x p r e x q r m v i b y} {f o o z n b s r q j} | |
| 89 63 {y j s u j x o n r q t f} {f v k n v x u s o a d e f e} | |
| 90 64 {u s i l y c x q} {r k c h p c h b o s s u s p b} | |
| 91 65 {m p i o s h o} {s w h u n d m n q t y k b w c} | |
| 92 66 {l d f g m x x x o} {s w d d f b y j j h h t i y p j o} | |
| 93 67 {c b m h f n v w n h} {i r w i e x r w l z p x u g u l s} | |
| 94 68 {y a h u h i m a y q} {d d r x h e v q n z y c j} | |
| 95 69 {c x f d x o n p o b r t b l p l} {m i t k b x v f p t m l l y r o} | |
| 96 70 {u t l w w m s} {m f m o l t k o p e} | |
| 97 71 {f g q e l n d m z x q} {z s i i i m f w w f n g p e q} | |
| 98 72 {n l h a v u o d f j d e x} {v v s l f g d g r a j x i f z x} | |
| 99 73 {x v m v f i g q e w} {r y s j i k m j j e d g r n o i f} | |
| 100 74 {g d y n o h p s y q z j d w n h w} {x o d l t j i b r d o r y} | |
| 101 75 {p g b i u r b e q d v o a g w m k} {q y z s f q o h} | |
| 102 76 {u z a q u f i f f b} {b s p b a a d x r r i q f} | |
| 103 77 {w h h z t h p o a h h e e} {h w r p h k z v y f r x} | |
| 104 78 {c a r k i a p u x} {f w l p t e m l} | |
| 105 79 {q q u k o t r k z} {f b m c w p s s o z} | |
| 106 80 {t i g v y q s r x m r x z e f} {x o j w a u e y s j c b u p p r o} | |
| 107 81 {n j n h r l a r e o z w e} {v o r r j a v b} | |
| 108 82 {i f i d k w d n h} {o i d z i z l m w s b q v u} | |
| 109 83 {m d g q q b k b w f q q p p} {j m q f b y c i z k y q p l e a} | |
| 110 84 {m x o n y f g} {y c n x n q j i y c l h b r q z} | |
| 111 85 {v o z l n p c} {g n j n t b b x n c l d a g j v} | |
| 112 86 {z n a y f b t k k t d b z a v} {r p c n r u k u} | |
| 113 87 {b q t x z e c w} {q a o a l o a h i m j r} | |
| 114 88 {j f h o x x a z g b a f a m i b} {j z c z y x e x w t} | |
| 115 89 {t c t p r s u c q n} {z x l i k n f q l n t} | |
| 116 90 {w t d q j g m r f k n} {l e w f w w a l y q k i q t p c t} | |
| 117 91 {c b o k l i c b s j n m b l} {y f p q o w g} | |
| 118 92 {f y d j o q t c c q m f j s t} {f h e d y m o k} | |
| 119 93 {k x j r m a d o i z j} {r t t t f e b r x i v j v g o} | |
| 120 94 {s f e a e t i h h d q p z t q} {b k m k w h c} | |
| 121 95 {h b n j t k i h o q u} {w n g i t o k c a m y p f l x c p} | |
| 122 96 {f c x p y r b m o l m o a} {p c a q s u n n x d c f a o} | |
| 123 97 {u h h k m n k} {u b v n u a o c} | |
| 124 98 {s p e t c z d f n w f} {l s f j b l c e s h} | |
| 125 99 {r c v w i v h a t a c v c r e} {h h u m g o f b a e o} | |
| 126 } | |
| 127 | |
| 128 # Argument $expr is an FTS5 match expression designed to be executed against | |
| 129 # an FTS5 table with the following schema: | |
| 130 # | |
| 131 # CREATE VIRTUAL TABLE xy USING fts5(x, y); | |
| 132 # | |
| 133 # Assuming the table contains the same records as stored int the global | |
| 134 # $::data array (see above), this function returns a list containing one | |
| 135 # element for each match in the dataset. The elements are themselves lists | |
| 136 # formatted as follows: | |
| 137 # | |
| 138 # <rowid> {<phrase 0 matches> <phrase 1 matches>...} | |
| 139 # | |
| 140 # where each <phrase X matches> element is a list of phrase matches in the | |
| 141 # same form as returned by auxiliary scalar function fts5_test(). | |
| 142 # | |
| 143 proc matchdata {bPos expr {bAsc 1}} { | |
| 144 | |
| 145 set tclexpr [db one { | |
| 146 SELECT fts5_expr_tcl($expr, 'nearset $cols -pc ::pc', 'x', 'y') | |
| 147 }] | |
| 148 set res [list] | |
| 149 | |
| 150 #puts $tclexpr | |
| 151 foreach {id x y} $::data { | |
| 152 set cols [list $x $y] | |
| 153 set ::pc 0 | |
| 154 #set hits [lsort -command instcompare [eval $tclexpr]] | |
| 155 set hits [eval $tclexpr] | |
| 156 if {[llength $hits]>0} { | |
| 157 if {$bPos} { | |
| 158 lappend res [list $id $hits] | |
| 159 } else { | |
| 160 lappend res $id | |
| 161 } | |
| 162 } | |
| 163 } | |
| 164 | |
| 165 if {$bAsc} { | |
| 166 set res [lsort -integer -increasing -index 0 $res] | |
| 167 } else { | |
| 168 set res [lsort -integer -decreasing -index 0 $res] | |
| 169 } | |
| 170 | |
| 171 return [concat {*}$res] | |
| 172 } | |
| 173 | |
| 174 # | |
| 175 # End of test code | |
| 176 #------------------------------------------------------------------------- | |
| 177 | |
| 178 proc fts5_test_poslist {cmd} { | |
| 179 set res [list] | |
| 180 for {set i 0} {$i < [$cmd xInstCount]} {incr i} { | |
| 181 lappend res [string map {{ } .} [$cmd xInst $i]] | |
| 182 } | |
| 183 set res | |
| 184 } | |
| 185 | |
| 186 | |
| 187 foreach {tn2 sql} { | |
| 188 1 {} | |
| 189 2 {BEGIN} | |
| 190 } { | |
| 191 reset_db | |
| 192 sqlite3_fts5_create_function db fts5_test_poslist fts5_test_poslist | |
| 193 | |
| 194 do_execsql_test 1.0 { | |
| 195 CREATE VIRTUAL TABLE xx USING fts5(x,y); | |
| 196 INSERT INTO xx(xx, rank) VALUES('pgsz', 32); | |
| 197 } | |
| 198 | |
| 199 execsql $sql | |
| 200 | |
| 201 do_test $tn2.1.1 { | |
| 202 foreach {id x y} $data { | |
| 203 execsql { INSERT INTO xx(rowid, x, y) VALUES($id, $x, $y) } | |
| 204 } | |
| 205 execsql { INSERT INTO xx(xx) VALUES('integrity-check') } | |
| 206 } {} | |
| 207 | |
| 208 | |
| 209 #------------------------------------------------------------------------- | |
| 210 # Test phrase queries. | |
| 211 # | |
| 212 foreach {tn phrase} { | |
| 213 1 "o" | |
| 214 2 "b q" | |
| 215 3 "e a e" | |
| 216 4 "m d g q q b k b w f q q p p" | |
| 217 5 "l o o l v v k" | |
| 218 6 "a" | |
| 219 7 "b" | |
| 220 8 "c" | |
| 221 9 "no" | |
| 222 10 "L O O L V V K" | |
| 223 } { | |
| 224 set expr "\"$phrase\"" | |
| 225 set res [matchdata 1 $expr] | |
| 226 | |
| 227 do_execsql_test $tn2.1.2.$tn.[llength $res] { | |
| 228 SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr | |
| 229 } $res | |
| 230 } | |
| 231 | |
| 232 #------------------------------------------------------------------------- | |
| 233 # Test some AND and OR queries. | |
| 234 # | |
| 235 foreach {tn expr} { | |
| 236 1.1 "a AND b" | |
| 237 1.2 "a+b AND c" | |
| 238 1.3 "d+c AND u" | |
| 239 1.4 "d+c AND u+d" | |
| 240 | |
| 241 2.1 "a OR b" | |
| 242 2.2 "a+b OR c" | |
| 243 2.3 "d+c OR u" | |
| 244 2.4 "d+c OR u+d" | |
| 245 | |
| 246 3.1 { a AND b AND c } | |
| 247 } { | |
| 248 set res [matchdata 1 $expr] | |
| 249 do_execsql_test $tn2.2.$tn.[llength $res] { | |
| 250 SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr | |
| 251 } $res | |
| 252 } | |
| 253 | |
| 254 #------------------------------------------------------------------------- | |
| 255 # Queries on a specific column. | |
| 256 # | |
| 257 foreach {tn expr} { | |
| 258 1.1 "x:a" | |
| 259 1.2 "y:a" | |
| 260 1.3 "x:b" | |
| 261 1.4 "y:b" | |
| 262 2.1 "{x}:a" | |
| 263 2.2 "{y}:a" | |
| 264 2.3 "{x}:b" | |
| 265 2.4 "{y}:b" | |
| 266 | |
| 267 3.1 "{x y}:a" | |
| 268 3.2 "{y x}:a" | |
| 269 3.3 "{x x}:b" | |
| 270 3.4 "{y y}:b" | |
| 271 | |
| 272 4.1 {{"x" "y"}:a} | |
| 273 4.2 {{"y" x}:a} | |
| 274 4.3 {{x "x"}:b} | |
| 275 4.4 {{"y" y}:b} | |
| 276 } { | |
| 277 set res [matchdata 1 $expr] | |
| 278 do_execsql_test $tn2.3.$tn.[llength $res] { | |
| 279 SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr | |
| 280 } $res | |
| 281 } | |
| 282 | |
| 283 #------------------------------------------------------------------------- | |
| 284 # Some NEAR queries. | |
| 285 # | |
| 286 foreach {tn expr} { | |
| 287 1 "NEAR(a b)" | |
| 288 2 "NEAR(r c)" | |
| 289 2 { NEAR(r c, 5) } | |
| 290 3 { NEAR(r c, 3) } | |
| 291 4 { NEAR(r c, 2) } | |
| 292 5 { NEAR(r c, 0) } | |
| 293 6 { NEAR(a b c) } | |
| 294 7 { NEAR(a b c, 8) } | |
| 295 8 { x : NEAR(r c) } | |
| 296 9 { y : NEAR(r c) } | |
| 297 } { | |
| 298 set res [matchdata 1 $expr] | |
| 299 do_execsql_test $tn2.4.1.$tn.[llength $res] { | |
| 300 SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr | |
| 301 } $res | |
| 302 } | |
| 303 | |
| 304 do_test $tn2.4.1 { nearset {{a b c}} -- a } {0.0.0} | |
| 305 do_test $tn2.4.2 { nearset {{a b c}} -- c } {0.0.2} | |
| 306 | |
| 307 foreach {tn expr tclexpr} { | |
| 308 1 {a b} {AND [N $x -- {a}] [N $x -- {b}]} | |
| 309 } { | |
| 310 do_execsql_test $tn2.5.$tn { | |
| 311 SELECT fts5_expr_tcl($expr, 'N $x') | |
| 312 } [list $tclexpr] | |
| 313 } | |
| 314 | |
| 315 #------------------------------------------------------------------------- | |
| 316 # | |
| 317 do_execsql_test $tn2.6.integrity { | |
| 318 INSERT INTO xx(xx) VALUES('integrity-check'); | |
| 319 } | |
| 320 #db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM xx_data} {puts $r} | |
| 321 foreach {bAsc sql} { | |
| 322 1 {SELECT rowid FROM xx WHERE xx MATCH $expr} | |
| 323 0 {SELECT rowid FROM xx WHERE xx MATCH $expr ORDER BY rowid DESC} | |
| 324 } { | |
| 325 foreach {tn expr} { | |
| 326 0.1 x | |
| 327 1 { NEAR(r c) } | |
| 328 2 { NEAR(r c, 5) } | |
| 329 3 { NEAR(r c, 3) } | |
| 330 4 { NEAR(r c, 2) } | |
| 331 5 { NEAR(r c, 0) } | |
| 332 6 { NEAR(a b c) } | |
| 333 7 { NEAR(a b c, 8) } | |
| 334 8 { x : NEAR(r c) } | |
| 335 9 { y : NEAR(r c) } | |
| 336 10 { x : "r c" } | |
| 337 11 { y : "r c" } | |
| 338 12 { a AND b } | |
| 339 13 { a AND b AND c } | |
| 340 14a { a } | |
| 341 14b { a OR b } | |
| 342 15 { a OR b AND c } | |
| 343 16 { c AND b OR a } | |
| 344 17 { c AND (b OR a) } | |
| 345 18 { c NOT (b OR a) } | |
| 346 19 { c NOT b OR a AND d } | |
| 347 } { | |
| 348 set res [matchdata 0 $expr $bAsc] | |
| 349 do_execsql_test $tn2.6.$bAsc.$tn.[llength $res] $sql $res | |
| 350 } | |
| 351 } | |
| 352 } | |
| 353 | |
| 354 do_execsql_test 3.1 { | |
| 355 SELECT fts5_expr_tcl('a AND b'); | |
| 356 } {{AND [nearset -- {a}] [nearset -- {b}]}} | |
| 357 | |
| 358 finish_test | |
| 359 | |
| OLD | NEW |