1# 2010 February 02 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 FTS4 module. 13# 14# 15 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19# If SQLITE_ENABLE_FTS3 is defined, omit this file. 20ifcapable !fts3 { 21 finish_test 22 return 23} 24 25# Create the fts_kjv_genesis procedure which fills and FTS3/4 table with 26# the complete text of the Book of Genesis. 27# 28source $testdir/genesis.tcl 29 30# The following is a list of queries to perform against the above 31# FTS3/FTS4 database. We will be trying these queries in various 32# configurations to ensure that they always return the same answers. 33# 34set fts4aa_queries { 35 {abraham} 36 {the king} 37 {"the king"} 38 {abraham OR joseph} 39 {ab* OR jos*} 40 {lived t*} 41 {spake hebrew} 42 {melchizedek} 43 {t* melchizedek} 44 {melchizedek t*} 45} 46unset -nocomplain fts4aa_res 47 48# Set up the baseline results 49# 50do_test fts4aa-1.0 { 51 db eval { 52 CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter); 53 } 54 fts_kjv_genesis 55 foreach q $::fts4aa_queries { 56 set r [db eval {SELECT docid FROM t1 WHERE words MATCH $q ORDER BY docid}] 57 set ::fts4aa_res($q) $r 58 } 59} {} 60 61# Legacy test cases 62# 63do_test fts4aa-1.1 { 64 db eval { 65 SELECT docid FROM t1 EXCEPT SELECT docid FROM t1_docsize 66 } 67} {} 68do_test fts4aa-1.2 { 69 db eval { 70 SELECT docid FROM t1_docsize EXCEPT SELECT docid FROM t1 71 } 72} {} 73 74proc mit {blob} { 75 set scan(littleEndian) i* 76 set scan(bigEndian) I* 77 binary scan $blob $scan($::tcl_platform(byteOrder)) r 78 return $r 79} 80db func mit mit 81 82do_test fts4aa-1.3 { 83 db eval { 84 SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1 WHERE t1 MATCH 'melchizedek'; 85 } 86} {1014018 {1 1 1 1 1 1533 25 20}} 87do_test fts4aa-1.4 { 88 db eval { 89 SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1 90 WHERE t1 MATCH 'spake hebrew' 91 ORDER BY docid; 92 } 93} {1039014 {2 1 1 40 40 1 6 6 1533 25 42} 1039017 {2 1 1 40 40 1 6 6 1533 25 26}} 94do_test fts4aa-1.5 { 95 db eval { 96 SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1 97 WHERE t1 MATCH 'laban overtook jacob' 98 ORDER BY docid; 99 } 100} {1031025 {3 1 2 54 46 1 3 3 2 181 160 1533 25 24}} 101 102do_test fts4aa-1.6 { 103 db eval { 104 DELETE FROM t1 WHERE docid!=1050026; 105 SELECT hex(size) FROM t1_docsize; 106 SELECT hex(value) FROM t1_stat; 107 } 108} {17 01176F} 109 110do_test fts4aa-1.7 { 111 db eval { 112 SELECT docid FROM t1 EXCEPT SELECT docid FROM t1_docsize 113 } 114} {} 115do_test fts4aa-1.8 { 116 db eval { 117 SELECT docid FROM t1_docsize EXCEPT SELECT docid FROM t1 118 } 119} {} 120ifcapable fts4_deferred { 121 do_test fts4aa-1.9 { 122 # Note: Token 'in' is being deferred in the following query. 123 db eval { 124 SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1 125 WHERE t1 MATCH 'joseph died in egypt' 126 ORDER BY docid; 127 } 128 } {1050026 {4 1 1 1 1 1 1 1 2 1 1 1 1 1 1 23 23}} 129} 130 131# Should get the same search results from FTS3 132# 133do_test fts4aa-2.0 { 134 db eval { 135 DROP TABLE t1; 136 CREATE VIRTUAL TABLE t1 USING fts3(words, tokenize porter); 137 } 138 fts_kjv_genesis 139} {} 140unset -nocomplain ii 141set ii 0 142foreach {q r} [array get fts4aa_res] { 143 incr ii 144 do_test fts4aa-2.$ii { 145 db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid} 146 } $r 147} 148 149# Should get the same search results when the page size is very large 150# 151do_test fts4aa-3.0 { 152 db close 153 forcedelete test.db 154 sqlite3 db test.db 155 db eval { 156 PRAGMA page_size=65536; 157 CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter); 158 } 159 fts_kjv_genesis 160} {} 161unset -nocomplain ii 162set ii 0 163foreach {q r} [array get fts4aa_res] { 164 incr ii 165 do_test fts4aa-3.$ii { 166 db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid} 167 } $r 168} 169 170# Should get the same search results when an authorizer prevents 171# all PRAGMA statements. 172# 173proc no_pragma_auth {code arg1 arg2 arg3 arg4} { 174 if {$code=="SQLITE_PRAGMA"} {return SQLITE_DENY} 175 return SQLITE_OK; 176} 177do_test fts4aa-4.0 { 178 db auth ::no_pragma_auth 179 db eval { 180 DROP TABLE t1; 181 CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter); 182 } 183 fts_kjv_genesis 184} {} 185unset -nocomplain ii 186set ii 0 187foreach {q r} [array get fts4aa_res] { 188 incr ii 189 do_test fts4aa-4.$ii { 190 db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid} 191 } $r 192} 193 194finish_test 195