From b592d47a810f5f782522a26b877e90505ef77514 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 6 Jan 2020 17:33:09 +0000 Subject: [PATCH] Do not attempt to use the skip-scan optimization if prior terms of the index are already used for non-equality constraints. Ticket [304017f5f04a0035] FossilOrigin-Name: d7126a9ced86cb0934d5bde2bf535e6b529c361444c99e723f29dd3eb36e7044 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 6 ++++-- test/skipscan1.test | 21 +++++++++++++++++++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 536ec1d9b4..18452b6c0a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthe\sSF_Aggregate\sflag\son\sa\sSELECT\sstatement\sis\sset\sif\sa\sDISTINCT\sis\stransformed\sto\sa\sGROUP\sBY.\sTicket\s[9c944882]. -D 2020-01-06T17:06:12.101 +C Do\snot\sattempt\sto\suse\sthe\sskip-scan\soptimization\sif\sprior\sterms\sof\sthe\nindex\sare\salready\sused\sfor\snon-equality\sconstraints.\nTicket\s[304017f5f04a0035] +D 2020-01-06T17:33:09.190 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 4ca6c066554247a69dc54616755f68c301c16e23ec36d40170f07763fd0737b3 +F src/where.c df2bea0e0122e853d9f1a8ec68920744166d2a524e338eba92e5470538ecd1f9 F src/whereInt.h e1d1db6bbec0ba4f345acc338f956c8237a6f06413afa68c6414e82fb5b06745 F src/wherecode.c 75ad6cbb8dfe585ffe0fc71008750b5158fc4811c3a498327033920b18f0a4be F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1340,7 +1340,7 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test 2a64ca7b3e6246bb86b47c9051bfd324603b1b60675fe606513535267713e080 +F test/skipscan1.test ed524bc86f27646b3a297f45d6557b55db338977b6838f8064b196b35848b31b F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 46f8ef70fb8b3ae00cc081b280f3dff38b1d0f1b52a8f4477ec89dec32e4d813 -R 28c300f982e3504535dbaf5798fe1687 -U dan -Z 066ef948a76ae495e0e47b3f62fda826 +P 1409758f72c0206cc48f9f7e789382472949523b7056ea46f8dcb93fd3ea60c6 +R bd298e40a86eebf6b18fcd31345471e7 +U drh +Z 45dcdf5551f03c892f39822b38628702 diff --git a/manifest.uuid b/manifest.uuid index a9c784b0ca..dc57a3ce65 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1409758f72c0206cc48f9f7e789382472949523b7056ea46f8dcb93fd3ea60c6 \ No newline at end of file +d7126a9ced86cb0934d5bde2bf535e6b529c361444c99e723f29dd3eb36e7044 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 075276168c..7fb27191a3 100644 --- a/src/where.c +++ b/src/where.c @@ -2431,8 +2431,9 @@ static int whereLoopAddBtreeIndex( pNew = pBuilder->pNew; if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; - WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d\n", - pProbe->pTable->zName,pProbe->zName, pNew->u.btree.nEq)); + WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d, nSkip=%d\n", + pProbe->pTable->zName,pProbe->zName, + pNew->u.btree.nEq, pNew->nSkip)); assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 ); assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 ); @@ -2729,6 +2730,7 @@ static int whereLoopAddBtreeIndex( assert( 42==sqlite3LogEst(18) ); if( saved_nEq==saved_nSkip && saved_nEq+1nKeyCol + && saved_nEq==pNew->nLTerm && pProbe->noSkipScan==0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ diff --git a/test/skipscan1.test b/test/skipscan1.test index da9df8fe5e..367cd2a108 100644 --- a/test/skipscan1.test +++ b/test/skipscan1.test @@ -398,4 +398,25 @@ do_eqp_test skipscan1-3.2 { `--USE TEMP B-TREE FOR DISTINCT } +# 2020-01-06 ticket 304017f5f04a0035 +# +reset_db +do_execsql_test skipscan1-4.10 { + CREATE TABLE t1(a,b INT); + INSERT INTO t1(a,b) VALUES(1,2),(3,3),(4,5); + CREATE UNIQUE INDEX i1 ON t1(b,b,a,a,a,a,a,b,a); + ANALYZE; + DROP TABLE IF EXISTS sqlite_stat4; + INSERT INTO sqlite_stat1 VALUES('t1','i1','30 30 30 2 2 2 2 2 2 2'); + ANALYZE sqlite_master; + + SELECT DISTINCT a + FROM t1 + WHERE a = b + AND a = 3 + AND b IN (1,3,2,4) + AND b >= 0 + AND a <= 10; +} {3} + finish_test