-C Fix\sa\sproblem\swith\susing\sstat4\sdata\sto\sestimate\sthe\snumber\sof\srows\sscanned\sby\sa\srange\sconstraint\son\sthe\ssecond\sor\ssubsequent\scolumn\sof\sany\sindex\swhere\san\saffinity\stransformation\smust\sbe\sapplied\sto\sthe\sconstraint\sargument.
-D 2013-09-02T07:16:40.805
+C Add\stests\sto\scheck\sif\sANALYZE\sis\schoosing\scommon\snon-periodic\ssamples\sfor\sthe\sstat4\stable.
+D 2013-09-02T11:52:11.512
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F test/analyze6.test 19151da2c4e918905d2081b74ac5c4d47fc850ab
F test/analyze7.test bb1409afc9e8629e414387ef048b8e0e3e0bdc4f
F test/analyze8.test 093d15c1c888eed5034304a98c992f7360130b88
-F test/analyze9.test c4717447731bf9bb5751e0785d6337883094db3c
+F test/analyze9.test bce50d7448d4c51e1a2fd8efdcf895c2e5042e76
F test/analyzeA.test 1a5c40079894847976d983ca39c707aaa44b6944
F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b
F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P c94933f13208f3f7d6d1b117ce6d2821100655a4
-R 15f429912bd32e56367e01c1c9d0d2ba
+P c21f58d84859e479a6cc619671a0df48b2f9692e
+R 9fc61f7137863d5244ff2fd6cc214c12
U dan
-Z fd6aacb9a694e6de7810fd7923f14ee2
+Z 6c1b0e52f8f47aae31db001aa8668b6b
SELECT * FROM t1 WHERE a='ott' AND b<'10' AND c=1
} {/SEARCH TABLE t1 USING INDEX i1/}
-finish_test
+#-------------------------------------------------------------------------
+# By default, 16 non-periodic samples are collected for the stat4 table.
+# The following tests attempt to verify that the most common keys are
+# being collected.
+#
+proc check_stat4 {tn} {
+ db eval ANALYZE
+ db eval {SELECT a, b, c, d FROM t1} {
+ incr k($a)
+ incr k([list $a $b])
+ incr k([list $a $b $c])
+ if { [info exists k([list $a $b $c $d])]==0 } { incr nRow }
+ incr k([list $a $b $c $d])
+ }
+
+ set L [list]
+ foreach key [array names k] {
+ lappend L [list $k($key) $key]
+ }
+
+ set nSample $nRow
+ if {$nSample>16} {set nSample 16}
+
+ set nThreshold [lindex [lsort -decr -integer -index 0 $L] [expr $nSample-1] 0]
+ foreach key [array names k] {
+ if {$k($key)>$nThreshold} {
+ set expect($key) 1
+ }
+ if {$k($key)==$nThreshold} {
+ set possible($key) 1
+ }
+ }
+
+ set nPossible [expr $nSample - [llength [array names expect]]]
+
+ #puts "EXPECT: [array names expect]"
+ #puts "POSSIBLE($nPossible/[array size possible]): [array names possible]"
+ #puts "HAVE: [db eval {SELECT test_decode(sample) FROM sqlite_stat4 WHERE idx='i1'}]"
+
+ db eval {SELECT test_decode(sample) AS s FROM sqlite_stat4 WHERE idx='i1'} {
+ set seen 0
+ for {set i 0} {$i<4} {incr i} {
+ unset -nocomplain expect([lrange $s 0 $i])
+ if {[info exists possible([lrange $s 0 $i])]} {
+ set seen 1
+ unset -nocomplain possible([lrange $s 0 $i])
+ }
+ }
+ if {$seen} {incr nPossible -1}
+ }
+ if {$nPossible<0} {set nPossible 0}
+
+ set res [list [llength [array names expect]] $nPossible]
+ uplevel [list do_test $tn [list set {} $res] {0 0}]
+}
+
+drop_all_tables
+do_test 14.1.1 {
+ execsql {
+ CREATE TABLE t1(a,b,c,d);
+ CREATE INDEX i1 ON t1(a,b,c,d);
+ }
+ for {set i 0} {$i < 160} {incr i} {
+ execsql { INSERT INTO t1 VALUES($i,$i,$i,$i) }
+ if {($i % 10)==0} { execsql { INSERT INTO t1 VALUES($i,$i,$i,$i) } }
+ }
+} {}
+check_stat4 14.1.2
+
+do_test 14.2.1 {
+ execsql { DELETE FROM t1 }
+ for {set i 0} {$i < 1600} {incr i} {
+ execsql { INSERT INTO t1 VALUES($i/10,$i/17,$i/27,$i/37) }
+ }
+} {}
+check_stat4 14.2.2
+
+do_test 14.3.1 {
+ for {set i 0} {$i < 10} {incr i} {
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ execsql { INSERT INTO t1 VALUES($i*50,$i*50,$i*50,$i*50) }
+ }
+} {}
+check_stat4 14.3.2
+
+finish_test