From: dan Date: Sat, 25 Jul 2026 14:49:40 +0000 (+0000) Subject: Ignore any DISTINCT qualifier on a SELECT statement on the RHS of an IN(...) expressi... X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=c571cec033737fb2c2bbfd4bc9b87dbe93d0600c;p=thirdparty%2Fsqlite.git Ignore any DISTINCT qualifier on a SELECT statement on the RHS of an IN(...) expression. Forum post [bugs:/info/2026-07-25T08:40:13Z | 2026-07-25T08:40:13Z]. FossilOrigin-Name: c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a --- diff --git a/manifest b/manifest index 8599fb9566..4f6aa2de5d 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 0b0b124c3c..e18d676009 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2f1f4f73535386549c12694dc57cfe555eec689ae6824c6241aaf8d5befcd74d +c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a diff --git a/src/expr.c b/src/expr.c index d549169593..a02cbcb68a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -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 */ diff --git a/test/in4.test b/test/in4.test index 07cd3e284d..2aa51cc110 100644 --- a/test/in4.test +++ b/test/in4.test @@ -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