diff options
author | drh <> | 2022-05-02 15:10:38 +0000 |
---|---|---|
committer | drh <> | 2022-05-02 15:10:38 +0000 |
commit | 85f93850f7589e27fca2f41789525e9ccca2fb65 (patch) | |
tree | f85c86b2855a6e34242cb7b7b40cbbcc3c9f2c83 /src/wherecode.c | |
parent | 08e1a6a29b58ea62df1197a9e91f8c63b246cf25 (diff) | |
parent | 3a45d30ea5eff2c17c5ee1561e12f0865ad75b3e (diff) | |
download | sqlite-85f93850f7589e27fca2f41789525e9ccca2fb65.tar.gz sqlite-85f93850f7589e27fca2f41789525e9ccca2fb65.zip |
Merge the latest trunk fixes and enhancements into the right-join branch.
FossilOrigin-Name: afbcf075c1e09ae064c7b16e63501cd1d374711812664aef76bd35d02d64a2b6
Diffstat (limited to 'src/wherecode.c')
-rw-r--r-- | src/wherecode.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/wherecode.c b/src/wherecode.c index 3ea6c5d8e..d4470ac4d 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -611,16 +611,22 @@ static int codeEqualityTerm( if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ - sqlite3 *db = pParse->db; - pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); - - if( !db->mallocFailed ){ + Expr *pExpr = pTerm->pExpr; + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + pExpr->iTable = iTab; + } + sqlite3ExprDelete(db, pX); + }else{ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); - pTerm->pExpr->iTable = iTab; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP|IN_INDEX_REUSE_CUR, 0, aiMap,&iTab); + iTab = pExpr->iTable; } - sqlite3ExprDelete(db, pX); - pX = pTerm->pExpr; + pX = pExpr; } if( eType==IN_INDEX_INDEX_DESC ){ @@ -1247,6 +1253,7 @@ static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + pExpr = sqlite3ExprSkipCollate(pExpr); preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; |