sqlite3Fts5BufferAppendPrintf(&rc, &s, " poslist ");
}
if( 0==zReq || 0==sqlite3_stricmp(zReq, "poslist") ){
- sqlite3Fts5BufferAppendPrintf(&rc, &s, "{");
+ int bParen = 0;
+ Fts5Buffer s3;
+ memset(&s3, 0, sizeof(s3));
+
+
for(i=0; i<nPhrase; i++){
+ Fts5Buffer s2; /* List of positions for phrase/column */
int j = 0;
int iOff = 0;
int iCol = 0;
- int bFirst = 1;
- sqlite3Fts5BufferAppendPrintf(&rc, &s, "%s{", (i==0?"":" "));
+ int nElem = 0;
+
+ memset(&s2, 0, sizeof(s2));
while( 0==pApi->xPoslist(pFts, i, &j, &iCol, &iOff) ){
- sqlite3Fts5BufferAppendPrintf(
- &rc, &s, "%s%d.%d", (bFirst?"":" "), iCol, iOff
- );
- bFirst = 0;
+ if( nElem!=0 ) sqlite3Fts5BufferAppendPrintf(&rc, &s2, " ");
+ sqlite3Fts5BufferAppendPrintf(&rc, &s2, "%d.%d", iCol, iOff);
+ nElem++;
}
- sqlite3Fts5BufferAppendPrintf(&rc, &s, "}");
+
+ if( i!=0 ){
+ sqlite3Fts5BufferAppendPrintf(&rc, &s3, " ");
+ }
+ if( nElem==1 ){
+ sqlite3Fts5BufferAppendPrintf(&rc, &s3, "%s", (const char*)s2.p);
+ }else{
+ sqlite3Fts5BufferAppendPrintf(&rc, &s3, "{%s}", (const char*)s2.p);
+ bParen = 1;
+ }
+ sqlite3_free(s2.p);
+ }
+
+ if(zReq==0 && (nPhrase>1 || bParen) ){
+ sqlite3Fts5BufferAppendPrintf(&rc, &s, "{%s}", (const char*)s3.p);
+ }else{
+ sqlite3Fts5BufferAppendPrintf(&rc, &s, "%s", (const char*)s3.p);
}
- sqlite3Fts5BufferAppendPrintf(&rc, &s, "}");
+ sqlite3_free(s3.p);
}
if( zReq==0 ){
-C Begin\sadding\sinterface\sfor\sauxiliary\sfunctions.
-D 2014-07-16T19:15:57.212
+C Fixes\sfor\stcl\slist\sgeneration\sin\sfts5_test().
+D 2014-07-16T20:07:59.378
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F ext/fts5/fts5.c 20bcb1e10756c72b550947236960edf96929ca2f
F ext/fts5/fts5.h cda3b9d73e6ffa6d0cd35b7da6b808bf3a1ada32
F ext/fts5/fts5Int.h 2d4c1e1ebdf18278776fcd8a64233ff3c04ea51f
-F ext/fts5/fts5_aux.c 53ab338c6a469dc67e7a6bd8685ce727beee8403
+F ext/fts5/fts5_aux.c 27b082732fd76277fd7e9277f52903723d97f99b
F ext/fts5/fts5_buffer.c b7aa6cdf4a63642fcc12359cedc4be748ca400cc
F ext/fts5/fts5_config.c 94f1b4cb4de6a7cd5780c14adb0198e289df8cef
F ext/fts5/fts5_expr.c e4e4e6d32beff1ab0d076f8fbf5cf3b2241d4dbc
F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36
F test/fts5aa.test c8d3b9694f6b2864161c7437408464a535d19343
F test/fts5ab.test dc04ed48cf93ca957d174406e6c192f2ff4f3397
-F test/fts5ac.test 398a2d8d9576e0579a0f0955fabd8410ace969e4
+F test/fts5ac.test 14d05f412b99ccac34316b76861b5bfe3a33d0a1
F test/fts5ad.test 2ed38bbc865678cb2905247120d02ebba7f20e07
F test/fts5ea.test ff43b40f8879ba50b82def70f2ab67c195d1a1d4
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P b96b5e166990e4ec363b24f66e04cfa5f00f6342
-R ff6cbab233811678a295f9640beec5d4
+P 1e2a7ba0889093416455f488fca893eaeb195d45
+R c6840136b0b681ac8e496da634d56e88
U dan
-Z 5e7398b52fb14b2e0bc342aa9223ff97
+Z a290facfa88166ccaa147b2550745bf7
-1e2a7ba0889093416455f488fca893eaeb195d45
\ No newline at end of file
+c1f9a4b76c0bbc1ef9f6cdb5d62aa5d536fdf38e
\ No newline at end of file
}
} {}
-proc phrasematch {phrase value} {
- if {[string first $phrase $value]>=0} { return 1 }
- return 0
-}
-
-# Usage:
-#
-proc nearmatch {nNear phraselist value} {
- set nPhrase [llength $phraselist]
-
- set phraselist [string tolower $phraselist]
- set value [string tolower $value]
-
- if {$nPhrase==1} {
- set bMatch [phrasematch [lindex $phraselist 0] $value]
- } else {
- set nValue [llength $value]
- if {$nNear >= $nValue} {set nNear [expr $nValue-1]}
-
- for {set i $nNear} {$i < $nValue} {incr i} {
- set bMatch 1
- foreach phrase $phraselist {
- set iMin [expr $i - $nNear - [llength $phrase]]
- set iMax [expr $i - 1 + [llength $phrase]]
- set subdoc [lrange $value $iMin $iMax]
- if {![phrasematch $phrase $subdoc]} {
- set bMatch 0
- break
- }
- }
- if {$bMatch} break
- }
- }
- return $bMatch
-}
-
# Usage:
#
# poslist aCol ?-near N? ?-col C? -- phrase1 phrase2...
lappend res $plist
}
+ #puts $res
return $res
}
set rowres [list]
foreach phrase $N {
set cmd "poslist [string range $phrase 9 end-1]"
- lappend rowres [eval $cmd]
+ set pos [eval $cmd]
+ set rowres [concat $rowres $pos]
}
- if {[string first "\{" $rowres]<0} { set rowres "{{$rowres}}" }
lappend res [list $id $rowres]
} else {
lappend res $id
return [concat {*}$res]
}
+#
+# End of test code
+#-------------------------------------------------------------------------
+#-------------------------------------------------------------------------
+# Test phrase queries.
+#
foreach {tn phrase} {
1 "o"
2 "b q"
9 "no"
10 "L O O L V V K"
} {
-
set expr "\"$phrase\""
set res [matchdata 1 $expr]
} $res
}
-# Test the "nearmatch" commnad.
+#-------------------------------------------------------------------------
+# Test some AND and OR queries.
#
-do_test 2.0 { nearmatch 2 {a b} {a x x b} } 1
-do_test 2.1 { nearmatch 2 {b a} {a x x b} } 1
-do_test 2.2 { nearmatch 1 {b a} {a x x b} } 0
-do_test 2.3 { nearmatch 1 {"a b" "c d"} {x x a b x c d} } 1
-do_test 2.4 { nearmatch 1 {"a b" "c d"} {x a b x x c d} } 0
-do_test 2.5 { nearmatch 400 {a b} {a x x b} } 1
-do_test 2.6 { nearmatch 0 {a} {a x x b} } 1
-do_test 2.7 { nearmatch 0 {b} {a x x b} } 1
-
-do_test 2.8 { poslist {{a b c}} -- a } {0.0}
-do_test 2.9 { poslist {{a b c}} -- c } {0.2}
+foreach {tn expr} {
+ 1 "a AND b"
+ 2 "a+b AND c"
+ 3 "d+c AND u"
+ 4 "d+c AND u+d"
+} {
+ set res [matchdata 1 $expr]
+ do_execsql_test 2.1.$tn.[llength $res] {
+ SELECT rowid, fts5_test(xx, 'poslist') FROM xx WHERE xx match $expr
+ } $res
+}
+
+do_test 2.1 { poslist {{a b c}} -- a } {0.0}
+do_test 2.2 { poslist {{a b c}} -- c } {0.2}
foreach {tn expr tclexpr} {
1 {a b} {[N $x -- {a}] && [N $x -- {b}]}