]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ignore any DISTINCT qualifier on a SELECT statement on the RHS of an IN(...) expressi...
authordan <Dan Kennedy>
Sat, 25 Jul 2026 14:49:40 +0000 (14:49 +0000)
committerdan <Dan Kennedy>
Sat, 25 Jul 2026 14:49:40 +0000 (14:49 +0000)
FossilOrigin-Name: c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a

manifest
manifest.uuid
src/expr.c
test/in4.test

index 8599fb9566807ff1bc9f5821ef2cd14c360bd498..4f6aa2de5de7b8a1ea58eb73a05c4ed942916ca1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sincompatibility\swith\sTcl\s9\sin\sscanstatus2.test.
-D 2026-07-24T16:28:47.830
+C Ignore\sany\sDISTINCT\squalifier\son\sa\sSELECT\sstatement\son\sthe\sRHS\sof\san\sIN(...)\sexpression.\sForum\spost\s[bugs:/info/2026-07-25T08:40:13Z\s|\s2026-07-25T08:40:13Z].
+D 2026-07-25T14:49:40.062
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -693,7 +693,7 @@ F src/date.c e1a002a4199bfa85e8778c0f72182c679580b131147d8e46d9221cfceffb8500
 F src/dbpage.c c6a9de13b0a01f0bc94a41e16213ab1ecd15ccfe86df7255ced40fda9446257d
 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
 F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451
-F src/expr.c fb5075dc231746e795817b096c39d0d1423d8ec29697e97959a50db84dcff211
+F src/expr.c f9bb5f7677dbc85fcb598c9444a5dafa0f21d9ae7b2d8f63fb3b2c36f6eb3cf6
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 931f74cec1dc8038a0217ef340c91ce147dd1bbed08dc40c47ee0ec6edfffb08
 F src/func.c 208b4d073a1e823df8d0e19d0529093c09a9984851dcfda9808445541cefe6d0
@@ -1290,7 +1290,7 @@ F test/imposter1.test 5a20b2cdeb53e65fc57cdb10a33750bd4ef6259909eaf1972253b9e79f
 F test/in.test edf979bff3244b9e47849e2b43886631354c8213791f42da92216f08012141af
 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0
-F test/in4.test e7b1456d423453884aeb9d68fafe9c8e7be7abddc8f028c04205e67820f10772
+F test/in4.test 6630816b7e59b7bd336b0a95cbf831dcf046d35b10ea987d6e69d223735f1887
 F test/in5.test 4fd79c70dfa0681313e8cdca07f5ff0400bdc0e20f808a5c59eaef1e4b48082a
 F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b
 F test/in7.test d9efdee00b074a60c6343993b2eda78bc369ab080dad864513c73f8aca89d566
@@ -2217,8 +2217,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 2cb22877683680c1f89bcc9edb47bd1a4a8755d4a6b846a1a20136a657dacdcc
-R 65549160c0c052b8f6b7cd57bb6323aa
+P 2f1f4f73535386549c12694dc57cfe555eec689ae6824c6241aaf8d5befcd74d
+R 281ba175d7dc74451cfbb28c113fac8a
 U dan
-Z b865688db0645fb9c83de093e62c13c9
+Z 48fef5873d55c06851c436c4fd093680
 # Remove this line to create a well-formed Fossil manifest.
index 0b0b124c3c74a84bc62133fdbdc99502567add73..e18d6760094a7658d628ae723a02035a431839e1 100644 (file)
@@ -1 +1 @@
-2f1f4f73535386549c12694dc57cfe555eec689ae6824c6241aaf8d5befcd74d
+c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a
index d549169593020b88cfa6e46adb1f625e058d484a..a02cbcb68a94e1a3b384a282b114fdca53842d23 100644 (file)
@@ -3081,10 +3081,8 @@ static Select *isCandidateForInOpt(const Expr *pX){
   if( ExprHasProperty(pX, EP_VarSelect)  ) return 0;  /* Correlated subq */
   p = pX->x.pSelect;
   if( p->pPrior ) return 0;              /* Not a compound SELECT */
-  if( p->selFlags & (SF_Distinct|SF_Aggregate) ){
-    testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );
-    testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );
-    return 0; /* No DISTINCT keyword and no aggregate functions */
+  if( p->selFlags & SF_Aggregate ){
+    return 0; /* No GROUP BY keyword or aggregate functions */
   }
   assert( p->pGroupBy==0 );              /* Has no GROUP BY clause */
   if( p->pLimit ) return 0;              /* Has no LIMIT clause */
index 07cd3e284d7e29a0de172fc30ab77aab9b411dd9..2aa51cc11050436f11fff8c0a3c4f29844fcef23 100644 (file)
@@ -517,4 +517,29 @@ do_execsql_test 13.0 {
    ORDER BY +id;
 } {10 1 2 5 20 1 3 5 30 1 2 4 40 1 3 4}
 
+#-------------------------------------------------------------------------
+# DISTINCT on the RHS of an IN(...) clause does not prevent it from
+# using an index.
+#
+reset_db
+do_execsql_test 14.0 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
+  CREATE TABLE t2(c INTEGER PRIMARY KEY, d);
+  CREATE TABLE t3(e INTEGER PRIMARY KEY, f);
+  CREATE INDEX t3f ON t3(f);
+}
+
+do_execsql_test 14.1 {
+  EXPLAIN SELECT count(*) FROM t2 WHERE d IN (SELECT DISTINCT a FROM t1)
+} [execsql {
+  EXPLAIN SELECT count(*) FROM t2 WHERE d IN (SELECT a FROM t1)
+}]
+
+do_execsql_test 14.2 {
+  EXPLAIN SELECT count(*) FROM t2 WHERE d IN (SELECT DISTINCT f FROM t3)
+} [execsql {
+  EXPLAIN SELECT count(*) FROM t2 WHERE d IN (SELECT f FROM t3)
+}]
+
+
 finish_test