OLD | NEW |
(Empty) | |
| 1 # 2011 May 04 |
| 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 FTS3 module. |
| 13 # |
| 14 |
| 15 set testdir [file dirname $argv0] |
| 16 source $testdir/tester.tcl |
| 17 set testprefix fts3prefix |
| 18 |
| 19 ifcapable !fts3 { |
| 20 finish_test |
| 21 return |
| 22 } |
| 23 |
| 24 # This proc tests that the prefixes index appears to represent the same content |
| 25 # as the terms index. |
| 26 # |
| 27 proc fts3_terms_and_prefixes {db tbl prefixlengths} { |
| 28 |
| 29 set iIndex 0 |
| 30 foreach len $prefixlengths { |
| 31 incr iIndex |
| 32 $db eval { |
| 33 DROP TABLE IF EXISTS fts3check1; |
| 34 DROP TABLE IF EXISTS fts3check2; |
| 35 } |
| 36 $db eval "CREATE VIRTUAL TABLE fts3check1 USING fts4term($tbl, 0);" |
| 37 $db eval "CREATE VIRTUAL TABLE fts3check2 USING fts4term($tbl, $iIndex);" |
| 38 |
| 39 $db eval { |
| 40 DROP TABLE IF EXISTS temp.terms; |
| 41 DROP TABLE IF EXISTS temp.prefixes; |
| 42 CREATE TEMP TABLE terms AS SELECT * FROM fts3check1; |
| 43 CREATE TEMP TABLE prefixes AS SELECT * FROM fts3check2; |
| 44 CREATE INDEX temp.idx ON prefixes(term); |
| 45 DROP TABLE fts3check1; |
| 46 DROP TABLE fts3check2; |
| 47 } |
| 48 |
| 49 set nExpect 0 |
| 50 $db eval { SELECT term, docid, col, pos FROM temp.terms } a { |
| 51 if {[string length $a(term)]<$len} continue |
| 52 incr nExpect |
| 53 set prefix [string range $a(term) 0 [expr $len-1]] |
| 54 set r [$db one { |
| 55 SELECT count(*) FROM temp.prefixes WHERE |
| 56 term = $prefix AND docid = $a(docid) AND col = $a(col) AND pos = $a(pos) |
| 57 }] |
| 58 if {$r != 1} { |
| 59 error "$t, $a(docid), $a(col), $a(pos)" |
| 60 } |
| 61 } |
| 62 |
| 63 set nCount [$db one {SELECT count(*) FROM temp.prefixes}] |
| 64 if {$nCount != $nExpect} { |
| 65 error "prefixes.count(*) is $nCount expected $nExpect" |
| 66 } |
| 67 |
| 68 execsql { DROP TABLE temp.prefixes } |
| 69 execsql { DROP TABLE temp.terms } |
| 70 |
| 71 set list [list] |
| 72 $db eval " |
| 73 SELECT sum( 1 << (16*(level%1024)) ) AS total, (level/1024) AS tree |
| 74 FROM ${tbl}_segdir GROUP BY tree |
| 75 " { |
| 76 lappend list [list $total $tree] |
| 77 } |
| 78 |
| 79 if { [lsort -integer -index 0 $list] != [lsort -integer -index 1 $list] } { |
| 80 error "inconsistent tree structures: $list" |
| 81 } |
| 82 } |
| 83 |
| 84 return "" |
| 85 } |
| 86 proc fts3_tap_test {tn db tbl lens} { |
| 87 uplevel [list do_test $tn [list fts3_terms_and_prefixes $db $tbl $lens] ""] |
| 88 } |
| 89 |
| 90 #------------------------------------------------------------------------- |
| 91 # Test cases 1.* are a sanity check. They test that the prefixes index is |
| 92 # being constructed correctly for the simplest possible case. |
| 93 # |
| 94 do_execsql_test 1.1 { |
| 95 CREATE VIRTUAL TABLE t1 USING fts4(prefix='1,3,6'); |
| 96 |
| 97 CREATE VIRTUAL TABLE p1 USING fts4term(t1, 1); |
| 98 CREATE VIRTUAL TABLE p2 USING fts4term(t1, 2); |
| 99 CREATE VIRTUAL TABLE p3 USING fts4term(t1, 3); |
| 100 CREATE VIRTUAL TABLE terms USING fts4term(t1); |
| 101 } |
| 102 do_execsql_test 1.2 { |
| 103 INSERT INTO t1 VALUES('sqlite mysql firebird'); |
| 104 } |
| 105 do_execsql_test 1.3.1 { SELECT term FROM p1 } {f m s} |
| 106 do_execsql_test 1.3.2 { SELECT term FROM p2 } {fir mys sql} |
| 107 do_execsql_test 1.3.3 { SELECT term FROM p3 } {firebi sqlite} |
| 108 do_execsql_test 1.4 { |
| 109 SELECT term FROM terms; |
| 110 } {firebird mysql sqlite} |
| 111 |
| 112 fts3_tap_test 1.5 db t1 {1 3 6} |
| 113 |
| 114 #------------------------------------------------------------------------- |
| 115 # A slightly more complicated dataset. This test also verifies that DELETE |
| 116 # operations do not corrupt the prefixes index. |
| 117 # |
| 118 do_execsql_test 2.1 { |
| 119 INSERT INTO t1 VALUES('FTS3 and FTS4 are an SQLite virtual table modules'); |
| 120 INSERT INTO t1 VALUES('that allows users to perform full-text searches on'); |
| 121 INSERT INTO t1 VALUES('a set of documents. The most common (and'); |
| 122 INSERT INTO t1 VALUES('effective) way to describe full-text searches is'); |
| 123 INSERT INTO t1 VALUES('"what Google, Yahoo and Altavista do with'); |
| 124 INSERT INTO t1 VALUES('documents placed on the World Wide Web". Users'); |
| 125 INSERT INTO t1 VALUES('input a term, or series of terms, perhaps'); |
| 126 INSERT INTO t1 VALUES('connected by a binary operator or grouped together'); |
| 127 INSERT INTO t1 VALUES('into a phrase, and the full-text query system'); |
| 128 INSERT INTO t1 VALUES('finds the set of documents that best matches those'); |
| 129 INSERT INTO t1 VALUES('terms considering the operators and groupings the'); |
| 130 INSERT INTO t1 VALUES('user has specified. This article describes the'); |
| 131 INSERT INTO t1 VALUES('deployment and usage of FTS3 and FTS4.'); |
| 132 INSERT INTO t1 VALUES('FTS1 and FTS2 are obsolete full-text search'); |
| 133 INSERT INTO t1 VALUES('modules for SQLite. There are known issues with'); |
| 134 INSERT INTO t1 VALUES('these older modules and their use should be'); |
| 135 INSERT INTO t1 VALUES('avoided. Portions of the original FTS3 code were'); |
| 136 INSERT INTO t1 VALUES('contributed to the SQLite project by Scott Hess of'); |
| 137 INSERT INTO t1 VALUES('Google. It is now developed and maintained as part'); |
| 138 INSERT INTO t1 VALUES('of SQLite. '); |
| 139 } |
| 140 fts3_tap_test 2.2 db t1 {1 3 6} |
| 141 do_execsql_test 2.3 { DELETE FROM t1 WHERE docid%2; } |
| 142 fts3_tap_test 2.4 db t1 {1 3 6} |
| 143 |
| 144 do_execsql_test 2.5 { INSERT INTO t1(t1) VALUES('optimize') } |
| 145 fts3_tap_test 2.6 db t1 {1 3 6} |
| 146 |
| 147 do_execsql_test 3.1 { |
| 148 CREATE VIRTUAL TABLE t2 USING fts4(prefix='1,2,3'); |
| 149 INSERT INTO t2 VALUES('On 12 September the wind direction turned and'); |
| 150 INSERT INTO t2 VALUES('William''s fleet sailed. A storm blew up and the'); |
| 151 INSERT INTO t2 VALUES('fleet was forced to take shelter at'); |
| 152 INSERT INTO t2 VALUES('Saint-Valery-sur-Somme and again wait for the wind'); |
| 153 INSERT INTO t2 VALUES('to change. On 27 September the Norman fleet'); |
| 154 INSERT INTO t2 VALUES('finally set sail, landing in England at Pevensey'); |
| 155 INSERT INTO t2 VALUES('Bay (Sussex) on 28 September. William then moved'); |
| 156 INSERT INTO t2 VALUES('to Hastings, a few miles to the east, where he'); |
| 157 INSERT INTO t2 VALUES('built a prefabricated wooden castle for a base of'); |
| 158 INSERT INTO t2 VALUES('operations. From there, he ravaged the hinterland'); |
| 159 INSERT INTO t2 VALUES('and waited for Harold''s return from the north.'); |
| 160 INSERT INTO t2 VALUES('On 12 September the wind direction turned and'); |
| 161 INSERT INTO t2 VALUES('William''s fleet sailed. A storm blew up and the'); |
| 162 INSERT INTO t2 VALUES('fleet was forced to take shelter at'); |
| 163 INSERT INTO t2 VALUES('Saint-Valery-sur-Somme and again wait for the wind'); |
| 164 INSERT INTO t2 VALUES('to change. On 27 September the Norman fleet'); |
| 165 INSERT INTO t2 VALUES('finally set sail, landing in England at Pevensey'); |
| 166 INSERT INTO t2 VALUES('Bay (Sussex) on 28 September. William then moved'); |
| 167 INSERT INTO t2 VALUES('to Hastings, a few miles to the east, where he'); |
| 168 INSERT INTO t2 VALUES('built a prefabricated wooden castle for a base of'); |
| 169 INSERT INTO t2 VALUES('operations. From there, he ravaged the hinterland'); |
| 170 INSERT INTO t2 VALUES('and waited for Harold''s return from the north.'); |
| 171 } |
| 172 |
| 173 fts3_tap_test 3.2 db t2 {1 2 3} |
| 174 do_execsql_test 3.3 { SELECT optimize(t2) FROM t2 LIMIT 1 } {{Index optimized}} |
| 175 fts3_tap_test 3.4 db t2 {1 2 3} |
| 176 |
| 177 |
| 178 #------------------------------------------------------------------------- |
| 179 # Simple tests for reading the prefix-index. |
| 180 # |
| 181 do_execsql_test 4.1 { |
| 182 CREATE VIRTUAL TABLE t3 USING fts4(prefix="1,4"); |
| 183 INSERT INTO t3 VALUES('one two three'); |
| 184 INSERT INTO t3 VALUES('four five six'); |
| 185 INSERT INTO t3 VALUES('seven eight nine'); |
| 186 } |
| 187 do_execsql_test 4.2 { |
| 188 SELECT * FROM t3 WHERE t3 MATCH 'f*' |
| 189 } {{four five six}} |
| 190 do_execsql_test 4.3 { |
| 191 SELECT * FROM t3 WHERE t3 MATCH 'four*' |
| 192 } {{four five six}} |
| 193 do_execsql_test 4.4 { |
| 194 SELECT * FROM t3 WHERE t3 MATCH 's*' |
| 195 } {{four five six} {seven eight nine}} |
| 196 do_execsql_test 4.5 { |
| 197 SELECT * FROM t3 WHERE t3 MATCH 'sev*' |
| 198 } {{seven eight nine}} |
| 199 do_execsql_test 4.6 { |
| 200 SELECT * FROM t3 WHERE t3 MATCH 'one*' |
| 201 } {{one two three}} |
| 202 |
| 203 #------------------------------------------------------------------------- |
| 204 # Syntax tests. |
| 205 # |
| 206 do_catchsql_test 5.1 { |
| 207 CREATE VIRTUAL TABLE t4 USING fts4(prefix="abc"); |
| 208 } {1 {error parsing prefix parameter: abc}} |
| 209 do_catchsql_test 5.2 { |
| 210 CREATE VIRTUAL TABLE t4 USING fts4(prefix=""); |
| 211 } {0 {}} |
| 212 |
| 213 finish_test |
OLD | NEW |