Index: third_party/sqlite/sqlite-src-3080704/ext/fts3/fts3speed.tcl |
diff --git a/third_party/sqlite/sqlite-src-3080704/ext/fts3/fts3speed.tcl b/third_party/sqlite/sqlite-src-3080704/ext/fts3/fts3speed.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..377cb196065699557b0a035a1e9d74808321187a |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/ext/fts3/fts3speed.tcl |
@@ -0,0 +1,122 @@ |
+ |
+ |
+#-------------------------------------------------------------------------- |
+# This script contains several sub-programs used to test FTS3/FTS4 |
+# performance. It does not run the queries directly, but generates SQL |
+# scripts that can be run using the shell tool. |
+# |
+# The following cases are tested: |
+# |
+# 1. Inserting documents into an FTS3 table. |
+# 2. Optimizing an FTS3 table (i.e. "INSERT INTO t1 VALUES('optimize')"). |
+# 3. Deleting documents from an FTS3 table. |
+# 4. Querying FTS3 tables. |
+# |
+ |
+# Number of tokens in vocabulary. And number of tokens in each document. |
+# |
+set VOCAB_SIZE 2000 |
+set DOC_SIZE 100 |
+ |
+set NUM_INSERTS 100000 |
+set NUM_SELECTS 1000 |
+ |
+# Force everything in this script to be deterministic. |
+# |
+expr {srand(0)} |
+ |
+proc usage {} { |
+ puts stderr "Usage: $::argv0 <rows> <selects>" |
+ exit -1 |
+} |
+ |
+proc sql {sql} { |
+ puts $::fd $sql |
+} |
+ |
+ |
+# Return a list of $nWord randomly generated tokens each between 2 and 10 |
+# characters in length. |
+# |
+proc build_vocab {nWord} { |
+ set ret [list] |
+ 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<$nWord} {incr i} { |
+ set len [expr {int((rand()*9.0)+2)}] |
+ set term "" |
+ for {set j 0} {$j<$len} {incr j} { |
+ append term [lindex $chars [expr {int(rand()*[llength $chars])}]] |
+ } |
+ lappend ret $term |
+ } |
+ set ret |
+} |
+ |
+proc select_term {} { |
+ set n [llength $::vocab] |
+ set t [expr int(rand()*$n*3)] |
+ if {$t>=2*$n} { set t [expr {($t-2*$n)/100}] } |
+ if {$t>=$n} { set t [expr {($t-$n)/10}] } |
+ lindex $::vocab $t |
+} |
+ |
+proc select_doc {nTerm} { |
+ set ret [list] |
+ for {set i 0} {$i<$nTerm} {incr i} { |
+ lappend ret [select_term] |
+ } |
+ set ret |
+} |
+ |
+proc test_1 {nInsert} { |
+ sql "PRAGMA synchronous = OFF;" |
+ sql "DROP TABLE IF EXISTS t1;" |
+ sql "CREATE VIRTUAL TABLE t1 USING fts4;" |
+ for {set i 0} {$i < $nInsert} {incr i} { |
+ set doc [select_doc $::DOC_SIZE] |
+ sql "INSERT INTO t1 VALUES('$doc');" |
+ } |
+} |
+ |
+proc test_2 {} { |
+ sql "INSERT INTO t1(t1) VALUES('optimize');" |
+} |
+ |
+proc test_3 {nSelect} { |
+ for {set i 0} {$i < $nSelect} {incr i} { |
+ sql "SELECT count(*) FROM t1 WHERE t1 MATCH '[select_term]';" |
+ } |
+} |
+ |
+proc test_4 {nSelect} { |
+ for {set i 0} {$i < $nSelect} {incr i} { |
+ sql "SELECT count(*) FROM t1 WHERE t1 MATCH '[select_term] [select_term]';" |
+ } |
+} |
+ |
+if {[llength $argv]!=0} usage |
+ |
+set ::vocab [build_vocab $::VOCAB_SIZE] |
+ |
+set ::fd [open fts3speed_insert.sql w] |
+test_1 $NUM_INSERTS |
+close $::fd |
+ |
+set ::fd [open fts3speed_select.sql w] |
+test_3 $NUM_SELECTS |
+close $::fd |
+ |
+set ::fd [open fts3speed_select2.sql w] |
+test_4 $NUM_SELECTS |
+close $::fd |
+ |
+set ::fd [open fts3speed_optimize.sql w] |
+test_2 |
+close $::fd |
+ |
+puts "Success. Created files:" |
+puts " fts3speed_insert.sql" |
+puts " fts3speed_select.sql" |
+puts " fts3speed_select2.sql" |
+puts " fts3speed_optimize.sql" |
+ |