Fixes for tcl list generation in fts5_test().

FossilOrigin-Name: c1f9a4b76c0bbc1ef9f6cdb5d62aa5d536fdf38e
This commit is contained in:
dan 2014-07-16 20:07:59 +00:00
parent 9cfd51f587
commit 18689f1bd4
4 changed files with 62 additions and 67 deletions

View File

@ -81,22 +81,43 @@ static void fts5TestFunction(
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);
}
sqlite3Fts5BufferAppendPrintf(&rc, &s, "}");
if(zReq==0 && (nPhrase>1 || bParen) ){
sqlite3Fts5BufferAppendPrintf(&rc, &s, "{%s}", (const char*)s3.p);
}else{
sqlite3Fts5BufferAppendPrintf(&rc, &s, "%s", (const char*)s3.p);
}
sqlite3_free(s3.p);
}
if( zReq==0 ){

View File

@ -1,5 +1,5 @@
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
@ -106,7 +106,7 @@ F ext/fts3/unicode/mkunicode.tcl dc6f268eb526710e2c6e496c372471d773d0c368
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
@ -597,7 +597,7 @@ F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849
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
@ -1194,7 +1194,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
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

View File

@ -1 +1 @@
1e2a7ba0889093416455f488fca893eaeb195d45
c1f9a4b76c0bbc1ef9f6cdb5d62aa5d536fdf38e

View File

@ -137,42 +137,6 @@ do_test 1.1 {
}
} {}
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...
@ -243,6 +207,7 @@ proc poslist {aCol args} {
lappend res $plist
}
#puts $res
return $res
}
@ -284,9 +249,9 @@ proc matchdata {bPos expr {bAsc 0}} {
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
@ -303,7 +268,13 @@ proc matchdata {bPos expr {bAsc 0}} {
return [concat {*}$res]
}
#
# End of test code
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# Test phrase queries.
#
foreach {tn phrase} {
1 "o"
2 "b q"
@ -316,7 +287,6 @@ foreach {tn phrase} {
9 "no"
10 "L O O L V V K"
} {
set expr "\"$phrase\""
set res [matchdata 1 $expr]
@ -325,20 +295,24 @@ foreach {tn phrase} {
} $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
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.8 { poslist {{a b c}} -- a } {0.0}
do_test 2.9 { poslist {{a b c}} -- c } {0.2}
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}]}