199ebad90Sdan# 2011 June 10 299ebad90Sdan# 399ebad90Sdan# May you do good and not evil. 499ebad90Sdan# May you find forgiveness for yourself and forgive others. 599ebad90Sdan# May you share freely, never taking more than you give. 699ebad90Sdan# 799ebad90Sdan#*********************************************************************** 899ebad90Sdan# 999ebad90Sdan 1099ebad90Sdanset testdir [file dirname $argv0] 1199ebad90Sdansource $testdir/tester.tcl 1299ebad90Sdan 1399ebad90Sdan# If this build does not include FTS3, skip the tests in this file. 1499ebad90Sdan# 1599ebad90Sdanifcapable !fts3 { finish_test ; return } 1699ebad90Sdansource $testdir/fts3_common.tcl 1799ebad90Sdansource $testdir/malloc_common.tcl 1899ebad90Sdan 193fd65192Sdanset testprefix fts3auto 203fd65192Sdanset sfep $sqlite_fts3_enable_parentheses 213fd65192Sdanset sqlite_fts3_enable_parentheses 1 2299ebad90Sdan 233fd65192Sdan#-------------------------------------------------------------------------- 24*653265d9Sdan# Start of Tcl infrastructure used by tests. The entry point is 25*653265d9Sdan# [do_fts3query_test] (described below). 2699ebad90Sdan# 27*653265d9Sdan 28*653265d9Sdan# do_fts3query_test TESTNAME ?OPTIONS? TABLE MATCHEXPR 29*653265d9Sdan# 30*653265d9Sdan# This proc runs several test cases on FTS3/4 table $TABLE using match 31*653265d9Sdan# expression $MATCHEXPR. All documents in $TABLE must be formatted so that 32*653265d9Sdan# they can be "tokenized" using the Tcl list commands (llength, lindex etc.). 33*653265d9Sdan# The name and column names used by $TABLE must not require any quoting or 34*653265d9Sdan# escaping when used in SQL statements. 35*653265d9Sdan# 36*653265d9Sdan# $MATCHINFO may be any expression accepted by the FTS4 MATCH operator, 37*653265d9Sdan# except that the "<column-name>:token" syntax is not supported. Tcl list 38*653265d9Sdan# commands are used to tokenize the expression. Any parenthesis must appear 39*653265d9Sdan# either as separate list elements, or as the first (for opening) or last 40*653265d9Sdan# (for closing) character of a list element. i.e. the expression "(a OR b)c" 41*653265d9Sdan# will not be parsed correctly, but "( a OR b) c" will. 42*653265d9Sdan# 43*653265d9Sdanset sqlite_fts3_enable_parentheses 1 44*653265d9Sdanproc do_fts3query_test {tn tbl expr} { 45*653265d9Sdan 46*653265d9Sdan get_near_results $tbl $expr aMatchinfo 47*653265d9Sdan set match $expr 48*653265d9Sdan 49*653265d9Sdan set matchinfo_asc [list] 50*653265d9Sdan foreach docid [lsort -integer -incr [array names aMatchinfo]] { 51*653265d9Sdan lappend matchinfo_asc $docid $aMatchinfo($docid) 52*653265d9Sdan } 53*653265d9Sdan set matchinfo_desc [list] 54*653265d9Sdan foreach docid [lsort -integer -decr [array names aMatchinfo]] { 55*653265d9Sdan lappend matchinfo_desc $docid $aMatchinfo($docid) 56*653265d9Sdan } 57*653265d9Sdan 58*653265d9Sdan set title "(\"$match\" -> [llength [array names aMatchinfo]] rows)" 59*653265d9Sdan 60*653265d9Sdan do_execsql_test $tn$title.1 " 61*653265d9Sdan SELECT docid FROM $tbl WHERE $tbl MATCH '$match' ORDER BY docid ASC 62*653265d9Sdan " [lsort -integer -incr [array names aMatchinfo]] 63*653265d9Sdan 64*653265d9Sdan do_execsql_test $tn$title.2 " 65*653265d9Sdan SELECT docid FROM $tbl WHERE $tbl MATCH '$match' ORDER BY docid DESC 66*653265d9Sdan " [lsort -integer -decr [array names aMatchinfo]] 67*653265d9Sdan 68*653265d9Sdan do_execsql_test $tn$title.3 " 69*653265d9Sdan SELECT docid, mit(matchinfo($tbl, 'x')) FROM $tbl 70*653265d9Sdan WHERE $tbl MATCH '$match' ORDER BY docid DESC 71*653265d9Sdan " $matchinfo_desc 72*653265d9Sdan 73*653265d9Sdan do_execsql_test $tn$title.4 " 74*653265d9Sdan SELECT docid, mit(matchinfo($tbl, 'x')) FROM $tbl 75*653265d9Sdan WHERE $tbl MATCH '$match' ORDER BY docid ASC 76*653265d9Sdan " $matchinfo_asc 77*653265d9Sdan} 78*653265d9Sdan 79*653265d9Sdan 8099ebad90Sdanproc mit {blob} { 8199ebad90Sdan set scan(littleEndian) i* 8299ebad90Sdan set scan(bigEndian) I* 8399ebad90Sdan binary scan $blob $scan($::tcl_platform(byteOrder)) r 8499ebad90Sdan return $r 8599ebad90Sdan} 8699ebad90Sdandb func mit mit 8799ebad90Sdan 8899ebad90Sdanproc fix_near_expr {expr} { 8999ebad90Sdan set out [list] 9099ebad90Sdan lappend out [lindex $expr 0] 9199ebad90Sdan foreach {a b} [lrange $expr 1 end] { 9299ebad90Sdan if {[string match -nocase near $a]} { set a 10 } 9399ebad90Sdan if {[string match -nocase near/* $a]} { set a [string range $a 5 end] } 9499ebad90Sdan lappend out $a 9599ebad90Sdan lappend out $b 9699ebad90Sdan } 9799ebad90Sdan return $out 9899ebad90Sdan} 9999ebad90Sdan 1003fd65192Sdanproc get_single_near_results {tbl expr arrayvar nullvar} { 1013fd65192Sdan upvar $arrayvar aMatchinfo 1023fd65192Sdan upvar $nullvar nullentry 1033fd65192Sdan catch {array unset aMatchinfo} 10499ebad90Sdan 10599ebad90Sdan set expr [fix_near_expr $expr] 10699ebad90Sdan 10799ebad90Sdan # Calculate the expected results using [fts3_near_match]. The following 10899ebad90Sdan # loop populates the "hits" and "counts" arrays as follows: 10999ebad90Sdan # 11099ebad90Sdan # 1. For each document in the table that matches the NEAR expression, 11199ebad90Sdan # hits($docid) is set to 1. The set of docids that match the expression 11299ebad90Sdan # can therefore be found using [array names hits]. 11399ebad90Sdan # 11499ebad90Sdan # 2. For each column of each document in the table, counts($docid,$iCol) 11599ebad90Sdan # is set to the -phrasecountvar output. 11699ebad90Sdan # 11799ebad90Sdan set res [list] 11899ebad90Sdan catch { array unset hits } 11999ebad90Sdan db eval "SELECT docid, * FROM $tbl" d { 12099ebad90Sdan set iCol 0 12199ebad90Sdan foreach col [lrange $d(*) 1 end] { 12299ebad90Sdan set docid $d(docid) 12399ebad90Sdan set hit [fts3_near_match $d($col) $expr -p counts($docid,$iCol)] 12499ebad90Sdan if {$hit} { set hits($docid) 1 } 12599ebad90Sdan incr iCol 12699ebad90Sdan } 12799ebad90Sdan } 12899ebad90Sdan set nPhrase [expr ([llength $expr]+1)/2] 12999ebad90Sdan set nCol $iCol 13099ebad90Sdan 13199ebad90Sdan # This block populates the nHit and nDoc arrays. For each phrase/column 13299ebad90Sdan # in the query/table, array elements are set as follows: 13399ebad90Sdan # 13499ebad90Sdan # nHit($iPhrase,$iCol) - Total number of hits for phrase $iPhrase in 13599ebad90Sdan # column $iCol. 13699ebad90Sdan # 13799ebad90Sdan # nDoc($iPhrase,$iCol) - Number of documents with at least one hit for 13899ebad90Sdan # phrase $iPhrase in column $iCol. 13999ebad90Sdan # 14099ebad90Sdan for {set iPhrase 0} {$iPhrase < $nPhrase} {incr iPhrase} { 14199ebad90Sdan for {set iCol 0} {$iCol < $nCol} {incr iCol} { 14299ebad90Sdan set nHit($iPhrase,$iCol) 0 14399ebad90Sdan set nDoc($iPhrase,$iCol) 0 14499ebad90Sdan } 14599ebad90Sdan } 14699ebad90Sdan foreach key [array names counts] { 14799ebad90Sdan set iCol [lindex [split $key ,] 1] 14899ebad90Sdan set iPhrase 0 14999ebad90Sdan foreach c $counts($key) { 1502f779343Sdan if {$c>0} { incr nDoc($iPhrase,$iCol) 1 } 1512f779343Sdan incr nHit($iPhrase,$iCol) $c 15299ebad90Sdan incr iPhrase 15399ebad90Sdan } 15499ebad90Sdan } 15599ebad90Sdan 1562f779343Sdan if {[info exists ::fts3_deferred] && [llength $expr]==1} { 1572f779343Sdan set phrase [lindex $expr 0] 1582f779343Sdan set rewritten [list] 1592f779343Sdan set partial 0 1602f779343Sdan foreach tok $phrase { 1612f779343Sdan if {[lsearch $::fts3_deferred $tok]>=0} { 1622f779343Sdan lappend rewritten * 1632f779343Sdan } else { 1642f779343Sdan lappend rewritten $tok 1652f779343Sdan set partial 1 1662f779343Sdan } 1672f779343Sdan } 1682f779343Sdan if {$partial==0} { 1692f779343Sdan set tblsize [db one "SELECT count(*) FROM $tbl"] 1702f779343Sdan for {set iCol 0} {$iCol < $nCol} {incr iCol} { 1712f779343Sdan set nHit(0,$iCol) $tblsize 1722f779343Sdan set nDoc(0,$iCol) $tblsize 1732f779343Sdan } 1742f779343Sdan } elseif {$rewritten != $phrase} { 1752f779343Sdan while {[lindex $rewritten end] == "*"} { 1762f779343Sdan set rewritten [lrange $rewritten 0 end-1] 1772f779343Sdan } 1782f779343Sdan while {[lindex $rewritten 0] == "*"} { 1792f779343Sdan set rewritten [lrange $rewritten 1 end] 1802f779343Sdan } 1812f779343Sdan get_single_near_results $tbl [list $rewritten] aRewrite nullentry 1822f779343Sdan foreach docid [array names hits] { 1832f779343Sdan set aMatchinfo($docid) $aRewrite($docid) 1842f779343Sdan } 1852f779343Sdan return 1862f779343Sdan } 1872f779343Sdan } 1882f779343Sdan 18999ebad90Sdan # Set up the aMatchinfo array. For each document, set aMatchinfo($docid) to 19099ebad90Sdan # contain the output of matchinfo('x') for the document. 19199ebad90Sdan # 19299ebad90Sdan foreach docid [array names hits] { 19399ebad90Sdan set mi [list] 19499ebad90Sdan for {set iPhrase 0} {$iPhrase<$nPhrase} {incr iPhrase} { 19599ebad90Sdan for {set iCol 0} {$iCol<$nCol} {incr iCol} { 19699ebad90Sdan lappend mi [lindex $counts($docid,$iCol) $iPhrase] 19799ebad90Sdan lappend mi $nHit($iPhrase,$iCol) 1982f779343Sdan lappend mi $nDoc($iPhrase,$iCol) 19999ebad90Sdan } 20099ebad90Sdan } 20199ebad90Sdan set aMatchinfo($docid) $mi 20299ebad90Sdan } 20399ebad90Sdan 2043fd65192Sdan # Set up the nullentry output. 2053fd65192Sdan # 2063fd65192Sdan set nullentry [list] 2073fd65192Sdan for {set iPhrase 0} {$iPhrase<$nPhrase} {incr iPhrase} { 2083fd65192Sdan for {set iCol 0} {$iCol<$nCol} {incr iCol} { 2092f779343Sdan lappend nullentry 0 $nHit($iPhrase,$iCol) $nDoc($iPhrase,$iCol) 2103fd65192Sdan } 2113fd65192Sdan } 2123fd65192Sdan} 2133fd65192Sdan 2143fd65192Sdan 2153fd65192Sdanproc matching_brackets {expr} { 2163fd65192Sdan if {[string range $expr 0 0]!="(" || [string range $expr end end] !=")"} { 2173fd65192Sdan return 0 2183fd65192Sdan } 2193fd65192Sdan 2203fd65192Sdan set iBracket 1 2213fd65192Sdan set nExpr [string length $expr] 2223fd65192Sdan for {set i 1} {$iBracket && $i < $nExpr} {incr i} { 2233fd65192Sdan set c [string range $expr $i $i] 2243fd65192Sdan if {$c == "("} {incr iBracket} 2253fd65192Sdan if {$c == ")"} {incr iBracket -1} 2263fd65192Sdan } 2273fd65192Sdan 2283fd65192Sdan return [expr ($iBracket==0 && $i==$nExpr)] 2293fd65192Sdan} 2303fd65192Sdan 2313fd65192Sdanproc get_near_results {tbl expr arrayvar {nullvar ""}} { 2323fd65192Sdan upvar $arrayvar aMatchinfo 2333fd65192Sdan if {$nullvar != ""} { upvar $nullvar nullentry } 2343fd65192Sdan 2353fd65192Sdan set expr [string trim $expr] 2363fd65192Sdan while { [matching_brackets $expr] } { 2373fd65192Sdan set expr [string trim [string range $expr 1 end-1]] 2383fd65192Sdan } 2393fd65192Sdan 2403fd65192Sdan set prec(NOT) 1 2413fd65192Sdan set prec(AND) 2 2423fd65192Sdan set prec(OR) 3 2433fd65192Sdan 2443fd65192Sdan set currentprec 0 2453fd65192Sdan set iBracket 0 2463fd65192Sdan set expr_length [llength $expr] 2473fd65192Sdan for {set i 0} {$i < $expr_length} {incr i} { 2483fd65192Sdan set op [lindex $expr $i] 2493fd65192Sdan if {$iBracket==0 && [info exists prec($op)] && $prec($op)>=$currentprec } { 2503fd65192Sdan set opidx $i 2513fd65192Sdan set currentprec $prec($op) 2523fd65192Sdan } else { 2533fd65192Sdan for {set j 0} {$j < [string length $op]} {incr j} { 2543fd65192Sdan set c [string range $op $j $j] 2553fd65192Sdan if {$c == "("} { incr iBracket +1 } 2563fd65192Sdan if {$c == ")"} { incr iBracket -1 } 2573fd65192Sdan } 2583fd65192Sdan } 2593fd65192Sdan } 2603fd65192Sdan if {$iBracket!=0} { error "mismatched brackets in: $expr" } 2613fd65192Sdan 2623fd65192Sdan if {[info exists opidx]==0} { 2633fd65192Sdan get_single_near_results $tbl $expr aMatchinfo nullentry 2643fd65192Sdan } else { 2653fd65192Sdan set eLeft [lrange $expr 0 [expr $opidx-1]] 2663fd65192Sdan set eRight [lrange $expr [expr $opidx+1] end] 2673fd65192Sdan 2683fd65192Sdan get_near_results $tbl $eLeft aLeft nullleft 2693fd65192Sdan get_near_results $tbl $eRight aRight nullright 2703fd65192Sdan 2713fd65192Sdan switch -- [lindex $expr $opidx] { 2723fd65192Sdan "NOT" { 2733fd65192Sdan foreach hit [array names aLeft] { 2743fd65192Sdan if {0==[info exists aRight($hit)]} { 2753fd65192Sdan set aMatchinfo($hit) $aLeft($hit) 2763fd65192Sdan } 2773fd65192Sdan } 2783fd65192Sdan set nullentry $nullleft 2793fd65192Sdan } 2803fd65192Sdan 2813fd65192Sdan "AND" { 2823fd65192Sdan foreach hit [array names aLeft] { 2833fd65192Sdan if {[info exists aRight($hit)]} { 2843fd65192Sdan set aMatchinfo($hit) [concat $aLeft($hit) $aRight($hit)] 2853fd65192Sdan } 2863fd65192Sdan } 2873fd65192Sdan set nullentry [concat $nullleft $nullright] 2883fd65192Sdan } 2893fd65192Sdan 2903fd65192Sdan "OR" { 2913fd65192Sdan foreach hit [array names aLeft] { 2923fd65192Sdan if {[info exists aRight($hit)]} { 2933fd65192Sdan set aMatchinfo($hit) [concat $aLeft($hit) $aRight($hit)] 2943fd65192Sdan unset aRight($hit) 2953fd65192Sdan } else { 2963fd65192Sdan set aMatchinfo($hit) [concat $aLeft($hit) $nullright] 2973fd65192Sdan } 2983fd65192Sdan } 2993fd65192Sdan foreach hit [array names aRight] { 3003fd65192Sdan set aMatchinfo($hit) [concat $nullleft $aRight($hit)] 3013fd65192Sdan } 3023fd65192Sdan 3033fd65192Sdan set nullentry [concat $nullleft $nullright] 3043fd65192Sdan } 3053fd65192Sdan } 3063fd65192Sdan } 3073fd65192Sdan} 3083fd65192Sdan 3093fd65192Sdan 3103fd65192Sdan# End of test procs. Actual tests are below this line. 3113fd65192Sdan#-------------------------------------------------------------------------- 3123fd65192Sdan 3133fd65192Sdan#-------------------------------------------------------------------------- 3143fd65192Sdan# The following test cases - fts3auto-1.* - focus on testing the Tcl 3153fd65192Sdan# command [fts3_near_match], which is used by other tests in this file. 3163fd65192Sdan# 3173fd65192Sdanproc test_fts3_near_match {tn doc expr res} { 3183fd65192Sdan fts3_near_match $doc $expr -phrasecountvar p 3193fd65192Sdan uplevel do_test [list $tn] [list [list set {} $p]] [list $res] 3203fd65192Sdan} 3213fd65192Sdan 3223fd65192Sdantest_fts3_near_match 1.1.1 {a b c a b} a {2} 3233fd65192Sdantest_fts3_near_match 1.1.2 {a b c a b} {a 5 b 6 c} {2 2 1} 3243fd65192Sdantest_fts3_near_match 1.1.3 {a b c a b} {"a b"} {2} 3253fd65192Sdantest_fts3_near_match 1.1.4 {a b c a b} {"b c"} {1} 3263fd65192Sdantest_fts3_near_match 1.1.5 {a b c a b} {"c c"} {0} 3273fd65192Sdan 3283fd65192Sdantest_fts3_near_match 1.2.1 "a b c d e f g" {b 2 f} {0 0} 3293fd65192Sdantest_fts3_near_match 1.2.2 "a b c d e f g" {b 3 f} {1 1} 3303fd65192Sdantest_fts3_near_match 1.2.3 "a b c d e f g" {f 2 b} {0 0} 3313fd65192Sdantest_fts3_near_match 1.2.4 "a b c d e f g" {f 3 b} {1 1} 3323fd65192Sdantest_fts3_near_match 1.2.5 "a b c d e f g" {"a b" 2 "f g"} {0 0} 3333fd65192Sdantest_fts3_near_match 1.2.6 "a b c d e f g" {"a b" 3 "f g"} {1 1} 3343fd65192Sdan 3353fd65192Sdanset A "a b c d e f g h i j k l m n o p q r s t u v w x y z" 3363fd65192Sdantest_fts3_near_match 1.3.1 $A {"c d" 5 "i j" 1 "e f"} {0 0 0} 3373fd65192Sdantest_fts3_near_match 1.3.2 $A {"c d" 5 "i j" 2 "e f"} {1 1 1} 3383fd65192Sdan 3393fd65192Sdan#-------------------------------------------------------------------------- 3403fd65192Sdan# Test cases fts3auto-2.* run some simple tests using the 3412f779343Sdan# [do_fts3query_test] proc. 3423fd65192Sdan# 3433fd65192Sdanforeach {tn create} { 3442f779343Sdan 1 "fts4(a, b)" 3452f779343Sdan 2 "fts4(a, b, order=DESC)" 3462f779343Sdan 3 "fts4(a, b, order=ASC)" 3472f779343Sdan 4 "fts4(a, b, prefix=1)" 3482f779343Sdan 5 "fts4(a, b, order=DESC, prefix=1)" 3492f779343Sdan 6 "fts4(a, b, order=ASC, prefix=1)" 3503fd65192Sdan} { 3513fd65192Sdan do_test 2.$tn.1 { 3523fd65192Sdan catchsql { DROP TABLE t1 } 3532f779343Sdan execsql "CREATE VIRTUAL TABLE t1 USING $create" 35499ebad90Sdan for {set i 0} {$i<32} {incr i} { 35599ebad90Sdan set doc [list] 35699ebad90Sdan if {$i&0x01} {lappend doc one} 35799ebad90Sdan if {$i&0x02} {lappend doc two} 35899ebad90Sdan if {$i&0x04} {lappend doc three} 35999ebad90Sdan if {$i&0x08} {lappend doc four} 36099ebad90Sdan if {$i&0x10} {lappend doc five} 36199ebad90Sdan execsql { INSERT INTO t1 VALUES($doc, null) } 36299ebad90Sdan } 36399ebad90Sdan } {} 3642f779343Sdan 3653fd65192Sdan foreach {tn2 expr} { 36699ebad90Sdan 1 {one} 36799ebad90Sdan 2 {one NEAR/1 five} 36899ebad90Sdan 3 {t*} 36999ebad90Sdan 4 {t* NEAR/0 five} 37099ebad90Sdan 5 {o* NEAR/1 f*} 37199ebad90Sdan 6 {one NEAR five NEAR two NEAR four NEAR three} 3723fd65192Sdan 7 {one NEAR xyz} 3733fd65192Sdan 8 {one OR two} 3743fd65192Sdan 9 {one AND two} 3753fd65192Sdan 10 {one NOT two} 3763fd65192Sdan 11 {one AND two OR three} 3773fd65192Sdan 12 {three OR one AND two} 3783fd65192Sdan 13 {(three OR one) AND two} 3793fd65192Sdan 14 {(three OR one) AND two NOT (five NOT four)} 3803fd65192Sdan 15 {"one two"} 3813fd65192Sdan 16 {"one two" NOT "three four"} 38299ebad90Sdan } { 3832f779343Sdan do_fts3query_test 2.$tn.2.$tn2 t1 $expr 3842f779343Sdan } 3852f779343Sdan} 3862f779343Sdan 3872f779343Sdan#-------------------------------------------------------------------------- 3882f779343Sdan# Some test cases involving deferred tokens. 3892f779343Sdan# 3902f779343Sdanproc make_token_deferrable {tbl token} { 3912f779343Sdan set nRow [db one "SELECT count(*) FROM $tbl"] 3922f779343Sdan set pgsz [db one "PRAGMA page_size"] 3932f779343Sdan 3942f779343Sdan execsql "INSERT INTO $tbl ($tbl) VALUES('maxpending=100000000')" 3952f779343Sdan execsql BEGIN 3962f779343Sdan for {set i 0} {$i < ($nRow * $pgsz * 1.2)/100} {incr i} { 3972f779343Sdan set doc [string repeat "$token " 100] 3982f779343Sdan execsql "INSERT INTO $tbl VALUES(\$doc)" 3992f779343Sdan } 4002f779343Sdan execsql "INSERT INTO $tbl VALUES('aaaaaaa ${token}aaaaa')" 4012f779343Sdan execsql COMMIT 4022f779343Sdan} 4032f779343Sdan 4042f779343Sdanforeach {tn create} { 4052f779343Sdan 1 "fts4(x)" 4062f779343Sdan 2 "fts4(x, order=DESC)" 4072f779343Sdan} { 4082f779343Sdan catchsql { DROP TABLE t1 } 4092f779343Sdan execsql "CREATE VIRTUAL TABLE t1 USING $create" 4102f779343Sdan do_execsql_test 3.$tn.1 { 411*653265d9Sdan INSERT INTO t1(docid, x) VALUES(-2, 'a b c d e f g h i j k'); 412*653265d9Sdan INSERT INTO t1(docid, x) VALUES(-1, 'b c d e f g h i j k a'); 413*653265d9Sdan INSERT INTO t1(docid, x) VALUES(0, 'c d e f g h i j k a b'); 414*653265d9Sdan INSERT INTO t1(docid, x) VALUES(1, 'd e f g h i j k a b c'); 415*653265d9Sdan INSERT INTO t1(docid, x) VALUES(2, 'e f g h i j k a b c d'); 416*653265d9Sdan INSERT INTO t1(docid, x) VALUES(3, 'f g h i j k a b c d e'); 417*653265d9Sdan INSERT INTO t1(docid, x) VALUES(4, 'a c e g i k'); 418*653265d9Sdan INSERT INTO t1(docid, x) VALUES(5, 'a d g j'); 419*653265d9Sdan INSERT INTO t1(docid, x) VALUES(6, 'c a b'); 4202f779343Sdan } 4212f779343Sdan 4222f779343Sdan make_token_deferrable t1 c 4232f779343Sdan 4242f779343Sdan set ::fts3_deferred [list] 4252f779343Sdan foreach {tn2 expr} { 4262f779343Sdan 1 {a OR c} 4272f779343Sdan } { 4282f779343Sdan do_fts3query_test 3.$tn.2.$tn2 t1 $expr 4292f779343Sdan } 4302f779343Sdan 4312f779343Sdan set ::fts3_deferred [list c] 4322f779343Sdan execsql { 4332f779343Sdan UPDATE t1_segments 4342f779343Sdan SET block = zeroblob(length(block)) 4352f779343Sdan WHERE length(block)>10000 AND 0 4362f779343Sdan } 4372f779343Sdan foreach {tn2 expr} { 4382f779343Sdan 1 {a NEAR c} 4392f779343Sdan 2 {a AND c} 4402f779343Sdan 3 {"a c"} 4412f779343Sdan 4 {"c a"} 4422f779343Sdan 5 {"a c" NEAR/1 g} 4432f779343Sdan 6 {"a c" NEAR/0 g} 4442f779343Sdan } { 4452f779343Sdan do_fts3query_test 3.$tn.2.$tn2 t1 $expr 4463fd65192Sdan } 44799ebad90Sdan} 44899ebad90Sdan 4493fd65192Sdanset sqlite_fts3_enable_parentheses $sfep 45099ebad90Sdanfinish_test 45199ebad90Sdan 452