OLD | NEW |
1 # 2010 November 02 | 1 # 2010 November 02 |
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 # This file implements regression tests for the FTS3 module. The focus | 11 # This file implements regression tests for the FTS3 module. The focus |
12 # of this file is tables created with the "matchinfo=fts3" option. | 12 # of this file is tables created with the "matchinfo=fts3" option. |
13 # | 13 # |
14 | 14 |
15 set testdir [file dirname $argv0] | 15 set testdir [file dirname $argv0] |
16 source $testdir/tester.tcl | 16 source $testdir/tester.tcl |
17 | 17 |
18 # If SQLITE_ENABLE_FTS3 is not defined, omit this file. | 18 # If SQLITE_ENABLE_FTS3 is not defined, omit this file. |
19 ifcapable !fts3 { finish_test ; return } | 19 ifcapable !fts3 { finish_test ; return } |
20 | 20 |
21 set testprefix fts3matchinfo | 21 set testprefix fts3matchinfo |
| 22 set sqlite_fts3_enable_parentheses 0 |
22 | 23 |
23 proc mit {blob} { | 24 proc mit {blob} { |
24 set scan(littleEndian) i* | 25 set scan(littleEndian) i* |
25 set scan(bigEndian) I* | 26 set scan(bigEndian) I* |
26 binary scan $blob $scan($::tcl_platform(byteOrder)) r | 27 binary scan $blob $scan($::tcl_platform(byteOrder)) r |
27 return $r | 28 return $r |
28 } | 29 } |
29 db func mit mit | 30 db func mit mit |
30 | 31 |
31 do_execsql_test 1.0 { | 32 do_execsql_test 1.0 { |
(...skipping 18 matching lines...) Expand all Loading... |
50 } {{1 1 1 2 2} {1 1 1 2 2}} | 51 } {{1 1 1 2 2} {1 1 1 2 2}} |
51 | 52 |
52 # Test some syntax-error handling. | 53 # Test some syntax-error handling. |
53 # | 54 # |
54 do_catchsql_test 2.0 { | 55 do_catchsql_test 2.0 { |
55 CREATE VIRTUAL TABLE x1 USING fts4(matchinfo=fs3); | 56 CREATE VIRTUAL TABLE x1 USING fts4(matchinfo=fs3); |
56 } {1 {unrecognized matchinfo: fs3}} | 57 } {1 {unrecognized matchinfo: fs3}} |
57 do_catchsql_test 2.1 { | 58 do_catchsql_test 2.1 { |
58 CREATE VIRTUAL TABLE x2 USING fts4(mtchinfo=fts3); | 59 CREATE VIRTUAL TABLE x2 USING fts4(mtchinfo=fts3); |
59 } {1 {unrecognized parameter: mtchinfo=fts3}} | 60 } {1 {unrecognized parameter: mtchinfo=fts3}} |
| 61 do_catchsql_test 2.2 { |
| 62 CREATE VIRTUAL TABLE x2 USING fts4(matchinfo=fts5); |
| 63 } {1 {unrecognized matchinfo: fts5}} |
60 | 64 |
61 # Check that with fts3, the "=" character is permitted in column definitions. | 65 # Check that with fts3, the "=" character is permitted in column definitions. |
62 # | 66 # |
63 do_execsql_test 3.1 { | 67 do_execsql_test 3.1 { |
64 CREATE VIRTUAL TABLE t3 USING fts3(mtchinfo=fts3); | 68 CREATE VIRTUAL TABLE t3 USING fts3(mtchinfo=fts3); |
65 INSERT INTO t3(mtchinfo) VALUES('Beside the lake, beneath the trees'); | 69 INSERT INTO t3(mtchinfo) VALUES('Beside the lake, beneath the trees'); |
66 SELECT mtchinfo FROM t3; | 70 SELECT mtchinfo FROM t3; |
67 } {{Beside the lake, beneath the trees}} | 71 } {{Beside the lake, beneath the trees}} |
68 | 72 |
69 do_execsql_test 3.2 { | 73 do_execsql_test 3.2 { |
70 CREATE VIRTUAL TABLE xx USING FTS4; | 74 CREATE VIRTUAL TABLE xx USING FTS4; |
| 75 } |
| 76 do_execsql_test 3.3 { |
71 SELECT * FROM xx WHERE xx MATCH 'abc'; | 77 SELECT * FROM xx WHERE xx MATCH 'abc'; |
| 78 } |
| 79 do_execsql_test 3.4 { |
72 SELECT * FROM xx WHERE xx MATCH 'a b c'; | 80 SELECT * FROM xx WHERE xx MATCH 'a b c'; |
73 } | 81 } |
74 | 82 |
75 | 83 |
76 #-------------------------------------------------------------------------- | 84 #-------------------------------------------------------------------------- |
77 # Proc [do_matchinfo_test] is used to test the FTSX matchinfo() function. | 85 # Proc [do_matchinfo_test] is used to test the FTSX matchinfo() function. |
78 # | 86 # |
79 # The first argument - $tn - is a test identifier. This may be either a | 87 # The first argument - $tn - is a test identifier. This may be either a |
80 # full identifier (i.e. "fts3matchinfo-1.1") or, if global var $testprefix | 88 # full identifier (i.e. "fts3matchinfo-1.1") or, if global var $testprefix |
81 # is set, just the numeric component (i.e. "1.1"). | 89 # is set, just the numeric component (i.e. "1.1"). |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 s {{0 1} {1 0}} | 221 s {{0 1} {1 0}} |
214 | 222 |
215 xxxxxxxxxxxxxxxxxx - pcx - xpc - ccc - pppxpcpcx - laxnpc - | 223 xxxxxxxxxxxxxxxxxx - pcx - xpc - ccc - pppxpcpcx - laxnpc - |
216 sxsxs - | 224 sxsxs - |
217 } | 225 } |
218 | 226 |
219 do_matchinfo_test 4.1.3 t4 {t4 MATCH 'a b'} { s {{2 0} {0 2}} } | 227 do_matchinfo_test 4.1.3 t4 {t4 MATCH 'a b'} { s {{2 0} {0 2}} } |
220 do_matchinfo_test 4.1.4 t4 {t4 MATCH '"a b" c'} { s {{2 0} {0 2}} } | 228 do_matchinfo_test 4.1.4 t4 {t4 MATCH '"a b" c'} { s {{2 0} {0 2}} } |
221 do_matchinfo_test 4.1.5 t4 {t4 MATCH 'a "b c"'} { s {{2 0} {0 2}} } | 229 do_matchinfo_test 4.1.5 t4 {t4 MATCH 'a "b c"'} { s {{2 0} {0 2}} } |
222 do_matchinfo_test 4.1.6 t4 {t4 MATCH 'd d'} { s {{1 0} {0 1}} } | 230 do_matchinfo_test 4.1.6 t4 {t4 MATCH 'd d'} { s {{1 0} {0 1}} } |
| 231 do_matchinfo_test 4.1.7 t4 {t4 MATCH 'f OR abcd'} { |
| 232 x { |
| 233 {0 1 1 1 1 1 0 0 0 0 0 0} |
| 234 {1 1 1 0 1 1 0 0 0 0 0 0} |
| 235 } |
| 236 } |
| 237 do_matchinfo_test 4.1.8 t4 {t4 MATCH 'f -abcd'} { |
| 238 x { |
| 239 {0 1 1 1 1 1} |
| 240 {1 1 1 0 1 1} |
| 241 } |
| 242 } |
223 | 243 |
224 do_execsql_test 4.2.0 { | 244 do_execsql_test 4.2.0 { |
225 CREATE VIRTUAL TABLE t5 USING fts4; | 245 CREATE VIRTUAL TABLE t5 USING fts4; |
226 INSERT INTO t5 VALUES('a a a a a'); | 246 INSERT INTO t5 VALUES('a a a a a'); |
227 INSERT INTO t5 VALUES('a b a b a'); | 247 INSERT INTO t5 VALUES('a b a b a'); |
228 INSERT INTO t5 VALUES('c b c b c'); | 248 INSERT INTO t5 VALUES('c b c b c'); |
229 INSERT INTO t5 VALUES('x x x x x'); | 249 INSERT INTO t5 VALUES('x x x x x'); |
230 } | 250 } |
231 do_matchinfo_test 4.2.1 t5 {t5 MATCH 'a a'} { | 251 do_matchinfo_test 4.2.1 t5 {t5 MATCH 'a a'} { |
232 x {{5 8 2 5 8 2} {3 8 2 3 8 2}} | 252 x {{5 8 2 5 8 2} {3 8 2 3 8 2}} |
233 s {2 1} | 253 s {2 1} |
234 } | 254 } |
235 do_matchinfo_test 4.2.2 t5 {t5 MATCH 'a b'} { s {2} } | 255 do_matchinfo_test 4.2.2 t5 {t5 MATCH 'a b'} { s {2} } |
236 do_matchinfo_test 4.2.3 t5 {t5 MATCH 'a b a'} { s {3} } | 256 do_matchinfo_test 4.2.3 t5 {t5 MATCH 'a b a'} { s {3} } |
237 do_matchinfo_test 4.2.4 t5 {t5 MATCH 'a a a'} { s {3 1} } | 257 do_matchinfo_test 4.2.4 t5 {t5 MATCH 'a a a'} { s {3 1} } |
238 do_matchinfo_test 4.2.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } | 258 do_matchinfo_test 4.2.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } |
239 do_matchinfo_test 4.2.6 t5 {t5 MATCH 'a OR b'} { s {1 2 1} } | 259 do_matchinfo_test 4.2.6 t5 {t5 MATCH 'a OR b'} { s {1 2 1} } |
240 | 260 |
241 do_execsql_test 4.3.0 "INSERT INTO t5 VALUES('x y [string repeat {b } 50000]')"; | 261 do_execsql_test 4.3.0 "INSERT INTO t5 VALUES('x y [string repeat {b } 50000]')"; |
242 | 262 |
243 do_matchinfo_test 4.3.1 t5 {t5 MATCH 'a a'} { | 263 # It used to be that the second 'a' token would be deferred. That doesn't |
244 x {{5 8 2 5 5 5} {3 8 2 3 5 5}} | 264 # work any longer. |
245 s {2 1} | 265 if 0 { |
| 266 do_matchinfo_test 4.3.1 t5 {t5 MATCH 'a a'} { |
| 267 x {{5 8 2 5 5 5} {3 8 2 3 5 5}} |
| 268 s {2 1} |
| 269 } |
246 } | 270 } |
247 | 271 |
248 do_matchinfo_test 4.3.2 t5 {t5 MATCH 'a b'} { s {2} } | 272 do_matchinfo_test 4.3.2 t5 {t5 MATCH 'a b'} { s {2} } |
249 do_matchinfo_test 4.3.3 t5 {t5 MATCH 'a b a'} { s {3} } | 273 do_matchinfo_test 4.3.3 t5 {t5 MATCH 'a b a'} { s {3} } |
250 do_matchinfo_test 4.3.4 t5 {t5 MATCH 'a a a'} { s {3 1} } | 274 do_matchinfo_test 4.3.4 t5 {t5 MATCH 'a a a'} { s {3 1} } |
251 do_matchinfo_test 4.3.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } | 275 do_matchinfo_test 4.3.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } |
252 do_matchinfo_test 4.3.6 t5 {t5 MATCH 'a OR b'} { s {1 2 1 1} } | 276 do_matchinfo_test 4.3.6 t5 {t5 MATCH 'a OR b'} { s {1 2 1 1} } |
253 | 277 |
254 do_execsql_test 4.4.0 { | 278 do_execsql_test 4.4.0.1 { INSERT INTO t5(t5) VALUES('optimize') } |
255 INSERT INTO t5(t5) VALUES('optimize'); | 279 |
256 UPDATE t5_segments | 280 ifcapable fts4_deferred { |
257 SET block = zeroblob(length(block)) | 281 do_execsql_test 4.4.0.2 { |
258 WHERE length(block)>10000; | 282 UPDATE t5_segments |
| 283 SET block = zeroblob(length(block)) |
| 284 WHERE length(block)>10000; |
| 285 } |
259 } | 286 } |
260 | 287 |
261 do_matchinfo_test 4.4.2 t5 {t5 MATCH 'a b'} { s {2} } | 288 do_matchinfo_test 4.4.2 t5 {t5 MATCH 'a b'} { s {2} } |
262 do_matchinfo_test 4.4.1 t5 {t5 MATCH 'a a'} { s {2 1} } | 289 do_matchinfo_test 4.4.1 t5 {t5 MATCH 'a a'} { s {2 1} } |
263 do_matchinfo_test 4.4.2 t5 {t5 MATCH 'a b'} { s {2} } | 290 do_matchinfo_test 4.4.2 t5 {t5 MATCH 'a b'} { s {2} } |
264 do_matchinfo_test 4.4.3 t5 {t5 MATCH 'a b a'} { s {3} } | 291 do_matchinfo_test 4.4.3 t5 {t5 MATCH 'a b a'} { s {3} } |
265 do_matchinfo_test 4.4.4 t5 {t5 MATCH 'a a a'} { s {3 1} } | 292 do_matchinfo_test 4.4.4 t5 {t5 MATCH 'a a a'} { s {3 1} } |
266 do_matchinfo_test 4.4.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } | 293 do_matchinfo_test 4.4.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } |
267 | 294 |
268 do_execsql_test 4.5.0 { | 295 do_execsql_test 4.5.0 { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 do_execsql_test 8.4.2.1 { UPDATE t11_stat SET value = X'00'; } | 400 do_execsql_test 8.4.2.1 { UPDATE t11_stat SET value = X'00'; } |
374 do_catchsql_test 8.5.2.2 { | 401 do_catchsql_test 8.5.2.2 { |
375 SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' | 402 SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' |
376 } {1 {database disk image is malformed}} | 403 } {1 {database disk image is malformed}} |
377 | 404 |
378 do_execsql_test 8.4.3.1 { UPDATE t11_stat SET value = NULL; } | 405 do_execsql_test 8.4.3.1 { UPDATE t11_stat SET value = NULL; } |
379 do_catchsql_test 8.5.3.2 { | 406 do_catchsql_test 8.5.3.2 { |
380 SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' | 407 SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' |
381 } {1 {database disk image is malformed}} | 408 } {1 {database disk image is malformed}} |
382 | 409 |
| 410 #------------------------------------------------------------------------- |
| 411 do_execsql_test 8.1 { |
| 412 CREATE VIRTUAL TABLE t12 USING fts4; |
| 413 INSERT INTO t12 VALUES('a b c d'); |
| 414 SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; |
| 415 } {{0 0 0 0 0 0 1 1 1}} |
| 416 do_execsql_test 8.2 { |
| 417 INSERT INTO t12 VALUES('a d c d'); |
| 418 SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; |
| 419 } { |
| 420 {0 1 1 0 1 1 1 2 2} {1 1 1 1 1 1 1 2 2} |
| 421 } |
| 422 do_execsql_test 8.3 { |
| 423 INSERT INTO t12 VALUES('a d d a'); |
| 424 SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; |
| 425 } { |
| 426 {0 3 2 0 3 2 1 4 3} {1 3 2 1 3 2 1 4 3} {2 3 2 2 3 2 2 4 3} |
| 427 } |
| 428 |
| 429 do_execsql_test 9.1 { |
| 430 CREATE VIRTUAL TABLE ft2 USING fts4; |
| 431 INSERT INTO ft2 VALUES('a b c d e'); |
| 432 INSERT INTO ft2 VALUES('f a b c d'); |
| 433 SELECT snippet(ft2, '[', ']', '', -1, 1) FROM ft2 WHERE ft2 MATCH 'c'; |
| 434 } {{[c]} {[c]}} |
| 435 |
| 436 #--------------------------------------------------------------------------- |
| 437 # Test for a memory leak |
| 438 # |
| 439 do_execsql_test 10.1 { |
| 440 DROP TABLE t10; |
| 441 CREATE VIRTUAL TABLE t10 USING fts4(idx, value); |
| 442 INSERT INTO t10 values (1, 'one'),(2, 'two'),(3, 'three'); |
| 443 SELECT docId, t10.* |
| 444 FROM t10 |
| 445 JOIN (SELECT 1 AS idx UNION SELECT 2 UNION SELECT 3) AS x |
| 446 WHERE t10 MATCH x.idx |
| 447 AND matchinfo(t10) not null |
| 448 GROUP BY docId |
| 449 ORDER BY 1; |
| 450 } {1 1 one 2 2 two 3 3 three} |
| 451 |
| 452 |
383 finish_test | 453 finish_test |
384 | |
OLD | NEW |