| Index: third_party/sqlite/src/test/fts3rnd.test | 
| diff --git a/third_party/sqlite/src/test/fts3rnd.test b/third_party/sqlite/src/test/fts3rnd.test | 
| index 0909cee614d089491b2487099a4d62d5813a98fc..97af54925f3953e866468ddac7cc3afa8736b471 100644 | 
| --- a/third_party/sqlite/src/test/fts3rnd.test | 
| +++ b/third_party/sqlite/src/test/fts3rnd.test | 
| @@ -162,7 +162,7 @@ proc simple_phrase {zPrefix} { | 
|  | 
| # This [proc] is used to test the FTS3 matchinfo() function. | 
| # | 
| -proc simple_token_matchinfo {zToken} { | 
| +proc simple_token_matchinfo {zToken bDesc} { | 
|  | 
| set nDoc(0) 0 | 
| set nDoc(1) 0 | 
| @@ -171,6 +171,8 @@ proc simple_token_matchinfo {zToken} { | 
| set nHit(1) 0 | 
| set nHit(2) 0 | 
|  | 
| +  set dir -inc | 
| +  if {$bDesc} { set dir -dec } | 
|  | 
| foreach key [array names ::t1] { | 
| set value $::t1($key) | 
| @@ -184,7 +186,7 @@ proc simple_token_matchinfo {zToken} { | 
| } | 
|  | 
| set ret [list] | 
| -  foreach docid [lsort -integer [array names a]] { | 
| +  foreach docid [lsort -integer $dir [array names a]] { | 
| if { [lindex [lsort -integer $a($docid)] end] } { | 
| set matchinfo [list 1 3] | 
| foreach i {0 1 2} hit $a($docid) { | 
| @@ -262,22 +264,37 @@ proc mit {blob} { | 
| return $r | 
| } | 
| db func mit mit | 
| - | 
| set sqlite_fts3_enable_parentheses 1 | 
|  | 
| -foreach nodesize {50 500 1000 2000} { | 
| +proc do_orderbydocid_test {tn sql res} { | 
| +  uplevel [list do_select_test $tn.asc "$sql ORDER BY docid ASC" $res] | 
| +  uplevel [list do_select_test $tn.desc "$sql ORDER BY docid DESC" \ | 
| +    [lsort -int -dec $res] | 
| +  ] | 
| +} | 
| + | 
| +set NUM_TRIALS 100 | 
| + | 
| +foreach {nodesize order} { | 
| +  50    DESC | 
| +  50    ASC | 
| +  500   ASC | 
| +  1000  DESC | 
| +  2000  ASC | 
| +} { | 
| catch { array unset ::t1 } | 
| +  set testname "$nodesize/$order" | 
|  | 
| # Create the FTS3 table. Populate it (and the Tcl array) with 100 rows. | 
| # | 
| db transaction { | 
| catchsql { DROP TABLE t1 } | 
| -    execsql "CREATE VIRTUAL TABLE t1 USING fts3(a, b, c)" | 
| +    execsql "CREATE VIRTUAL TABLE t1 USING fts4(a, b, c, order=$order)" | 
| execsql "INSERT INTO t1(t1) VALUES('nodesize=$nodesize')" | 
| for {set i 0} {$i < 100} {incr i} { insert_row $i } | 
| } | 
|  | 
| -  for {set iTest 1} {$iTest <= 100} {incr iTest} { | 
| +  for {set iTest 1} {$iTest <= $NUM_TRIALS} {incr iTest} { | 
| catchsql COMMIT | 
|  | 
| set DO_MALLOC_TEST 0 | 
| @@ -286,6 +303,8 @@ foreach nodesize {50 500 1000 2000} { | 
| set DO_MALLOC_TEST 1 | 
| set nRep 2 | 
| } | 
| + | 
| +    set ::testprefix fts3rnd-1.$testname.$iTest | 
|  | 
| # Delete one row, update one row and insert one row. | 
| # | 
| @@ -307,7 +326,7 @@ foreach nodesize {50 500 1000 2000} { | 
| if {0==($iTest%2)} { execsql COMMIT } | 
|  | 
| if {0==($iTest%2)} { | 
| -      do_test fts3rnd-1.$nodesize.$iTest.0 { fts3_integrity_check t1 } ok | 
| +      #do_test 0 { fts3_integrity_check t1 } ok | 
| } | 
|  | 
| # Pick 10 terms from the vocabulary. Check that the results of querying | 
| @@ -317,9 +336,14 @@ foreach nodesize {50 500 1000 2000} { | 
| # | 
| for {set i 0} {$i < 10} {incr i} { | 
| set term [random_term] | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.1.$i { | 
| +      do_select_test 1.$i.asc { | 
| SELECT docid, mit(matchinfo(t1)) FROM t1 WHERE t1 MATCH $term | 
| -      } [simple_token_matchinfo $term] | 
| +        ORDER BY docid ASC | 
| +      } [simple_token_matchinfo $term 0] | 
| +      do_select_test 1.$i.desc { | 
| +        SELECT docid, mit(matchinfo(t1)) FROM t1 WHERE t1 MATCH $term | 
| +        ORDER BY docid DESC | 
| +      } [simple_token_matchinfo $term 1] | 
| } | 
|  | 
| # This time, use the first two characters of each term as a term prefix | 
| @@ -329,7 +353,7 @@ foreach nodesize {50 500 1000 2000} { | 
| for {set i 0} {$i < $nRep} {incr i} { | 
| set prefix [string range [random_term] 0 end-1] | 
| set match "${prefix}*" | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.2.$i { | 
| +      do_orderbydocid_test 2.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [simple_phrase $match] | 
| } | 
| @@ -339,7 +363,7 @@ foreach nodesize {50 500 1000 2000} { | 
| for {set i 0} {$i < $nRep} {incr i} { | 
| set term [list [random_term] [random_term]] | 
| set match "\"$term\"" | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.3.$i { | 
| +      do_orderbydocid_test 3.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [simple_phrase $term] | 
| } | 
| @@ -349,7 +373,7 @@ foreach nodesize {50 500 1000 2000} { | 
| for {set i 0} {$i < $nRep} {incr i} { | 
| set term [list [random_term] [random_term] [random_term]] | 
| set match "\"$term\"" | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.4.$i { | 
| +      do_orderbydocid_test 4.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [simple_phrase $term] | 
| } | 
| @@ -362,17 +386,19 @@ foreach nodesize {50 500 1000 2000} { | 
| append query "[string range [random_term] 0 end-1]*" | 
|  | 
| set match "\"$query\"" | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.5.$i { | 
| +      do_orderbydocid_test 5.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [simple_phrase $query] | 
| } | 
|  | 
| -    # A NEAR query with terms as the arguments. | 
| +    # A NEAR query with terms as the arguments: | 
| +    # | 
| +    #     ... MATCH '$term1 NEAR $term2' ... | 
| # | 
| for {set i 0} {$i < $nRep} {incr i} { | 
| set terms [list [random_term] [random_term]] | 
| set match [join $terms " NEAR "] | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.6.$i { | 
| +      do_orderbydocid_test 6.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [simple_near $terms 10] | 
| } | 
| @@ -383,7 +409,7 @@ foreach nodesize {50 500 1000 2000} { | 
| set terms [list [random_term] [random_term] [random_term]] | 
| set nNear 11 | 
| set match [join $terms " NEAR/$nNear "] | 
| -      do_select_test fts3rnd-1.$nodesize.$iTest.7.$i { | 
| +      do_orderbydocid_test 7.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [simple_near $terms $nNear] | 
| } | 
| @@ -399,7 +425,7 @@ foreach nodesize {50 500 1000 2000} { | 
| set term1 [random_term] | 
| set term2 [random_term] | 
| set match "$term1 $op $term2" | 
| -        do_select_test fts3rnd-1.$nodesize.$iTest.$tn.$i { | 
| +        do_orderbydocid_test $tn.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [$proc [simple_phrase $term1] [simple_phrase $term2]] | 
| } | 
| @@ -408,9 +434,9 @@ foreach nodesize {50 500 1000 2000} { | 
| # Set operations on NEAR queries. | 
| # | 
| foreach {tn op proc} { | 
| -      8  OR  setop_or | 
| -      9  NOT setop_not | 
| -      10 AND setop_and | 
| +      11 OR  setop_or | 
| +      12 NOT setop_not | 
| +      13 AND setop_and | 
| } { | 
| for {set i 0} {$i < $nRep} {incr i} { | 
| set term1 [random_term] | 
| @@ -418,7 +444,7 @@ foreach nodesize {50 500 1000 2000} { | 
| set term3 [random_term] | 
| set term4 [random_term] | 
| set match "$term1 NEAR $term2 $op $term3 NEAR $term4" | 
| -        do_select_test fts3rnd-1.$nodesize.$iTest.$tn.$i { | 
| +        do_orderbydocid_test $tn.$i { | 
| SELECT docid FROM t1 WHERE t1 MATCH $match | 
| } [$proc                                  \ | 
| [simple_near [list $term1 $term2] 10] \ | 
|  |