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#-------------------------------------------------------------------------- 243fd65192Sdan# Start of Tcl procs used by tests. 2599ebad90Sdan# 2699ebad90Sdanproc mit {blob} { 2799ebad90Sdan set scan(littleEndian) i* 2899ebad90Sdan set scan(bigEndian) I* 2999ebad90Sdan binary scan $blob $scan($::tcl_platform(byteOrder)) r 3099ebad90Sdan return $r 3199ebad90Sdan} 3299ebad90Sdandb func mit mit 3399ebad90Sdan 3499ebad90Sdanproc fix_near_expr {expr} { 3599ebad90Sdan set out [list] 3699ebad90Sdan lappend out [lindex $expr 0] 3799ebad90Sdan foreach {a b} [lrange $expr 1 end] { 3899ebad90Sdan if {[string match -nocase near $a]} { set a 10 } 3999ebad90Sdan if {[string match -nocase near/* $a]} { set a [string range $a 5 end] } 4099ebad90Sdan lappend out $a 4199ebad90Sdan lappend out $b 4299ebad90Sdan } 4399ebad90Sdan return $out 4499ebad90Sdan} 4599ebad90Sdan 463fd65192Sdanproc get_single_near_results {tbl expr arrayvar nullvar} { 473fd65192Sdan upvar $arrayvar aMatchinfo 483fd65192Sdan upvar $nullvar nullentry 493fd65192Sdan catch {array unset aMatchinfo} 5099ebad90Sdan 5199ebad90Sdan set expr [fix_near_expr $expr] 5299ebad90Sdan 5399ebad90Sdan # Calculate the expected results using [fts3_near_match]. The following 5499ebad90Sdan # loop populates the "hits" and "counts" arrays as follows: 5599ebad90Sdan # 5699ebad90Sdan # 1. For each document in the table that matches the NEAR expression, 5799ebad90Sdan # hits($docid) is set to 1. The set of docids that match the expression 5899ebad90Sdan # can therefore be found using [array names hits]. 5999ebad90Sdan # 6099ebad90Sdan # 2. For each column of each document in the table, counts($docid,$iCol) 6199ebad90Sdan # is set to the -phrasecountvar output. 6299ebad90Sdan # 6399ebad90Sdan set res [list] 6499ebad90Sdan catch { array unset hits } 6599ebad90Sdan db eval "SELECT docid, * FROM $tbl" d { 6699ebad90Sdan set iCol 0 6799ebad90Sdan foreach col [lrange $d(*) 1 end] { 6899ebad90Sdan set docid $d(docid) 6999ebad90Sdan set hit [fts3_near_match $d($col) $expr -p counts($docid,$iCol)] 7099ebad90Sdan if {$hit} { set hits($docid) 1 } 7199ebad90Sdan incr iCol 7299ebad90Sdan } 7399ebad90Sdan } 7499ebad90Sdan set nPhrase [expr ([llength $expr]+1)/2] 7599ebad90Sdan set nCol $iCol 7699ebad90Sdan 7799ebad90Sdan # This block populates the nHit and nDoc arrays. For each phrase/column 7899ebad90Sdan # in the query/table, array elements are set as follows: 7999ebad90Sdan # 8099ebad90Sdan # nHit($iPhrase,$iCol) - Total number of hits for phrase $iPhrase in 8199ebad90Sdan # column $iCol. 8299ebad90Sdan # 8399ebad90Sdan # nDoc($iPhrase,$iCol) - Number of documents with at least one hit for 8499ebad90Sdan # phrase $iPhrase in column $iCol. 8599ebad90Sdan # 8699ebad90Sdan for {set iPhrase 0} {$iPhrase < $nPhrase} {incr iPhrase} { 8799ebad90Sdan for {set iCol 0} {$iCol < $nCol} {incr iCol} { 8899ebad90Sdan set nHit($iPhrase,$iCol) 0 8999ebad90Sdan set nDoc($iPhrase,$iCol) 0 9099ebad90Sdan } 9199ebad90Sdan } 9299ebad90Sdan foreach key [array names counts] { 9399ebad90Sdan set iCol [lindex [split $key ,] 1] 9499ebad90Sdan set iPhrase 0 9599ebad90Sdan foreach c $counts($key) { 96*2f779343Sdan if {$c>0} { incr nDoc($iPhrase,$iCol) 1 } 97*2f779343Sdan incr nHit($iPhrase,$iCol) $c 9899ebad90Sdan incr iPhrase 9999ebad90Sdan } 10099ebad90Sdan } 10199ebad90Sdan 102*2f779343Sdan if {[info exists ::fts3_deferred] && [llength $expr]==1} { 103*2f779343Sdan set phrase [lindex $expr 0] 104*2f779343Sdan set rewritten [list] 105*2f779343Sdan set partial 0 106*2f779343Sdan foreach tok $phrase { 107*2f779343Sdan if {[lsearch $::fts3_deferred $tok]>=0} { 108*2f779343Sdan lappend rewritten * 109*2f779343Sdan } else { 110*2f779343Sdan lappend rewritten $tok 111*2f779343Sdan set partial 1 112*2f779343Sdan } 113*2f779343Sdan } 114*2f779343Sdan if {$partial==0} { 115*2f779343Sdan set tblsize [db one "SELECT count(*) FROM $tbl"] 116*2f779343Sdan for {set iCol 0} {$iCol < $nCol} {incr iCol} { 117*2f779343Sdan set nHit(0,$iCol) $tblsize 118*2f779343Sdan set nDoc(0,$iCol) $tblsize 119*2f779343Sdan } 120*2f779343Sdan } elseif {$rewritten != $phrase} { 121*2f779343Sdan while {[lindex $rewritten end] == "*"} { 122*2f779343Sdan set rewritten [lrange $rewritten 0 end-1] 123*2f779343Sdan } 124*2f779343Sdan while {[lindex $rewritten 0] == "*"} { 125*2f779343Sdan set rewritten [lrange $rewritten 1 end] 126*2f779343Sdan } 127*2f779343Sdan get_single_near_results $tbl [list $rewritten] aRewrite nullentry 128*2f779343Sdan foreach docid [array names hits] { 129*2f779343Sdan set aMatchinfo($docid) $aRewrite($docid) 130*2f779343Sdan } 131*2f779343Sdan return 132*2f779343Sdan } 133*2f779343Sdan } 134*2f779343Sdan 13599ebad90Sdan # Set up the aMatchinfo array. For each document, set aMatchinfo($docid) to 13699ebad90Sdan # contain the output of matchinfo('x') for the document. 13799ebad90Sdan # 13899ebad90Sdan foreach docid [array names hits] { 13999ebad90Sdan set mi [list] 14099ebad90Sdan for {set iPhrase 0} {$iPhrase<$nPhrase} {incr iPhrase} { 14199ebad90Sdan for {set iCol 0} {$iCol<$nCol} {incr iCol} { 14299ebad90Sdan lappend mi [lindex $counts($docid,$iCol) $iPhrase] 14399ebad90Sdan lappend mi $nHit($iPhrase,$iCol) 144*2f779343Sdan lappend mi $nDoc($iPhrase,$iCol) 14599ebad90Sdan } 14699ebad90Sdan } 14799ebad90Sdan set aMatchinfo($docid) $mi 14899ebad90Sdan } 14999ebad90Sdan 1503fd65192Sdan # Set up the nullentry output. 1513fd65192Sdan # 1523fd65192Sdan set nullentry [list] 1533fd65192Sdan for {set iPhrase 0} {$iPhrase<$nPhrase} {incr iPhrase} { 1543fd65192Sdan for {set iCol 0} {$iCol<$nCol} {incr iCol} { 155*2f779343Sdan lappend nullentry 0 $nHit($iPhrase,$iCol) $nDoc($iPhrase,$iCol) 1563fd65192Sdan } 1573fd65192Sdan } 1583fd65192Sdan} 1593fd65192Sdan 1603fd65192Sdan 1613fd65192Sdanproc matching_brackets {expr} { 1623fd65192Sdan if {[string range $expr 0 0]!="(" || [string range $expr end end] !=")"} { 1633fd65192Sdan return 0 1643fd65192Sdan } 1653fd65192Sdan 1663fd65192Sdan set iBracket 1 1673fd65192Sdan set nExpr [string length $expr] 1683fd65192Sdan for {set i 1} {$iBracket && $i < $nExpr} {incr i} { 1693fd65192Sdan set c [string range $expr $i $i] 1703fd65192Sdan if {$c == "("} {incr iBracket} 1713fd65192Sdan if {$c == ")"} {incr iBracket -1} 1723fd65192Sdan } 1733fd65192Sdan 1743fd65192Sdan return [expr ($iBracket==0 && $i==$nExpr)] 1753fd65192Sdan} 1763fd65192Sdan 1773fd65192Sdanproc get_near_results {tbl expr arrayvar {nullvar ""}} { 1783fd65192Sdan upvar $arrayvar aMatchinfo 1793fd65192Sdan if {$nullvar != ""} { upvar $nullvar nullentry } 1803fd65192Sdan 1813fd65192Sdan set expr [string trim $expr] 1823fd65192Sdan while { [matching_brackets $expr] } { 1833fd65192Sdan set expr [string trim [string range $expr 1 end-1]] 1843fd65192Sdan } 1853fd65192Sdan 1863fd65192Sdan set prec(NOT) 1 1873fd65192Sdan set prec(AND) 2 1883fd65192Sdan set prec(OR) 3 1893fd65192Sdan 1903fd65192Sdan set currentprec 0 1913fd65192Sdan set iBracket 0 1923fd65192Sdan set expr_length [llength $expr] 1933fd65192Sdan for {set i 0} {$i < $expr_length} {incr i} { 1943fd65192Sdan set op [lindex $expr $i] 1953fd65192Sdan if {$iBracket==0 && [info exists prec($op)] && $prec($op)>=$currentprec } { 1963fd65192Sdan set opidx $i 1973fd65192Sdan set currentprec $prec($op) 1983fd65192Sdan } else { 1993fd65192Sdan for {set j 0} {$j < [string length $op]} {incr j} { 2003fd65192Sdan set c [string range $op $j $j] 2013fd65192Sdan if {$c == "("} { incr iBracket +1 } 2023fd65192Sdan if {$c == ")"} { incr iBracket -1 } 2033fd65192Sdan } 2043fd65192Sdan } 2053fd65192Sdan } 2063fd65192Sdan if {$iBracket!=0} { error "mismatched brackets in: $expr" } 2073fd65192Sdan 2083fd65192Sdan if {[info exists opidx]==0} { 2093fd65192Sdan get_single_near_results $tbl $expr aMatchinfo nullentry 2103fd65192Sdan } else { 2113fd65192Sdan set eLeft [lrange $expr 0 [expr $opidx-1]] 2123fd65192Sdan set eRight [lrange $expr [expr $opidx+1] end] 2133fd65192Sdan 2143fd65192Sdan get_near_results $tbl $eLeft aLeft nullleft 2153fd65192Sdan get_near_results $tbl $eRight aRight nullright 2163fd65192Sdan 2173fd65192Sdan switch -- [lindex $expr $opidx] { 2183fd65192Sdan "NOT" { 2193fd65192Sdan foreach hit [array names aLeft] { 2203fd65192Sdan if {0==[info exists aRight($hit)]} { 2213fd65192Sdan set aMatchinfo($hit) $aLeft($hit) 2223fd65192Sdan } 2233fd65192Sdan } 2243fd65192Sdan set nullentry $nullleft 2253fd65192Sdan } 2263fd65192Sdan 2273fd65192Sdan "AND" { 2283fd65192Sdan foreach hit [array names aLeft] { 2293fd65192Sdan if {[info exists aRight($hit)]} { 2303fd65192Sdan set aMatchinfo($hit) [concat $aLeft($hit) $aRight($hit)] 2313fd65192Sdan } 2323fd65192Sdan } 2333fd65192Sdan set nullentry [concat $nullleft $nullright] 2343fd65192Sdan } 2353fd65192Sdan 2363fd65192Sdan "OR" { 2373fd65192Sdan foreach hit [array names aLeft] { 2383fd65192Sdan if {[info exists aRight($hit)]} { 2393fd65192Sdan set aMatchinfo($hit) [concat $aLeft($hit) $aRight($hit)] 2403fd65192Sdan unset aRight($hit) 2413fd65192Sdan } else { 2423fd65192Sdan set aMatchinfo($hit) [concat $aLeft($hit) $nullright] 2433fd65192Sdan } 2443fd65192Sdan } 2453fd65192Sdan foreach hit [array names aRight] { 2463fd65192Sdan set aMatchinfo($hit) [concat $nullleft $aRight($hit)] 2473fd65192Sdan } 2483fd65192Sdan 2493fd65192Sdan set nullentry [concat $nullleft $nullright] 2503fd65192Sdan } 2513fd65192Sdan } 2523fd65192Sdan } 2533fd65192Sdan} 2543fd65192Sdan 255*2f779343Sdanproc do_fts3query_test {tn tbl expr} { 2563fd65192Sdan 2573fd65192Sdan get_near_results $tbl $expr aMatchinfo 2583fd65192Sdan set match $expr 2593fd65192Sdan 26099ebad90Sdan set matchinfo_asc [list] 26199ebad90Sdan foreach docid [lsort -integer -incr [array names aMatchinfo]] { 26299ebad90Sdan lappend matchinfo_asc $docid $aMatchinfo($docid) 26399ebad90Sdan } 26499ebad90Sdan set matchinfo_desc [list] 26599ebad90Sdan foreach docid [lsort -integer -decr [array names aMatchinfo]] { 26699ebad90Sdan lappend matchinfo_desc $docid $aMatchinfo($docid) 26799ebad90Sdan } 26899ebad90Sdan 2693fd65192Sdan set title "(\"$match\" -> [llength [array names aMatchinfo]] rows)" 27099ebad90Sdan 27199ebad90Sdan do_execsql_test $tn$title.1 " 27299ebad90Sdan SELECT docid FROM $tbl WHERE $tbl MATCH '$match' ORDER BY docid ASC 2733fd65192Sdan " [lsort -integer -incr [array names aMatchinfo]] 27499ebad90Sdan 27599ebad90Sdan do_execsql_test $tn$title.2 " 27699ebad90Sdan SELECT docid FROM $tbl WHERE $tbl MATCH '$match' ORDER BY docid DESC 2773fd65192Sdan " [lsort -integer -decr [array names aMatchinfo]] 27899ebad90Sdan 27999ebad90Sdan do_execsql_test $tn$title.3 " 28099ebad90Sdan SELECT docid, mit(matchinfo($tbl, 'x')) FROM $tbl 28199ebad90Sdan WHERE $tbl MATCH '$match' ORDER BY docid DESC 28299ebad90Sdan " $matchinfo_desc 28399ebad90Sdan 28499ebad90Sdan do_execsql_test $tn$title.4 " 28599ebad90Sdan SELECT docid, mit(matchinfo($tbl, 'x')) FROM $tbl 28699ebad90Sdan WHERE $tbl MATCH '$match' ORDER BY docid ASC 28799ebad90Sdan " $matchinfo_asc 28899ebad90Sdan} 28999ebad90Sdan 2903fd65192Sdan 2913fd65192Sdan# End of test procs. Actual tests are below this line. 2923fd65192Sdan#-------------------------------------------------------------------------- 2933fd65192Sdan 2943fd65192Sdan#-------------------------------------------------------------------------- 2953fd65192Sdan# The following test cases - fts3auto-1.* - focus on testing the Tcl 2963fd65192Sdan# command [fts3_near_match], which is used by other tests in this file. 2973fd65192Sdan# 2983fd65192Sdanproc test_fts3_near_match {tn doc expr res} { 2993fd65192Sdan fts3_near_match $doc $expr -phrasecountvar p 3003fd65192Sdan uplevel do_test [list $tn] [list [list set {} $p]] [list $res] 3013fd65192Sdan} 3023fd65192Sdan 3033fd65192Sdantest_fts3_near_match 1.1.1 {a b c a b} a {2} 3043fd65192Sdantest_fts3_near_match 1.1.2 {a b c a b} {a 5 b 6 c} {2 2 1} 3053fd65192Sdantest_fts3_near_match 1.1.3 {a b c a b} {"a b"} {2} 3063fd65192Sdantest_fts3_near_match 1.1.4 {a b c a b} {"b c"} {1} 3073fd65192Sdantest_fts3_near_match 1.1.5 {a b c a b} {"c c"} {0} 3083fd65192Sdan 3093fd65192Sdantest_fts3_near_match 1.2.1 "a b c d e f g" {b 2 f} {0 0} 3103fd65192Sdantest_fts3_near_match 1.2.2 "a b c d e f g" {b 3 f} {1 1} 3113fd65192Sdantest_fts3_near_match 1.2.3 "a b c d e f g" {f 2 b} {0 0} 3123fd65192Sdantest_fts3_near_match 1.2.4 "a b c d e f g" {f 3 b} {1 1} 3133fd65192Sdantest_fts3_near_match 1.2.5 "a b c d e f g" {"a b" 2 "f g"} {0 0} 3143fd65192Sdantest_fts3_near_match 1.2.6 "a b c d e f g" {"a b" 3 "f g"} {1 1} 3153fd65192Sdan 3163fd65192Sdanset 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" 3173fd65192Sdantest_fts3_near_match 1.3.1 $A {"c d" 5 "i j" 1 "e f"} {0 0 0} 3183fd65192Sdantest_fts3_near_match 1.3.2 $A {"c d" 5 "i j" 2 "e f"} {1 1 1} 3193fd65192Sdan 3203fd65192Sdan#-------------------------------------------------------------------------- 3213fd65192Sdan# Test cases fts3auto-2.* run some simple tests using the 322*2f779343Sdan# [do_fts3query_test] proc. 3233fd65192Sdan# 3243fd65192Sdanforeach {tn create} { 325*2f779343Sdan 1 "fts4(a, b)" 326*2f779343Sdan 2 "fts4(a, b, order=DESC)" 327*2f779343Sdan 3 "fts4(a, b, order=ASC)" 328*2f779343Sdan 4 "fts4(a, b, prefix=1)" 329*2f779343Sdan 5 "fts4(a, b, order=DESC, prefix=1)" 330*2f779343Sdan 6 "fts4(a, b, order=ASC, prefix=1)" 3313fd65192Sdan} { 332*2f779343Sdanbreak 3333fd65192Sdan do_test 2.$tn.1 { 3343fd65192Sdan catchsql { DROP TABLE t1 } 335*2f779343Sdan execsql "CREATE VIRTUAL TABLE t1 USING $create" 33699ebad90Sdan for {set i 0} {$i<32} {incr i} { 33799ebad90Sdan set doc [list] 33899ebad90Sdan if {$i&0x01} {lappend doc one} 33999ebad90Sdan if {$i&0x02} {lappend doc two} 34099ebad90Sdan if {$i&0x04} {lappend doc three} 34199ebad90Sdan if {$i&0x08} {lappend doc four} 34299ebad90Sdan if {$i&0x10} {lappend doc five} 34399ebad90Sdan execsql { INSERT INTO t1 VALUES($doc, null) } 34499ebad90Sdan } 34599ebad90Sdan } {} 346*2f779343Sdan 3473fd65192Sdan foreach {tn2 expr} { 34899ebad90Sdan 1 {one} 34999ebad90Sdan 2 {one NEAR/1 five} 35099ebad90Sdan 3 {t*} 35199ebad90Sdan 4 {t* NEAR/0 five} 35299ebad90Sdan 5 {o* NEAR/1 f*} 35399ebad90Sdan 6 {one NEAR five NEAR two NEAR four NEAR three} 3543fd65192Sdan 7 {one NEAR xyz} 3553fd65192Sdan 8 {one OR two} 3563fd65192Sdan 9 {one AND two} 3573fd65192Sdan 10 {one NOT two} 3583fd65192Sdan 11 {one AND two OR three} 3593fd65192Sdan 12 {three OR one AND two} 3603fd65192Sdan 13 {(three OR one) AND two} 3613fd65192Sdan 14 {(three OR one) AND two NOT (five NOT four)} 3623fd65192Sdan 15 {"one two"} 3633fd65192Sdan 16 {"one two" NOT "three four"} 36499ebad90Sdan } { 365*2f779343Sdan do_fts3query_test 2.$tn.2.$tn2 t1 $expr 366*2f779343Sdan } 367*2f779343Sdan} 368*2f779343Sdan 369*2f779343Sdan#-------------------------------------------------------------------------- 370*2f779343Sdan# Some test cases involving deferred tokens. 371*2f779343Sdan# 372*2f779343Sdanproc make_token_deferrable {tbl token} { 373*2f779343Sdan set nRow [db one "SELECT count(*) FROM $tbl"] 374*2f779343Sdan set pgsz [db one "PRAGMA page_size"] 375*2f779343Sdan 376*2f779343Sdan execsql "INSERT INTO $tbl ($tbl) VALUES('maxpending=100000000')" 377*2f779343Sdan execsql BEGIN 378*2f779343Sdan for {set i 0} {$i < ($nRow * $pgsz * 1.2)/100} {incr i} { 379*2f779343Sdan set doc [string repeat "$token " 100] 380*2f779343Sdan execsql "INSERT INTO $tbl VALUES(\$doc)" 381*2f779343Sdan } 382*2f779343Sdan execsql "INSERT INTO $tbl VALUES('aaaaaaa ${token}aaaaa')" 383*2f779343Sdan execsql COMMIT 384*2f779343Sdan} 385*2f779343Sdan 386*2f779343Sdanforeach {tn create} { 387*2f779343Sdan 1 "fts4(x)" 388*2f779343Sdan 2 "fts4(x, order=DESC)" 389*2f779343Sdan} { 390*2f779343Sdan catchsql { DROP TABLE t1 } 391*2f779343Sdan execsql "CREATE VIRTUAL TABLE t1 USING $create" 392*2f779343Sdan do_execsql_test 3.$tn.1 { 393*2f779343Sdan INSERT INTO t1 VALUES('a b c d e f g h i j k'); 394*2f779343Sdan INSERT INTO t1 VALUES('b c d e f g h i j k a'); 395*2f779343Sdan INSERT INTO t1 VALUES('c d e f g h i j k a b'); 396*2f779343Sdan INSERT INTO t1 VALUES('d e f g h i j k a b c'); 397*2f779343Sdan INSERT INTO t1 VALUES('e f g h i j k a b c d'); 398*2f779343Sdan INSERT INTO t1 VALUES('f g h i j k a b c d e'); 399*2f779343Sdan INSERT INTO t1 VALUES('a c e g i k'); 400*2f779343Sdan INSERT INTO t1 VALUES('a d g j'); 401*2f779343Sdan INSERT INTO t1 VALUES('c a b'); 402*2f779343Sdan } 403*2f779343Sdan 404*2f779343Sdan make_token_deferrable t1 c 405*2f779343Sdan 406*2f779343Sdan set ::fts3_deferred [list] 407*2f779343Sdan foreach {tn2 expr} { 408*2f779343Sdan 1 {a OR c} 409*2f779343Sdan } { 410*2f779343Sdan do_fts3query_test 3.$tn.2.$tn2 t1 $expr 411*2f779343Sdan } 412*2f779343Sdan 413*2f779343Sdan set ::fts3_deferred [list c] 414*2f779343Sdan execsql { 415*2f779343Sdan UPDATE t1_segments 416*2f779343Sdan SET block = zeroblob(length(block)) 417*2f779343Sdan WHERE length(block)>10000 AND 0 418*2f779343Sdan } 419*2f779343Sdan foreach {tn2 expr} { 420*2f779343Sdan 1 {a NEAR c} 421*2f779343Sdan 2 {a AND c} 422*2f779343Sdan 3 {"a c"} 423*2f779343Sdan 4 {"c a"} 424*2f779343Sdan 5 {"a c" NEAR/1 g} 425*2f779343Sdan 6 {"a c" NEAR/0 g} 426*2f779343Sdan } { 427*2f779343Sdan do_fts3query_test 3.$tn.2.$tn2 t1 $expr 4283fd65192Sdan } 42999ebad90Sdan} 43099ebad90Sdan 4313fd65192Sdanset sqlite_fts3_enable_parentheses $sfep 43299ebad90Sdanfinish_test 43399ebad90Sdan 434