-C Do\snot\sautomatically\sremove\sthe\sDISTINCT\skeyword\sfrom\s"a\sIN\s(SELECT\sDISTINCT\s...)"\sexpressions.\sFix\sfor\s[db87229497].
-D 2014-11-14T15:28:33.929
+C Consider\susing\san\sautomatic-index\sfor\sa\sscan\seven\sif\sthere\sexists\sa\spossible\sskip-scan\sthat\suses\sone\sor\smore\s"="\soperators.
+D 2014-11-14T19:34:20.967
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in a226317fdf3f4c895fb3cfedc355b4d0868ce1fb
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F src/wal.c fa090966140602f03a621f87d82ee69e66ca63b5
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
-F src/where.c 3862a1173ae2716bde12f1ab3fb649f1d85b05c2
+F src/where.c 4d72a350fd5eec080583f95044f0f394590d13a3
F src/whereInt.h d3633e9b592103241b74b0ec76185f3e5b8b62e0
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/autoinc.test c58912526998a39e11f66b533e23cfabea7f25b7
F test/autoindex1.test 6ff78b94f43a59616c06c11c55b12935173506d7
F test/autoindex2.test 60d2fc6f38364308ce73a9beb01b47ded38697de
-F test/autoindex3.test 8254f689c3241081fad52b7bea18ba53e07e14a2
+F test/autoindex3.test a3be0d1a53a7d2edff208a5e442312957047e972
F test/autoindex4.test fc807f9efd158bec60f5dfdf34ebe46fb274612d
F test/autovacuum.test 941892505d2c0f410a0cb5970dfa1c7c4e5f6e74
F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P ef03a203351a6002e2b1075139717e4234c816cd
-R bb54553354aa14551393c5e5701542c8
+P 55e453aadbb676dda07f0fa537d39ce184ef636c
+R 0a82574686b12650ce6ac2a5e463073b
+T *branch * experimental-autoindex-fix
+T *sym-experimental-autoindex-fix *
+T -sym-trunk *
U dan
-Z f91e19e3f2d1e58cdccd86465c86ab70
+Z 13c044e2b6669432b7a0bb70427e69a9
-55e453aadbb676dda07f0fa537d39ce184ef636c
\ No newline at end of file
+93642a65ef3d53ece322ffd85233b68fc9a86c9d
\ No newline at end of file
/* Any loop using an appliation-defined index (or PRIMARY KEY or
** UNIQUE constraint) with one or more == constraints is better
- ** than an automatic index. */
+ ** than an automatic index. Unless it is a skip-scan. */
if( (p->wsFlags & WHERE_AUTO_INDEX)!=0
+ && (pTemplate->nSkip)==0
&& (pTemplate->wsFlags & WHERE_INDEXED)!=0
&& (pTemplate->wsFlags & WHERE_COLUMN_EQ)!=0
&& (p->prereq & pTemplate->prereq)==pTemplate->prereq
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+set testprefix autoindex3
# The t1b and t2d indexes are not very selective. It used to be that
# the autoindex mechanism would create automatic indexes on t1(b) or
EXPLAIN QUERY PLAN SELECT * FROM t1, t2 WHERE d IN (5,b) AND x=y;
} {/AUTO/}
+reset_db
+do_execsql_test 210 {
+ CREATE TABLE v(b, d, e);
+ CREATE TABLE u(a, b, c);
+ ANALYZE sqlite_master;
+ INSERT INTO "sqlite_stat1" VALUES('u','uab','40000 400 1');
+ INSERT INTO "sqlite_stat1" VALUES('v','vbde','40000 400 1 1');
+ INSERT INTO "sqlite_stat1" VALUES('v','ve','40000 21');
+
+ CREATE INDEX uab on u(a, b);
+ CREATE INDEX ve on v(e);
+ CREATE INDEX vbde on v(b,d,e);
+
+ DROP TABLE IF EXISTS sqlite_stat4;
+ ANALYZE sqlite_master;
+}
+
+# At one point, SQLite was using the inferior plan:
+#
+# 0|0|1|SEARCH TABLE v USING INDEX ve (e>?)
+# 0|1|0|SEARCH TABLE u USING COVERING INDEX uab (ANY(a) AND b=?)
+#
+# on the basis that the real index "uab" must be better than the automatic
+# index. This is not right - a skip-scan is not necessarily better than an
+# automatic index scan.
+#
+do_eqp_test 220 {
+ select count(*) from u, v where u.b = v.b and v.e > 34;
+} {
+ 0 0 1 {SEARCH TABLE v USING INDEX ve (e>?)}
+ 0 1 0 {SEARCH TABLE u USING AUTOMATIC COVERING INDEX (b=?)}
+}
+
finish_test