Index: third_party/sqlite/src/test/fts3_common.tcl |
diff --git a/third_party/sqlite/src/test/fts3_common.tcl b/third_party/sqlite/src/test/fts3_common.tcl |
index 4d4ae38bae798223e3400bd1931467cdf531dc94..2ed1f70bf626bee9781bdba5393c3a004227c841 100644 |
--- a/third_party/sqlite/src/test/fts3_common.tcl |
+++ b/third_party/sqlite/src/test/fts3_common.tcl |
@@ -15,6 +15,129 @@ |
# |
#------------------------------------------------------------------------- |
+# INSTRUCTIONS |
+# |
+# The following commands are available: |
+# |
+# fts3_build_db_1 N |
+# Using database handle [db] create an FTS4 table named t1 and populate |
+# it with N rows of data. N must be less than 10,000. Refer to the |
+# header comments above the proc implementation below for details. |
+# |
+# fts3_build_db_2 N |
+# Using database handle [db] create an FTS4 table named t2 and populate |
+# it with N rows of data. N must be less than 100,000. Refer to the |
+# header comments above the proc implementation below for details. |
+# |
+# fts3_integrity_check TBL |
+# TBL must be an FTS table in the database currently opened by handle |
+# [db]. This proc loads and tokenizes all documents within the table, |
+# then checks that the current contents of the FTS index matches the |
+# results. |
+# |
+# fts3_terms TBL WHERE |
+# Todo. |
+# |
+# fts3_doclist TBL TERM WHERE |
+# Todo. |
+# |
+# |
+# |
+ |
+#------------------------------------------------------------------------- |
+# USAGE: fts3_build_db_1 SWITCHES N |
+# |
+# Build a sample FTS table in the database opened by database connection |
+# [db]. The name of the new table is "t1". |
+# |
+proc fts3_build_db_1 {args} { |
+ |
+ set default(-module) fts4 |
+ |
+ set nArg [llength $args] |
+ if {($nArg%2)==0} { |
+ error "wrong # args: should be \"fts3_build_db_1 ?switches? n\"" |
+ } |
+ |
+ set n [lindex $args [expr $nArg-1]] |
+ array set opts [array get default] |
+ array set opts [lrange $args 0 [expr $nArg-2]] |
+ foreach k [array names opts] { |
+ if {0==[info exists default($k)]} { error "unknown option: $k" } |
+ } |
+ |
+ if {$n > 10000} {error "n must be <= 10000"} |
+ db eval "CREATE VIRTUAL TABLE t1 USING $opts(-module) (x, y)" |
+ |
+ set xwords [list zero one two three four five six seven eight nine ten] |
+ set ywords [list alpha beta gamma delta epsilon zeta eta theta iota kappa] |
+ |
+ for {set i 0} {$i < $n} {incr i} { |
+ set x "" |
+ set y "" |
+ |
+ set x [list] |
+ lappend x [lindex $xwords [expr ($i / 1000) % 10]] |
+ lappend x [lindex $xwords [expr ($i / 100) % 10]] |
+ lappend x [lindex $xwords [expr ($i / 10) % 10]] |
+ lappend x [lindex $xwords [expr ($i / 1) % 10]] |
+ |
+ set y [list] |
+ lappend y [lindex $ywords [expr ($i / 1000) % 10]] |
+ lappend y [lindex $ywords [expr ($i / 100) % 10]] |
+ lappend y [lindex $ywords [expr ($i / 10) % 10]] |
+ lappend y [lindex $ywords [expr ($i / 1) % 10]] |
+ |
+ db eval { INSERT INTO t1(docid, x, y) VALUES($i, $x, $y) } |
+ } |
+} |
+ |
+#------------------------------------------------------------------------- |
+# USAGE: fts3_build_db_2 N ARGS |
+# |
+# Build a sample FTS table in the database opened by database connection |
+# [db]. The name of the new table is "t2". |
+# |
+proc fts3_build_db_2 {args} { |
+ |
+ set default(-module) fts4 |
+ set default(-extra) "" |
+ |
+ set nArg [llength $args] |
+ if {($nArg%2)==0} { |
+ error "wrong # args: should be \"fts3_build_db_1 ?switches? n\"" |
+ } |
+ |
+ set n [lindex $args [expr $nArg-1]] |
+ array set opts [array get default] |
+ array set opts [lrange $args 0 [expr $nArg-2]] |
+ foreach k [array names opts] { |
+ if {0==[info exists default($k)]} { error "unknown option: $k" } |
+ } |
+ |
+ if {$n > 100000} {error "n must be <= 100000"} |
+ |
+ set sql "CREATE VIRTUAL TABLE t2 USING $opts(-module) (content" |
+ if {$opts(-extra) != ""} { |
+ append sql ", " $opts(-extra) |
+ } |
+ append sql ")" |
+ db eval $sql |
+ |
+ set chars [list a b c d e f g h i j k l m n o p q r s t u v w x y z ""] |
+ |
+ for {set i 0} {$i < $n} {incr i} { |
+ set word "" |
+ set nChar [llength $chars] |
+ append word [lindex $chars [expr {($i / 1) % $nChar}]] |
+ append word [lindex $chars [expr {($i / $nChar) % $nChar}]] |
+ append word [lindex $chars [expr {($i / ($nChar*$nChar)) % $nChar}]] |
+ |
+ db eval { INSERT INTO t2(docid, content) VALUES($i, $word) } |
+ } |
+} |
+ |
+#------------------------------------------------------------------------- |
# USAGE: fts3_integrity_check TBL |
# |
# This proc is used to verify that the full-text index is consistent with |
@@ -46,6 +169,7 @@ proc fts3_integrity_check {tbl} { |
fts3_read2 $tbl 1 A |
foreach zTerm [array names A] { |
+ #puts $zTerm |
foreach doclist $A($zTerm) { |
set docid 0 |
while {[string length $doclist]>0} { |
@@ -97,7 +221,7 @@ proc fts3_integrity_check {tbl} { |
set es "Error at docid=$iDoc col=$iCol pos=$pos. Index is missing" |
lappend errors $es |
} else { |
- if {$C($iDoc,$iCol,$pos) != "$term"} { |
+ if {[string compare $C($iDoc,$iCol,$pos) $term]} { |
set es "Error at docid=$iDoc col=$iCol pos=$pos. Index " |
append es "has \"$C($iDoc,$iCol,$pos)\", document has \"$term\"" |
lappend errors $es |
@@ -233,7 +357,8 @@ proc fts3_readleaf {blob} { |
set zTerm [string range $zPrev 0 [expr $nPrefix-1]] |
append zTerm [gobble_string blob $nSuffix] |
- set doclist [gobble_string blob [gobble_varint blob]] |
+ set nDoclist [gobble_varint blob] |
+ set doclist [gobble_string blob $nDoclist] |
lappend terms $zTerm $doclist |
set zPrev $zTerm |
@@ -249,7 +374,9 @@ proc fts3_read2 {tbl where varname} { |
FROM ${tbl}_segdir WHERE $where |
ORDER BY level ASC, idx DESC |
" { |
- if {$start_block == 0} { |
+ set c 0 |
+ binary scan $root c c |
+ if {$c==0} { |
foreach {t d} [fts3_readleaf $root] { lappend a($t) $d } |
} else { |
db eval " SELECT block |
@@ -258,7 +385,6 @@ proc fts3_read2 {tbl where varname} { |
ORDER BY blockid |
" { |
foreach {t d} [fts3_readleaf $block] { lappend a($t) $d } |
- |
} |
} |
} |