Index: third_party/sqlite/src/test/analyze3.test |
diff --git a/third_party/sqlite/src/test/analyze3.test b/third_party/sqlite/src/test/analyze3.test |
index 2378ffaaba9a129212d932d94dfa08fb8050856f..e7416d5730337d821be10f6c5480faa6599aa510 100644 |
--- a/third_party/sqlite/src/test/analyze3.test |
+++ b/third_party/sqlite/src/test/analyze3.test |
@@ -17,7 +17,7 @@ |
set testdir [file dirname $argv0] |
source $testdir/tester.tcl |
-ifcapable !stat2 { |
+ifcapable !stat4&&!stat3 { |
finish_test |
return |
} |
@@ -43,6 +43,8 @@ ifcapable !stat2 { |
# analyze3-5.*: Check that the query plans of applicable statements are |
# invalidated if the values of SQL parameter are modified |
# using the clear_bindings() or transfer_bindings() APIs. |
+# |
+# analyze3-6.*: Test that the problem fixed by commit [127a5b776d] is fixed. |
# |
proc getvar {varname} { uplevel #0 set $varname } |
@@ -70,7 +72,7 @@ proc sf_execsql {sql {db db}} { |
# Show that there are two possible plans for querying the table with |
# a range constraint on the indexed column - "full table scan" or "use |
# the index". When the range is specified using literal values, SQLite |
-# is able to pick the best plan based on the samples in sqlite_stat2. |
+# is able to pick the best plan based on the samples in sqlite_stat3. |
# |
# analyze3-1.1.4 - 3.1.9 |
# Show that using SQL variables produces the same results as using |
@@ -93,14 +95,29 @@ do_test analyze3-1.1.1 { |
COMMIT; |
ANALYZE; |
} |
-} {} |
+ ifcapable stat4 { |
+ execsql { SELECT count(*)>0 FROM sqlite_stat4; } |
+ } else { |
+ execsql { SELECT count(*)>0 FROM sqlite_stat3; } |
+ } |
+} {1} |
+ |
+do_execsql_test analyze3-1.1.x { |
+ SELECT count(*) FROM t1 WHERE x>200 AND x<300; |
+ SELECT count(*) FROM t1 WHERE x>0 AND x<1100; |
+} {99 1000} |
+ |
+# The first of the following two SELECT statements visits 99 rows. So |
+# it is better to use the index. But the second visits every row in |
+# the table (1000 in total) so it is better to do a full-table scan. |
+# |
do_eqp_test analyze3-1.1.2 { |
SELECT sum(y) FROM t1 WHERE x>200 AND x<300 |
-} {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (x>? AND x<?) (~100 rows)}} |
+} {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (x>? AND x<?)}} |
do_eqp_test analyze3-1.1.3 { |
SELECT sum(y) FROM t1 WHERE x>0 AND x<1100 |
-} {0 0 0 {SCAN TABLE t1 (~111 rows)}} |
+} {0 0 0 {SCAN TABLE t1}} |
do_test analyze3-1.1.4 { |
sf_execsql { SELECT sum(y) FROM t1 WHERE x>200 AND x<300 } |
@@ -144,12 +161,17 @@ do_test analyze3-1.2.1 { |
ANALYZE; |
} |
} {} |
+do_execsql_test analyze3-2.1.x { |
+ SELECT count(*) FROM t2 WHERE x>1 AND x<2; |
+ SELECT count(*) FROM t2 WHERE x>0 AND x<99; |
+} {200 990} |
do_eqp_test analyze3-1.2.2 { |
SELECT sum(y) FROM t2 WHERE x>1 AND x<2 |
-} {0 0 0 {SEARCH TABLE t2 USING INDEX i2 (x>? AND x<?) (~200 rows)}} |
+} {0 0 0 {SEARCH TABLE t2 USING INDEX i2 (x>? AND x<?)}} |
do_eqp_test analyze3-1.2.3 { |
SELECT sum(y) FROM t2 WHERE x>0 AND x<99 |
-} {0 0 0 {SCAN TABLE t2 (~111 rows)}} |
+} {0 0 0 {SCAN TABLE t2}} |
+ |
do_test analyze3-1.2.4 { |
sf_execsql { SELECT sum(y) FROM t2 WHERE x>12 AND x<20 } |
} {161 0 4760} |
@@ -191,12 +213,16 @@ do_test analyze3-1.3.1 { |
ANALYZE; |
} |
} {} |
+do_execsql_test analyze3-1.3.x { |
+ SELECT count(*) FROM t3 WHERE x>200 AND x<300; |
+ SELECT count(*) FROM t3 WHERE x>0 AND x<1100 |
+} {99 1000} |
do_eqp_test analyze3-1.3.2 { |
SELECT sum(y) FROM t3 WHERE x>200 AND x<300 |
-} {0 0 0 {SEARCH TABLE t3 USING INDEX i3 (x>? AND x<?) (~100 rows)}} |
+} {0 0 0 {SEARCH TABLE t3 USING INDEX i3 (x>? AND x<?)}} |
do_eqp_test analyze3-1.3.3 { |
SELECT sum(y) FROM t3 WHERE x>0 AND x<1100 |
-} {0 0 0 {SCAN TABLE t3 (~111 rows)}} |
+} {0 0 0 {SCAN TABLE t3}} |
do_test analyze3-1.3.4 { |
sf_execsql { SELECT sum(y) FROM t3 WHERE x>200 AND x<300 } |
@@ -248,10 +274,10 @@ do_test analyze3-2.1 { |
} {} |
do_eqp_test analyze3-2.2 { |
SELECT count(a) FROM t1 WHERE b LIKE 'a%' |
-} {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (b>? AND b<?) (~30000 rows)}} |
+} {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (b>? AND b<?)}} |
do_eqp_test analyze3-2.3 { |
SELECT count(a) FROM t1 WHERE b LIKE '%a' |
-} {0 0 0 {SCAN TABLE t1 (~500000 rows)}} |
+} {0 0 0 {SCAN TABLE t1}} |
do_test analyze3-2.4 { |
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' } |
@@ -310,7 +336,6 @@ do_test analyze3-3.1 { |
execsql COMMIT |
execsql ANALYZE |
} {} |
- |
do_test analyze3-3.2.1 { |
set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE b>?" -1 dummy] |
sqlite3_expired $S |
@@ -330,7 +355,7 @@ do_test analyze3-3.2.5 { |
do_test analyze3-3.2.6 { |
sqlite3_bind_text $S 1 "abc" 3 |
sqlite3_expired $S |
-} {0} |
+} {1} |
do_test analyze3-3.2.7 { |
sqlite3_finalize $S |
} {SQLITE_OK} |
@@ -612,4 +637,29 @@ do_test analyze3-5.1.3 { |
sqlite3_finalize $S1 |
} {SQLITE_OK} |
+#------------------------------------------------------------------------- |
+ |
+do_test analyze3-6.1 { |
+ execsql { DROP TABLE IF EXISTS t1 } |
+ execsql BEGIN |
+ execsql { CREATE TABLE t1(a, b, c) } |
+ for {set i 0} {$i < 1000} {incr i} { |
+ execsql "INSERT INTO t1 VALUES([expr $i/100], 'x', [expr $i/10])" |
+ } |
+ execsql { |
+ CREATE INDEX i1 ON t1(a, b); |
+ CREATE INDEX i2 ON t1(c); |
+ } |
+ execsql COMMIT |
+ execsql ANALYZE |
+} {} |
+ |
+do_eqp_test analyze3-6-3 { |
+ SELECT * FROM t1 WHERE a = 5 AND c = 13; |
+} {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}} |
+ |
+do_eqp_test analyze3-6-2 { |
+ SELECT * FROM t1 WHERE a = 5 AND b > 'w' AND c = 13; |
+} {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}} |
+ |
finish_test |