Annotation of embedaddon/sqlite3/test/fts3prefix.test, revision 1.1.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>