Annotation of embedaddon/sqlite3/test/fts3prefix.test, revision 1.1
1.1 ! misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>