]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem where an expression like (a, b) IN (SELECT ...) might not use an index...
authordan <Dan Kennedy>
Sat, 20 Apr 2024 15:14:06 +0000 (15:14 +0000)
committerdan <Dan Kennedy>
Sat, 20 Apr 2024 15:14:06 +0000 (15:14 +0000)
FossilOrigin-Name: 4d870fd8b5450047a7486fc023d1ac9439642e8ed91eadfd5026c4cda7cc9179

manifest
manifest.uuid
src/where.c

index 98a7d3badaadcb84eac479efcabe5e37e5a69599..5c55caac4b37416415b7183b0898d20dc9882b1d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Correct\shandling\sof\sOUTER\sJOIN\swhen\son\sor\sthe\sother\soperand\sis\sa\ssubquery\nimplemented\susing\sthe\sVALUES-as-coroutine\soptimization.\ndbsqlfuzz\sbde3bf80aedf25afa56e2997a0545a314765d3f8.
-D 2024-04-18T16:11:01.833
+C Fix\sa\sproblem\swhere\san\sexpression\slike\s(a,\sb)\sIN\s(SELECT\s...)\smight\snot\suse\san\sindex\son\s(a,\sb)\sif\sthe\saffinities\sand\scollation\ssequences\sof\s"a"\sand\s"b"\sare\snot\sidentical.
+D 2024-04-20T15:14:06.554
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -835,7 +835,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 40ee94edd4cf31e6dc3e4c9ac814777b8cf4dc8ee985d87eb5f77bd4c42e69da
+F src/where.c b4eb20a2e5f74e299cb19095454dd257292ad2a23a90265a9eecd2390fd0552a
 F src/whereInt.h 82a13766f13d1a53b05387c2e60726289ef26404bc7b9b1f7770204d97357fb8
 F src/wherecode.c 4b5909be0c36030eec18ea0e7a64c60254180a21e626c9d2e0e9be3007ad47c1
 F src/whereexpr.c 7b64295f1d82ad0928df435925dd7bbd5997b44a026153113eace0d9e71ff435
@@ -2184,8 +2184,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 6b21cccdeec92db9f6ce3dd7ea5e61b8b46650cc1e550271aa51bdc619f55b11
-R 742e51db40c512171314564bf9760205
-U drh
-Z 2a179895cc5d13f95288c795c253907b
+P 8c0f69e0e4ae0a446838cc193bfd4395fd251f3c7659b35ac388e5a0a7650a66
+R 76aaae3efae57f02d5fc2e79c67a8826
+T *branch * vector-in-fix
+T *sym-vector-in-fix *
+T -sym-trunk *
+U dan
+Z 8e2ed7e86b55b55a9e6d2d789c1dac73
 # Remove this line to create a well-formed Fossil manifest.
index 2e5a76fc98c16a27af1ef3199fa4ae7a414dabac..c480de9800a3fbb56468159688688a1ae05b9776 100644 (file)
@@ -1 +1 @@
-8c0f69e0e4ae0a446838cc193bfd4395fd251f3c7659b35ac388e5a0a7650a66
\ No newline at end of file
+4d870fd8b5450047a7486fc023d1ac9439642e8ed91eadfd5026c4cda7cc9179
\ No newline at end of file
index 93984347b75757f2f5b6a600621a008a5ed7d767..f6b0990e6704000304fb7c4e1843989f5d040b29 100644 (file)
@@ -302,6 +302,28 @@ static Expr *whereRightSubexprIsColumn(Expr *p){
   return 0;
 }
 
+static int SQLITE_NOINLINE indexInAffinityOk(
+  Parse *pParse, 
+  WhereTerm *pTerm, 
+  u8 idxaff, 
+  CollSeq **ppColl
+){
+  Expr *pX = pTerm->pExpr;
+  Expr inexpr;
+
+  if( sqlite3ExprIsVector(pX->pLeft) ){
+    int iField = pTerm->u.x.iField - 1;
+    inexpr.op = TK_EQ;
+    inexpr.pLeft = pX->pLeft->x.pList->a[iField].pExpr;
+    assert( ExprUseXSelect(pX) );
+    inexpr.pRight = pX->x.pSelect->pEList->a[iField].pExpr;
+    pX = &inexpr;
+  }
+
+  *ppColl = sqlite3ExprCompareCollSeq(pParse, pX);
+  return sqlite3IndexAffinityOk(pX, idxaff);
+}
+
 /*
 ** Advance to the next WhereTerm that matches according to the criteria
 ** established when the pScan object was initialized by whereScanInit().
@@ -355,11 +377,19 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
               CollSeq *pColl;
               Parse *pParse = pWC->pWInfo->pParse;
               pX = pTerm->pExpr;
-              if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){
-                continue;
+
+              if( (pTerm->eOperator & WO_IN) ){
+                if( !indexInAffinityOk(pParse, pTerm, pScan->idxaff, &pColl) ){
+                  continue;
+                }
+              }else{
+                if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){
+                  continue;
+                }
+                assert(pX->pLeft);
+                pColl = sqlite3ExprCompareCollSeq(pParse, pX);
               }
-              assert(pX->pLeft);
-              pColl = sqlite3ExprCompareCollSeq(pParse, pX);
+
               if( pColl==0 ) pColl = pParse->db->pDfltColl;
               if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){
                 continue;