]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improved fix for ticket [ced41c7c7d6b4d36] that keeps skip-scan enabled,
authordrh <drh@noemail.net>
Tue, 30 Jul 2019 14:22:10 +0000 (14:22 +0000)
committerdrh <drh@noemail.net>
Tue, 30 Jul 2019 14:22:10 +0000 (14:22 +0000)
but avoids identifying a skip-scan as order-distinct (because it is not)
and thus forces a separate b-tree to implement the DISTINCT clause of a
query.  This undoes check-in [a871d69c6de65038] and substitutes a new fix.

FossilOrigin-Name: 89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70

manifest
manifest.uuid
src/where.c
test/skipscan1.test

index f940ffbed65ce89b58929b011bac47b436ea11b1..ae8a1b31d895a8344e7240a18508b0ad81891aa8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Disable\sthe\sskip-scan\soptimization\sfor\sDISTINCT\squeries.\nFix\sfor\sticket\s[ced41c7c7d6b4d36]
-D 2019-07-30T01:17:03.473
+C Improved\sfix\sfor\sticket\s[ced41c7c7d6b4d36]\sthat\skeeps\sskip-scan\senabled,\nbut\savoids\sidentifying\sa\sskip-scan\sas\sorder-distinct\s(because\sit\sis\snot)\nand\sthus\sforces\sa\sseparate\sb-tree\sto\simplement\sthe\sDISTINCT\sclause\sof\sa\nquery.\s\sThis\sundoes\scheck-in\s[a871d69c6de65038]\sand\ssubstitutes\sa\snew\sfix.
+D 2019-07-30T14:22:10.200
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d
 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
 F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd
-F src/where.c 03125c703ae26ae6ec32bc2e5563b38e41082c120d6d6e526c5f0174ce1cbd93
+F src/where.c 01b68cfc7f8a6eba6a0a10b24b7ab3ec11f7244830791560119e14680c756078
 F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3
 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a
 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326
@@ -1329,7 +1329,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 64ad7a05a3c336e0280ac277c656b029d723071a18afc22beb3e352058e05c03
+F test/skipscan1.test acbde73b530bfc6618626abebad8868d86cc737c61a52a204fdcd02ded049936
 F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d
 F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5
 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2
@@ -1838,7 +1838,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 48b518eb6f76fb0beb161d1ebcf3b793efc36262d6d77a1ad5906b6501138e28
-R cc614d2cc68120f92ad0f4eec7ab3887
+P a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe
+R 277630844b23a68da6a6e28edcb71a9f
 U drh
-Z 570b02f38ebd5b0effe898329e81f79a
+Z 6873f4d0939662a6f4dc4c5cfa6fb08a
index ace1a0b23df6cb836729c1b71b23b61731463813..9a232bb1b5fb3e0019cc8884bae179644ff175a9 100644 (file)
@@ -1 +1 @@
-a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe
\ No newline at end of file
+89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70
\ No newline at end of file
index 27c407976a4118d068afcfb79c1924f754f2b20c..b8778a663347fa4e255a403cf0c8557d2b95bfd0 100644 (file)
@@ -2723,7 +2723,6 @@ static int whereLoopAddBtreeIndex(
    && pProbe->noSkipScan==0
    && OptimizationEnabled(db, SQLITE_SkipScan)
    && pProbe->aiRowLogEst[saved_nEq+1]>=42  /* TUNING: Minimum for skip-scan */
-   && (pWInfo->wctrlFlags & (WHERE_WANT_DISTINCT|WHERE_DISTINCTBY))==0
    && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK
   ){
     LogEst nIter;
@@ -3745,7 +3744,8 @@ static i8 wherePathSatisfiesOrderBy(
         assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) );
         assert( pIndex->aiColumn[nColumn-1]==XN_ROWID
                           || !HasRowid(pIndex->pTable));
-        isOrderDistinct = IsUniqueIndex(pIndex);
+        isOrderDistinct = IsUniqueIndex(pIndex)
+                          && (pLoop->wsFlags & WHERE_SKIPSCAN)==0;
       }
 
       /* Loop through all columns of the index and deal with the ones
index ad3b82db78e6571d051790daccd447d490f285b5..3722cbda065e46011b6cc8eb55c4fe143488e871 100644 (file)
@@ -374,20 +374,29 @@ do_execsql_test skipscan1-2.3 {
 } {}
 
 # 2019-07-29 Ticket ced41c7c7d6b4d36
-# Skip-scan is disabled for DISTINCT queries
+# A skipscan query is not order-distinct
 #
 db close
 sqlite3 db :memory:
 do_execsql_test skipscan1-3.1 {
   CREATE TABLE t1 (c1, c2, c3, c4, PRIMARY KEY(c4, c3));
-  INSERT INTO t1 VALUES(NULL,0,1,NULL);
-  INSERT INTO t1 VALUES(0,NULL,1,NULL);
-  INSERT INTO t1 VALUES(NULL,NULL,1,NULL);
+  INSERT INTO t1 VALUES(3,0,1,NULL);
+  INSERT INTO t1 VALUES(0,4,1,NULL);
+  INSERT INTO t1 VALUES(5,6,1,NULL);
+  INSERT INTO t1 VALUES(0,4,1,NULL);
   ANALYZE sqlite_master;
   INSERT INTO sqlite_stat1 VALUES('t1','sqlite_autoindex_t1_1','18 18 6');
   ANALYZE sqlite_master;
   SELECT DISTINCT quote(c1), quote(c2), quote(c3), quote(c4), '|'
     FROM t1 WHERE t1.c3 = 1;
-} {NULL 0 1 NULL | 0 NULL 1 NULL | NULL NULL 1 NULL |}
+} {3 0 1 NULL | 0 4 1 NULL | 5 6 1 NULL |}
+do_eqp_test skipscan1-3.2 {
+  SELECT DISTINCT quote(c1), quote(c2), quote(c3), quote(c4), '|'
+    FROM t1 WHERE t1.c3 = 1;
+} {
+  QUERY PLAN
+  |--SEARCH TABLE t1 USING INDEX sqlite_autoindex_t1_1 (ANY(c4) AND c3=?)
+  `--USE TEMP B-TREE FOR DISTINCT
+}
 
 finish_test