diff options
author | drh <> | 2022-04-30 00:06:52 +0000 |
---|---|---|
committer | drh <> | 2022-04-30 00:06:52 +0000 |
commit | a25bbaf74a697b0ba59d11a75fd78a349f3e581d (patch) | |
tree | 127f5b99c80ce991340d93f313aab2f14b094086 /src/wherecode.c | |
parent | c64f0e71c1e148c261970f79b213937ffc9866c5 (diff) | |
download | sqlite-a25bbaf74a697b0ba59d11a75fd78a349f3e581d.tar.gz sqlite-a25bbaf74a697b0ba59d11a75fd78a349f3e581d.zip |
Further improvements to codeEqualityTerm() for cases when an IN operator with
a right-hand side subquery is used as a constraint that needs to be processed
by the RIGHT JOIN non-matched logic.
FossilOrigin-Name: bb2798be3fb5737827eec505db2d4c8cb510d227d98fc26ce748bf2da7e8b382
Diffstat (limited to 'src/wherecode.c')
-rw-r--r-- | src/wherecode.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/wherecode.c b/src/wherecode.c index 2cd61a35b..5e6852f55 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -610,17 +610,25 @@ static int codeEqualityTerm( iTab = 0; if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); - }else if( pTerm->pExpr->iTable==0 ){ - 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); - pTerm->pExpr->iTable = iTab; + }else{ + 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; + pExpr->op2 = eType; + } + sqlite3ExprDelete(db, pX); + }else{ + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + iTab = pExpr->iTable; + eType = pExpr->op2; } - sqlite3ExprDelete(db, pX); - pX = pTerm->pExpr; + pX = pExpr; } if( eType==IN_INDEX_INDEX_DESC ){ |