]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Consider an index for queries like "SELECT count(DISTINCT col) FROM ...", even if...
authordan <Dan Kennedy>
Mon, 29 Jan 2024 19:30:16 +0000 (19:30 +0000)
committerdan <Dan Kennedy>
Mon, 29 Jan 2024 19:30:16 +0000 (19:30 +0000)
FossilOrigin-Name: ad06868807a27f0c96fa5649ebd981e07909eb2c5e03781377c876fdec49abdc

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

index 60e0deb91e77b82c5ae9484be6643f5e59124a48..bd32d81585617e2255dcfcd90579341c260fba58 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\sa\spotential\sbuffer\soverread\swhen\shandling\scorrupt\sjson\sblobs.
-D 2024-01-29T15:30:35.428
+C Consider\san\sindex\sfor\squeries\slike\s"SELECT\scount(DISTINCT\scol)\sFROM\s...",\seven\sif\sthe\sindex\srecords\sare\snot\ssmaller\sthan\sthe\stable\srecords.
+D 2024-01-29T19:30:16.573
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -823,7 +823,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c 887fc4ca3f020ebb2e376f222069570834ac63bf50111ef0cbf3ae417048ed89
 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
 F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2
-F src/where.c 56277e7110e6c81918434908bb7d597b917adfa9a176f5d95eb954b93dbc57b8
+F src/where.c e38e37677884d644b825fe0ab72379a24a9a74f89d8add5eb134d61fea2358a3
 F src/whereInt.h 82a13766f13d1a53b05387c2e60726289ef26404bc7b9b1f7770204d97357fb8
 F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1
 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00
@@ -1056,7 +1056,7 @@ F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a199
 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e
 F test/distinct.test 691c9e850b0d0b56b66e7e235453198cb4cf0760e324b7403d3c5abbeab0a014
 F test/distinct2.test bb71cc7b5e58e895787f9910a788c254f679928d324732d063fe9bc202ecbe71
-F test/distinctagg.test ad2b4cf1483cd4cf24867dfafbfa0abb61184d92085fcc9784cea0592b278d64
+F test/distinctagg.test 40d7169ae5846caaf62c6e307d2ca3c333daf9b6f7cde888956a339a97afe85f
 F test/e_blobbytes.test 4c01dfe4f12087b92b20705a3fdfded45dc4ed16d5a211fed4e1d2786ba68a52
 F test/e_blobclose.test 692fc02a058476c2222a63d97e3f3b2b809c1842e5525ded7f854d540ac2e075
 F test/e_blobopen.test 29f6055ee453b8e679fe9570c4d3acfedbef821622c5dad16875148c5952ef50
@@ -2161,8 +2161,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b0eb279ea83c1c788c39fb90e178ec99fa4c782195c376a420c661fedf4545a7
-R 3e003ebc54133c42f113fbce024a5a22
+P 738473dc0ac353731080d0785cc7dc9810b564906c176916bd91d6cfbb1a7b18
+R f1c37c0e5edda3118ed05f6a7a2d3df0
 U dan
-Z b1da7a8f3b87229f95a14c44f483cdeb
+Z 6c6c135247ccb8a93d3af9a3896ff5b2
 # Remove this line to create a well-formed Fossil manifest.
index 60d0910ce9c8565e21f7b91354b0abfd17f0b858..1ec528d5a16d46a1c67ede0539ef986229b37535 100644 (file)
@@ -1 +1 @@
-738473dc0ac353731080d0785cc7dc9810b564906c176916bd91d6cfbb1a7b18
\ No newline at end of file
+ad06868807a27f0c96fa5649ebd981e07909eb2c5e03781377c876fdec49abdc
\ No newline at end of file
index 77813666e61962c572de69756e45ab3bacda1ceb..b0fe12e52bd4a9d49c7b5b12d1fbb62e7b9086ae 100644 (file)
@@ -3362,7 +3362,9 @@ static int indexMightHelpWithOrderBy(
   for(ii=0; ii<pOB->nExpr; ii++){
     Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr);
     if( NEVER(pExpr==0) ) continue;
-    if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){
+    if( (pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN) 
+     && pExpr->iTable==iCursor 
+    ){
       if( pExpr->iColumn<0 ) return 1;
       for(jj=0; jj<pIndex->nKeyCol; jj++){
         if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1;
index 199ca0666ef69ae2e72b908d43a188f9737b506b..9eedd35bd2cf34dea7d29da97123f0fea5c18ea6 100644 (file)
@@ -95,7 +95,7 @@ foreach {tn use_eph sql res} {
   7  0  "SELECT count(DISTINCT a) FROM t2, t1"            5
   8  1  "SELECT count(DISTINCT a+b) FROM t1, t2, t2, t2"  6
   9  0  "SELECT count(DISTINCT c) FROM t1 WHERE c=2"      1
- 10  1  "SELECT count(DISTINCT t1.rowid) FROM t1, t2"    10
+ 10  0  "SELECT count(DISTINCT t1.rowid) FROM t1, t2"    10
 } {
   do_test 3.$tn.1 {
     set prg [db eval "EXPLAIN $sql"]
@@ -148,6 +148,10 @@ do_execsql_test 3.0 {
   CREATE TABLE t3(x, y, z);
   INSERT INTO t3 VALUES(1,1,1);
   INSERT INTO t3 VALUES(2,2,2);
+
+  CREATE TABLE t4(a);
+  CREATE INDEX t4a ON t4(a);
+  INSERT INTO t4 VALUES(1), (2), (2), (3), (1);
 }
 
 foreach {tn use_eph sql res} {
@@ -158,6 +162,9 @@ foreach {tn use_eph sql res} {
   4 0  "SELECT count(DISTINCT f) FROM t2 GROUP BY d, e" {1 2 2 3}
   5 1  "SELECT count(DISTINCT f) FROM t2 GROUP BY d" {2 3}
   6 0  "SELECT count(DISTINCT f) FROM t2 WHERE d IS 1 GROUP BY e" {1 2 2}
+
+  7 0  "SELECT count(DISTINCT a) FROM t1" {4}
+  8 0  "SELECT count(DISTINCT a) FROM t4" {3}
 } {
   do_test 4.$tn.1 {
     set prg [db eval "EXPLAIN $sql"]