| Index: third_party/sqlite/sqlite-src-3080704/test/fts3_common.tcl
|
| diff --git a/third_party/sqlite/sqlite-src-3080704/test/fts3_common.tcl b/third_party/sqlite/sqlite-src-3080704/test/fts3_common.tcl
|
| deleted file mode 100644
|
| index 2ed1f70bf626bee9781bdba5393c3a004227c841..0000000000000000000000000000000000000000
|
| --- a/third_party/sqlite/sqlite-src-3080704/test/fts3_common.tcl
|
| +++ /dev/null
|
| @@ -1,416 +0,0 @@
|
| -# 2009 November 04
|
| -#
|
| -# The author disclaims copyright to this source code. In place of
|
| -# a legal notice, here is a blessing:
|
| -#
|
| -# May you do good and not evil.
|
| -# May you find forgiveness for yourself and forgive others.
|
| -# May you share freely, never taking more than you give.
|
| -#
|
| -#***********************************************************************
|
| -#
|
| -# This file contains common code used the fts3 tests. At one point
|
| -# equivalent functionality was implemented in C code. But it is easier
|
| -# to use Tcl.
|
| -#
|
| -
|
| -#-------------------------------------------------------------------------
|
| -# 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
|
| -# the contents of the fts3 table. In other words, it checks that the
|
| -# data in the %_contents table matches that in the %_segdir and %_segments
|
| -# tables.
|
| -#
|
| -# This is not an efficient procedure. It uses a lot of memory and a lot
|
| -# of CPU. But it is better than not checking at all.
|
| -#
|
| -# The procedure is:
|
| -#
|
| -# 1) Read the entire full-text index from the %_segdir and %_segments
|
| -# tables into memory. For each entry in the index, the following is
|
| -# done:
|
| -#
|
| -# set C($iDocid,$iCol,$iPosition) $zTerm
|
| -#
|
| -# 2) Iterate through each column of each row of the %_content table.
|
| -# Tokenize all documents, and check that for each token there is
|
| -# a corresponding entry in the $C array. After checking a token,
|
| -# [unset] the $C array entry.
|
| -#
|
| -# 3) Check that array $C is now empty.
|
| -#
|
| -#
|
| -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} {
|
| - set iCol 0
|
| - set iPos 0
|
| - set lPos [list]
|
| - set lCol [list]
|
| -
|
| - # First varint of a doclist-entry is the docid. Delta-compressed
|
| - # with respect to the docid of the previous entry.
|
| - #
|
| - incr docid [gobble_varint doclist]
|
| - if {[info exists D($zTerm,$docid)]} {
|
| - while {[set iDelta [gobble_varint doclist]] != 0} {}
|
| - continue
|
| - }
|
| - set D($zTerm,$docid) 1
|
| -
|
| - # Gobble varints until the 0x00 that terminates the doclist-entry
|
| - # is found.
|
| - while {[set iDelta [gobble_varint doclist]] > 0} {
|
| - if {$iDelta == 1} {
|
| - set iCol [gobble_varint doclist]
|
| - set iPos 0
|
| - } else {
|
| - incr iPos $iDelta
|
| - incr iPos -2
|
| - set C($docid,$iCol,$iPos) $zTerm
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - foreach key [array names C] {
|
| - #puts "$key -> $C($key)"
|
| - }
|
| -
|
| -
|
| - db eval "SELECT * FROM ${tbl}_content" E {
|
| - set iCol 0
|
| - set iDoc $E(docid)
|
| - foreach col [lrange $E(*) 1 end] {
|
| - set c $E($col)
|
| - set sql {SELECT fts3_tokenizer_test('simple', $c)}
|
| -
|
| - foreach {pos term dummy} [db one $sql] {
|
| - if {![info exists C($iDoc,$iCol,$pos)]} {
|
| - set es "Error at docid=$iDoc col=$iCol pos=$pos. Index is missing"
|
| - lappend errors $es
|
| - } else {
|
| - 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
|
| - }
|
| - unset C($iDoc,$iCol,$pos)
|
| - }
|
| - }
|
| - incr iCol
|
| - }
|
| - }
|
| -
|
| - foreach c [array names C] {
|
| - lappend errors "Bad index entry: $c -> $C($c)"
|
| - }
|
| -
|
| - if {[info exists errors]} { return [join $errors "\n"] }
|
| - return "ok"
|
| -}
|
| -
|
| -# USAGE: fts3_terms TBL WHERE
|
| -#
|
| -# Argument TBL must be the name of an FTS3 table. Argument WHERE is an
|
| -# SQL expression that will be used as the WHERE clause when scanning
|
| -# the %_segdir table. As in the following query:
|
| -#
|
| -# "SELECT * FROM ${TBL}_segdir WHERE ${WHERE}"
|
| -#
|
| -# This function returns a list of all terms present in the segments
|
| -# selected by the statement above.
|
| -#
|
| -proc fts3_terms {tbl where} {
|
| - fts3_read $tbl $where a
|
| - return [lsort [array names a]]
|
| -}
|
| -
|
| -
|
| -# USAGE: fts3_doclist TBL TERM WHERE
|
| -#
|
| -# Argument TBL must be the name of an FTS3 table. TERM is a term that may
|
| -# or may not be present in the table. Argument WHERE is used to select a
|
| -# subset of the b-tree segments in the associated full-text index as
|
| -# described above for [fts3_terms].
|
| -#
|
| -# This function returns the results of merging the doclists associated
|
| -# with TERM in the selected segments. Each doclist is an element of the
|
| -# returned list. Each doclist is formatted as follows:
|
| -#
|
| -# [$docid ?$col[$off1 $off2...]?...]
|
| -#
|
| -# The formatting is odd for a Tcl command in order to be compatible with
|
| -# the original C-language implementation. If argument WHERE is "1", then
|
| -# any empty doclists are omitted from the returned list.
|
| -#
|
| -proc fts3_doclist {tbl term where} {
|
| - fts3_read $tbl $where a
|
| -
|
| -
|
| - foreach doclist $a($term) {
|
| - set docid 0
|
| -
|
| - while {[string length $doclist]>0} {
|
| - set iCol 0
|
| - set iPos 0
|
| - set lPos [list]
|
| - set lCol [list]
|
| - incr docid [gobble_varint doclist]
|
| -
|
| - while {[set iDelta [gobble_varint doclist]] > 0} {
|
| - if {$iDelta == 1} {
|
| - lappend lCol [list $iCol $lPos]
|
| - set iPos 0
|
| - set lPos [list]
|
| - set iCol [gobble_varint doclist]
|
| - } else {
|
| - incr iPos $iDelta
|
| - incr iPos -2
|
| - lappend lPos $iPos
|
| - }
|
| - }
|
| -
|
| - if {[llength $lPos]>0} {
|
| - lappend lCol [list $iCol $lPos]
|
| - }
|
| -
|
| - if {$where != "1" || [llength $lCol]>0} {
|
| - set ret($docid) $lCol
|
| - } else {
|
| - unset -nocomplain ret($docid)
|
| - }
|
| - }
|
| - }
|
| -
|
| - set lDoc [list]
|
| - foreach docid [lsort -integer [array names ret]] {
|
| - set lCol [list]
|
| - set cols ""
|
| - foreach col $ret($docid) {
|
| - foreach {iCol lPos} $col {}
|
| - append cols " $iCol\[[join $lPos { }]\]"
|
| - }
|
| - lappend lDoc "\[${docid}${cols}\]"
|
| - }
|
| -
|
| - join $lDoc " "
|
| -}
|
| -
|
| -###########################################################################
|
| -
|
| -proc gobble_varint {varname} {
|
| - upvar $varname blob
|
| - set n [read_fts3varint $blob ret]
|
| - set blob [string range $blob $n end]
|
| - return $ret
|
| -}
|
| -proc gobble_string {varname nLength} {
|
| - upvar $varname blob
|
| - set ret [string range $blob 0 [expr $nLength-1]]
|
| - set blob [string range $blob $nLength end]
|
| - return $ret
|
| -}
|
| -
|
| -# The argument is a blob of data representing an FTS3 segment leaf.
|
| -# Return a list consisting of alternating terms (strings) and doclists
|
| -# (blobs of data).
|
| -#
|
| -proc fts3_readleaf {blob} {
|
| - set zPrev ""
|
| - set terms [list]
|
| -
|
| - while {[string length $blob] > 0} {
|
| - set nPrefix [gobble_varint blob]
|
| - set nSuffix [gobble_varint blob]
|
| -
|
| - set zTerm [string range $zPrev 0 [expr $nPrefix-1]]
|
| - append zTerm [gobble_string blob $nSuffix]
|
| - set nDoclist [gobble_varint blob]
|
| - set doclist [gobble_string blob $nDoclist]
|
| -
|
| - lappend terms $zTerm $doclist
|
| - set zPrev $zTerm
|
| - }
|
| -
|
| - return $terms
|
| -}
|
| -
|
| -proc fts3_read2 {tbl where varname} {
|
| - upvar $varname a
|
| - array unset a
|
| - db eval " SELECT start_block, leaves_end_block, root
|
| - FROM ${tbl}_segdir WHERE $where
|
| - ORDER BY level ASC, idx DESC
|
| - " {
|
| - 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
|
| - FROM ${tbl}_segments
|
| - WHERE blockid>=$start_block AND blockid<=$leaves_end_block
|
| - ORDER BY blockid
|
| - " {
|
| - foreach {t d} [fts3_readleaf $block] { lappend a($t) $d }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -proc fts3_read {tbl where varname} {
|
| - upvar $varname a
|
| - array unset a
|
| - db eval " SELECT start_block, leaves_end_block, root
|
| - FROM ${tbl}_segdir WHERE $where
|
| - ORDER BY level DESC, idx ASC
|
| - " {
|
| - if {$start_block == 0} {
|
| - foreach {t d} [fts3_readleaf $root] { lappend a($t) $d }
|
| - } else {
|
| - db eval " SELECT block
|
| - FROM ${tbl}_segments
|
| - WHERE blockid>=$start_block AND blockid<$leaves_end_block
|
| - ORDER BY blockid
|
| - " {
|
| - foreach {t d} [fts3_readleaf $block] { lappend a($t) $d }
|
| -
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -##########################################################################
|
| -
|
|
|