char *p1 = *pp1;
char *p2 = *pp2;
- while( *p1 && *p2 ){
- int iCol1 = 0;
- int iCol2 = 0;
+ while( *p1 || *p2 ){
+ int iCol1;
+ int iCol2;
+
if( *p1==0x01 ) sqlite3Fts3GetVarint32(&p1[1], &iCol1);
+ else if( *p1==0x00 ) iCol1 = OFFSET_LIST_END;
+ else iCol1 = 0;
+
if( *p2==0x01 ) sqlite3Fts3GetVarint32(&p2[1], &iCol2);
+ else if( *p2==0x00 ) iCol2 = OFFSET_LIST_END;
+ else iCol2 = 0;
if( iCol1==iCol2 ){
sqlite3_int64 i1 = 0;
if( !aBuffer ){
return SQLITE_NOMEM;
}
+ if( n1==0 && n2==0 ){
+ *pnBuffer = 0;
+ return SQLITE_OK;
+ }
/* Read the first docid from each doclist */
fts3GetDeltaVarint2(&p1, pEnd1, &i1);
-C Fix\ssome\sproblems\swith\sFTS3\sand\s3-way\sNEAR\squeries.
-D 2009-12-05T11:37:19
+C Fix\sanother\sbug\sin\s3-way\sNEAR\squeries.
+D 2009-12-05T14:29:23
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in c5827ead754ab32b9585487177c93bb00b9497b3
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts3/fts3.c 7d344410bffdddf98c1af623993dd284e156a89f
+F ext/fts3/fts3.c f4152f277722781048c9bba19aa605dbb831ad9a
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
F ext/fts3/fts3Int.h cc716c74afa7da8e0f8ef39404f33ea62a823eb3
F ext/fts3/fts3_expr.c c18794a62c257d3456d3314c5a18e348ae0d84bd
F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a
F test/fts3malloc.test d02ee86b21edd2b43044e0d6dfdcd26cb6efddcb
F test/fts3near.test dc196dd17b4606f440c580d45b3d23aa975fd077
-F test/fts3rnd.test 071ff7ed7bf60f8f7502a3e09cbc680dbd795da1
+F test/fts3rnd.test 151071849c9db2bade6e3d3c0c20e3a8f4f30892
F test/func.test af106ed834001738246d276659406823e35cde7b
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
F test/fuzz.test a4174c3009a3e2c2e14b31b364ebf7ddb49de2c9
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 08faee686eb2fabe0dde51231ee55880e78541e8
-R b8a65915c3bbacc7a62e1d6f19ca7f03
+P 23dc6fb5b28712d1ba18dc7ddb3f2ef3b469d611
+R bd59d2e643443e6c4d242260f4459347
U dan
-Z bdcaf8016833561b09539543f7f27b88
+Z 684064b55602f4b676c31d5b0005b496
-23dc6fb5b28712d1ba18dc7ddb3f2ef3b469d611
\ No newline at end of file
+3bb13a06521b54194c9f3eb44e0dc42bacf016a4
\ No newline at end of file
proc simple_near {termlist nNear} {
set ret [list]
- # List of nNear+1 elements that contains no terms.
- #
- set dummyfields "[string repeat "X " $nNear]X"
-
foreach {key value} [array get ::t1] {
foreach v $value {
- set v [concat $dummyfields $v $dummyfields]
set l [lsearch -exact -all $v [lindex $termlist 0]]
foreach T [lrange $termlist 1 end] {
foreach i $l {
set iStart [expr $i - $nNear - 1]
set iEnd [expr $i + $nNear + 1]
+ if {$iStart < 0} {set iStart 0}
foreach i2 [lsearch -exact -all [lrange $v $iStart $iEnd] $T] {
incr i2 $iStart
if {$i2 != $i} { lappend l2 $i2 }
}
}
- set l $l2
+ set l [lsort -uniq -integer $l2]
}
if {[llength $l]} {
+#puts "MATCH($key): $v"
lappend ret $key
}
}
update_row $iUpdate
delete_row $iDelete
}
-
+
# Pick 10 terms from the vocabulary. Check that the results of querying
# the database for the set of documents containing each of these terms
# is the same as the result obtained by scanning the contents of the Tcl
} [simple_near $terms 10]
}
-if 0 {
# A 3-way NEAR query with terms as the arguments.
#
for {set i 0} {$i < 10} {incr i} {
set terms [list [random_term] [random_term] [random_term]]
- set match [join $terms " NEAR "]
+ set nNear 11
+ set match [join $terms " NEAR/$nNear "]
+ set fts3 [execsql { SELECT docid FROM t1 WHERE t1 MATCH $match }]
+ set tcl [simple_near $terms $nNear]
do_test fts3rnd-1.$nodesize.$iTest.5.$i.$match {
execsql { SELECT docid FROM t1 WHERE t1 MATCH $match }
- } [simple_near $terms 10]
+ } [simple_near $terms $nNear]
+if {$::nErr} {exit -1}
}
-}
}
}