]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Adding the "noskipscan" token to an sqlite_stat1.stat field prevents an noskipscan-token
authordrh <drh@noemail.net>
Sat, 15 Nov 2014 19:08:13 +0000 (19:08 +0000)
committerdrh <drh@noemail.net>
Sat, 15 Nov 2014 19:08:13 +0000 (19:08 +0000)
index for being used with the skip-scan algorithm.

FossilOrigin-Name: 00fe09505792cd0d104b2da9d040f023e30fa871

manifest
manifest.uuid
src/analyze.c
src/sqliteInt.h
src/where.c
test/skipscan1.test

index 1b20e13d733869debb1640131c9e42187f847373..1c607eedd4c332e327fc35381e0be75e219c9e1d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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 Adding\sthe\s"noskipscan"\stoken\sto\san\ssqlite_stat1.stat\sfield\sprevents\san\nindex\sfor\sbeing\sused\swith\sthe\sskip-scan\salgorithm.
+D 2014-11-15T19:08:13.305
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in a226317fdf3f4c895fb3cfedc355b4d0868ce1fb
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -167,7 +167,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
 F src/alter.c ba266a779bc7ce10e52e59e7d3dc79fa342e8fdb
-F src/analyze.c afbcca663c3f3625340b8e30d440cd7a97ded6bc
+F src/analyze.c 951fd859852dfbced4a58b73954f168eeb9d0772
 F src/attach.c f4e94df2d1826feda65eb0939f7f6f5f923a0ad9
 F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240
 F src/backup.c 7ddee9c7d505e07e959a575b18498f17c71e53ea
@@ -233,7 +233,7 @@ F src/shell.c bc28d5992109717c87804e2eb1a08a7c8cc7a2fd
 F src/sqlite.h.in 0c5c0df7e4e436dfc5592511325bf4a96f6a638d
 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
 F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d
-F src/sqliteInt.h 71b0bf1a7fc55b5cb374f7579fd140e730a6e0f4
+F src/sqliteInt.h c9e95b8fa9aee30d46387735c5be73fa58886e38
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 81712116e826b0089bb221b018929536b2b5406f
 F src/table.c f142bba7903e93ca8d113a5b8877a108ad1a27dc
@@ -304,7 +304,7 @@ F src/vtab.c 2a30791bbd7926b589401bd09c3abb33de563793
 F src/wal.c fa090966140602f03a621f87d82ee69e66ca63b5
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
-F src/where.c 3862a1173ae2716bde12f1ab3fb649f1d85b05c2
+F src/where.c cb89128d24ddb5fe3ca290166d66968f2dc0c3c8
 F src/whereInt.h d3633e9b592103241b74b0ec76185f3e5b8b62e0
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -855,7 +855,7 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868
 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
-F test/skipscan1.test 7e15e1cc524524e7b2c4595ec85c75501d22f4ff
+F test/skipscan1.test 2ddfe5d168462170c4487f534e2a99fb006b2076
 F test/skipscan2.test d1d1450952b7275f0b0a3a981f0230532743951a
 F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5
 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2
@@ -1221,7 +1221,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P ef03a203351a6002e2b1075139717e4234c816cd
-R bb54553354aa14551393c5e5701542c8
-U dan
-Z f91e19e3f2d1e58cdccd86465c86ab70
+P 55e453aadbb676dda07f0fa537d39ce184ef636c
+R 59717354988087765927b6c6b6246253
+T *branch * noskipscan-token
+T *sym-noskipscan-token *
+T -sym-trunk *
+U drh
+Z 9d226c4fa6bf82a1f1a22a271191f33c
index c5dbef8e09990186780cb63752dbcd3c8d1efbbb..1ab180da3686ad9e00542bb289477182a9c97cd3 100644 (file)
@@ -1 +1 @@
-55e453aadbb676dda07f0fa537d39ce184ef636c
\ No newline at end of file
+00fe09505792cd0d104b2da9d040f023e30fa871
\ No newline at end of file
index 597885237c71e151f307cf1e9ade82afae5afb75..769a16565ad62de272d1fe78d2cdb69fadfbb620 100644 (file)
@@ -1466,6 +1466,8 @@ static void decodeIntArray(
       pIndex->bUnordered = 1;
     }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){
       pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3));
+    }else if( sqlite3_strglob("noskipscan*", z)==0 ){
+      pIndex->noSkipScan = 1;
     }
 #ifdef SQLITE_ENABLE_COSTMULT
     else if( sqlite3_strglob("costmult=[0-9]*",z)==0 ){
index 4d272b06a15a31b78ba24ce837c55df7c2f4fe1e..f3d6ce015e31ce438238edb40cc73b43d231c869 100644 (file)
@@ -1795,6 +1795,7 @@ struct Index {
   unsigned uniqNotNull:1;  /* True if UNIQUE and NOT NULL for all columns */
   unsigned isResized:1;    /* True if resizeIndexObject() has been called */
   unsigned isCovering:1;   /* True if this is a covering index */
+  unsigned noSkipScan:1;   /* Do not try to use skip-scan if true */
 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4
   int nSample;             /* Number of elements in aSample[] */
   int nSampleCol;          /* Size of IndexSample.anEq[] and so on */
index c3641c7cc742a3cc308acef7dee5ce15949d3cfc..db6cf94deae325e575449494d2709621ad813146 100644 (file)
@@ -4587,6 +4587,7 @@ static int whereLoopAddBtreeIndex(
   assert( 42==sqlite3LogEst(18) );
   if( saved_nEq==saved_nSkip
    && saved_nEq+1<pProbe->nKeyCol
+   && pProbe->noSkipScan==0
    && pProbe->aiRowLogEst[saved_nEq+1]>=42  /* TUNING: Minimum for skip-scan */
    && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK
   ){
index 6b9f1209a5b5e899a288da4a7e8f0ee4eb99f5c1..4f996df97223f2892924a6c887c7ef25eea6764e 100644 (file)
@@ -273,4 +273,23 @@ do_execsql_test skipscan1-6.3 {
   EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1;
 } {~/ANY/}
 
+# If the sqlite_stat1 entry includes the "noskipscan" token, then never use
+# skipscan with that index.
+#
+do_execsql_test skipscan1-7.1 {
+  UPDATE sqlite_stat1 SET stat='500000 125000 1 sz=100';
+  ANALYZE sqlite_master;
+  EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1;
+} {/ANY/}
+do_execsql_test skipscan1-7.2 {
+  UPDATE sqlite_stat1 SET stat='500000 125000 1 noskipscan sz=100';
+  ANALYZE sqlite_master;
+  EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1;
+} {~/ANY/}
+do_execsql_test skipscan1-7.3 {
+  UPDATE sqlite_stat1 SET stat='500000 125000 1 sz=100 noskipscan';
+  ANALYZE sqlite_master;
+  EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1;
+} {~/ANY/}
+
 finish_test