Add new testcase() macros and fix a bug that was revealed when trying to
[sqlite.git] / test / fts3offsets.test
blob4a1e63aa4c0b80c24c511b39fcc7f87a5e6e9576
1 # 2010 November 02
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
16 # If SQLITE_ENABLE_FTS3 is not defined, omit this file.
17 ifcapable !fts3 { finish_test ; return }
19 set testprefix fts3offsets
20 set sqlite_fts3_enable_parentheses 1
22 proc extract {offsets text} {
23   set res ""
25   set off [list]
26   foreach {t i s n} $offsets {
27     lappend off [list $s $n]
28   }
29   set off [lsort -integer -index 0 $off]
31   set iOff 0
32   foreach e $off {
33     foreach {s n} $e {}
34     append res [string range $text $iOff $s-1]
35     append res "("
36     append res [string range $text $s [expr $s+$n-1]]
37     append res ")"
38     set iOff [expr $s+$n]
39   }
40   append res [string range $text $iOff end]
41   
42   set res
44 db func extract extract
47 do_execsql_test 1.1.0 {
48   CREATE VIRTUAL TABLE xx USING fts3(x);
49   INSERT INTO xx VALUES('A x x x B C x x');
50   INSERT INTO xx VALUES('A B C x B x x C');
51   INSERT INTO xx VALUES('A x x B C x x x');
53 do_execsql_test 1.1.1 {
54   SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)';
55 } {
56   1 {(A) x x x (B) (C) x x} 
57   2 {(A) (B) (C) x (B) x x C} 
58   3 {(A) x x (B) (C) x x x}
61 do_execsql_test 1.2 {
62   DELETE FROM xx;
63   INSERT INTO xx VALUES('A x x x B C x x');
64   INSERT INTO xx VALUES('A x x C x x x C');
65   INSERT INTO xx VALUES('A x x B C x x x');
67 do_execsql_test 1.2.1 {
68   SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)';
69 } {
70   1 {(A) x x x (B) (C) x x}
71   2 {(A) x x C x x x C} 
72   3 {(A) x x (B) (C) x x x}
75 do_execsql_test 1.3 {
76   DELETE FROM xx;
77   INSERT INTO xx(rowid, x) VALUES(1, 'A B C');
78   INSERT INTO xx(rowid, x) VALUES(2, 'A x');
79   INSERT INTO xx(rowid, x) VALUES(3, 'A B C');
80   INSERT INTO xx(rowid, x) VALUES(4, 'A B C x x x x x x x B');
81   INSERT INTO xx(rowid, x) VALUES(5, 'A x x x x x x x x x C');
82   INSERT INTO xx(rowid, x) VALUES(6, 'A x x x x x x x x x x x B');
83   INSERT INTO xx(rowid, x) VALUES(7, 'A B C');
85 do_execsql_test 1.3.1 {
86   SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)';
87 } {
88   1 {(A) (B) (C)}
89   2 {(A) x}
90   3 {(A) (B) (C)}
91   4 {(A) (B) (C) x x x x x x x B}
92   5 {(A) x x x x x x x x x C}
93   6 {(A) x x x x x x x x x x x B} 
94   7 {(A) (B) (C)}
98 do_execsql_test 1.4 {
99   DELETE FROM xx;
100   INSERT INTO xx(rowid, x) VALUES(7, 'A B C');
101   INSERT INTO xx(rowid, x) VALUES(6, 'A x');
102   INSERT INTO xx(rowid, x) VALUES(5, 'A B C');
103   INSERT INTO xx(rowid, x) VALUES(4, 'A B C x x x x x x x B');
104   INSERT INTO xx(rowid, x) VALUES(3, 'A x x x x x x x x x C');
105   INSERT INTO xx(rowid, x) VALUES(2, 'A x x x x x x x x x x x B');
106   INSERT INTO xx(rowid, x) VALUES(1, 'A B C');
108 do_execsql_test 1.4.1 {
109   SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)'
110   ORDER BY docid DESC;
111 } {
112   7 {(A) (B) (C)}
113   6 {(A) x}
114   5 {(A) (B) (C)}
115   4 {(A) (B) (C) x x x x x x x B}
116   3 {(A) x x x x x x x x x C}
117   2 {(A) x x x x x x x x x x x B} 
118   1 {(A) (B) (C)}
122 set sqlite_fts3_enable_parentheses 0
123 finish_test