diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e057eb3825..feed5220c9 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3387,7 +3387,6 @@ void sqlite3Fts3DoclistPrev( u8 *pbEof /* OUT: End-of-file flag */ ){ char *p = *ppIter; - int iMul = (bDescIdx ? -1 : 1); assert( nDoclist>0 ); assert( *pbEof==0 ); @@ -3399,10 +3398,8 @@ void sqlite3Fts3DoclistPrev( char *pNext = 0; char *pDocid = aDoclist; char *pEnd = &aDoclist[nDoclist]; + int iMul = 1; - pDocid += sqlite3Fts3GetVarint(pDocid, &iDocid); - pNext = pDocid; - fts3PoslistCopy(0, &pDocid); while( pDocid=0} { + if {[lsearch $deferred $tok]>=0} { lappend rewritten * } else { lappend rewritten $tok @@ -178,7 +205,7 @@ proc get_single_near_results {tbl expr arrayvar nullvar} { while {[lindex $rewritten 0] == "*"} { set rewritten [lrange $rewritten 1 end] } - get_single_near_results $tbl [list $rewritten] aRewrite nullentry + get_single_near_results $tbl [list $rewritten] {} aRewrite nullentry foreach docid [array names hits] { set aMatchinfo($docid) $aRewrite($docid) } @@ -228,7 +255,7 @@ proc matching_brackets {expr} { return [expr ($iBracket==0 && $i==$nExpr)] } -proc get_near_results {tbl expr arrayvar {nullvar ""}} { +proc get_near_results {tbl expr deferred arrayvar {nullvar ""}} { upvar $arrayvar aMatchinfo if {$nullvar != ""} { upvar $nullvar nullentry } @@ -260,13 +287,13 @@ proc get_near_results {tbl expr arrayvar {nullvar ""}} { if {$iBracket!=0} { error "mismatched brackets in: $expr" } if {[info exists opidx]==0} { - get_single_near_results $tbl $expr aMatchinfo nullentry + get_single_near_results $tbl $expr $deferred aMatchinfo nullentry } else { set eLeft [lrange $expr 0 [expr $opidx-1]] set eRight [lrange $expr [expr $opidx+1] end] - get_near_results $tbl $eLeft aLeft nullleft - get_near_results $tbl $eRight aRight nullright + get_near_results $tbl $eLeft $deferred aLeft nullleft + get_near_results $tbl $eRight $deferred aRight nullright switch -- [lindex $expr $opidx] { "NOT" { @@ -390,8 +417,6 @@ foreach {tn create} { proc make_token_deferrable {tbl token} { set nRow [db one "SELECT count(*) FROM $tbl"] set pgsz [db one "PRAGMA page_size"] - - execsql "INSERT INTO $tbl ($tbl) VALUES('maxpending=100000000')" execsql BEGIN for {set i 0} {$i < ($nRow * $pgsz * 1.2)/100} {incr i} { set doc [string repeat "$token " 100] @@ -421,28 +446,54 @@ foreach {tn create} { make_token_deferrable t1 c - set ::fts3_deferred [list] foreach {tn2 expr} { 1 {a OR c} } { do_fts3query_test 3.$tn.2.$tn2 t1 $expr } - set ::fts3_deferred [list c] execsql { UPDATE t1_segments SET block = zeroblob(length(block)) WHERE length(block)>10000 AND 0 } - foreach {tn2 expr} { - 1 {a NEAR c} - 2 {a AND c} - 3 {"a c"} - 4 {"c a"} - 5 {"a c" NEAR/1 g} - 6 {"a c" NEAR/0 g} + foreach {tn2 expr def} { + 1 {a NEAR c} {} + 2 {a AND c} c + 3 {"a c"} c + 4 {"c a"} c + 5 {"a c" NEAR/1 g} {} + 6 {"a c" NEAR/0 g} {} } { - do_fts3query_test 3.$tn.2.$tn2 t1 $expr + do_fts3query_test 3.$tn.2.$tn2 -deferred $def t1 $expr + } +} + +#-------------------------------------------------------------------------- +# +foreach {tn create} { + 1 "fts4(x, y)" + 2 "fts4(x, y, order=DESC)" +} { + catchsql { DROP TABLE t1 } + execsql "CREATE VIRTUAL TABLE t1 USING $create" + + foreach {x y} { + {one two five four five} {} + {} {one two five four five} + {one two} {five four five} + } { + execsql {INSERT INTO t1 VALUES($x, $y)} + } + + foreach {tn2 expr} { + 1 {one AND five} + 2 {one NEAR five} + 3 {one NEAR/1 five} + 4 {one NEAR/2 five} + 5 {one NEAR/3 five} + } { + do_fts3query_test 4.$tn.2.$tn2 t1 $expr } } diff --git a/test/permutations.test b/test/permutations.test index 4640ed1139..9c95296e39 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -183,7 +183,7 @@ test_suite "fts3" -prefix "" -description { fts3fault.test fts3malloc.test fts3matchinfo.test - fts3aux1.test fts3comp1.test + fts3aux1.test fts3comp1.test fts3auto.test }