Index: third_party/sqlite/src/test/minmax.test |
diff --git a/third_party/sqlite/src/test/minmax.test b/third_party/sqlite/src/test/minmax.test |
index 599024508cda660cd3bcb1d031e1784aae516e2f..fb9bbb383a74e2427a35fe7ee221ba151626a35d 100644 |
--- a/third_party/sqlite/src/test/minmax.test |
+++ b/third_party/sqlite/src/test/minmax.test |
@@ -17,6 +17,7 @@ |
set testdir [file dirname $argv0] |
source $testdir/tester.tcl |
+set ::testprefix minmax |
do_test minmax-1.0 { |
execsql { |
@@ -299,7 +300,7 @@ ifcapable {compound && subquery} { |
SELECT max(rowid) FROM t4 UNION SELECT max(rowid) FROM t5 |
) |
} |
- } {1} |
+ } {{}} |
do_test minmax-9.2 { |
execsql { |
SELECT max(rowid) FROM ( |
@@ -536,7 +537,96 @@ do_test minmax-12.17 { |
} |
} {5} |
+#------------------------------------------------------------------------- |
+reset_db |
+ |
+proc do_test_13 {op name sql1 sql2 res} { |
+ set ::sqlite_search_count 0 |
+ uplevel [list do_execsql_test $name.1 $sql1 $res] |
+ set a $::sqlite_search_count |
+ |
+ set ::sqlite_search_count 0 |
+ uplevel [list do_execsql_test $name.2 $sql2 $res] |
+ set b $::sqlite_search_count |
+ |
+ uplevel [list do_test $name.3 [list expr "$a $op $b"] 1] |
+} |
+ |
+# Run a test named $name. Check that SQL statements $sql1 and $sql2 both |
+# return the same result, but that $sql2 increments the $sqlite_search_count |
+# variable more often (indicating that it is visiting more rows to determine |
+# the result). |
+# |
+proc do_test_13_opt {name sql1 sql2 res} { |
+ uplevel [list do_test_13 < $name $sql1 $sql2 $res] |
+} |
+ |
+# Like [do_test_13_noopt], except this time check that the $sqlite_search_count |
+# variable is incremented the same number of times by both SQL statements. |
+# |
+proc do_test_13_noopt {name sql1 sql2 res} { |
+ uplevel [list do_test_13 == $name $sql1 $sql2 $res] |
+} |
+ |
+do_execsql_test 13.1 { |
+ CREATE TABLE t1(a, b, c); |
+ INSERT INTO t1 VALUES('a', 1, 1); |
+ INSERT INTO t1 VALUES('b', 6, 6); |
+ INSERT INTO t1 VALUES('c', 5, 5); |
+ INSERT INTO t1 VALUES('a', 4, 4); |
+ INSERT INTO t1 VALUES('a', 5, 5); |
+ INSERT INTO t1 VALUES('c', 6, 6); |
+ INSERT INTO t1 VALUES('b', 4, 4); |
+ INSERT INTO t1 VALUES('c', 7, 7); |
+ INSERT INTO t1 VALUES('b', 2, 2); |
+ INSERT INTO t1 VALUES('b', 3, 3); |
+ INSERT INTO t1 VALUES('a', 3, 3); |
+ INSERT INTO t1 VALUES('b', 5, 5); |
+ INSERT INTO t1 VALUES('c', 4, 4); |
+ INSERT INTO t1 VALUES('c', 3, 3); |
+ INSERT INTO t1 VALUES('a', 2, 2); |
+ SELECT * FROM t1 ORDER BY a, b, c; |
+} {a 1 1 a 2 2 a 3 3 a 4 4 a 5 5 |
+ b 2 2 b 3 3 b 4 4 b 5 5 b 6 6 |
+ c 3 3 c 4 4 c 5 5 c 6 6 c 7 7 |
+} |
+do_execsql_test 13.2 { CREATE INDEX i1 ON t1(a, b, c) } |
+ |
+do_test_13_opt 13.3 { |
+ SELECT min(b) FROM t1 WHERE a='b' |
+} { |
+ SELECT min(c) FROM t1 WHERE a='b' |
+} {2} |
+ |
+do_test_13_opt 13.4 { |
+ SELECT a, min(b) FROM t1 WHERE a='b' |
+} { |
+ SELECT a, min(c) FROM t1 WHERE a='b' |
+} {b 2} |
+ |
+do_test_13_opt 13.4 { |
+ SELECT a||c, max(b)+4 FROM t1 WHERE a='c' |
+} { |
+ SELECT a||c, max(c)+4 FROM t1 WHERE a='c' |
+} {c7 11} |
+ |
+do_test_13_noopt 13.5 { |
+ SELECT a||c, max(b+1) FROM t1 WHERE a='c' |
+} { |
+ SELECT a||c, max(c+1) FROM t1 WHERE a='c' |
+} {c7 8} |
+ |
+do_test_13_noopt 13.6 { |
+ SELECT count(b) FROM t1 WHERE a='c' |
+} { |
+ SELECT count(c) FROM t1 WHERE a='c' |
+} {5} |
+do_test_13_noopt 13.7 { |
+ SELECT min(b), count(b) FROM t1 WHERE a='a'; |
+} { |
+ SELECT min(c), count(c) FROM t1 WHERE a='a'; |
+} {1 5} |
finish_test |