aboutsummaryrefslogtreecommitdiff
path: root/src/wherecode.c
diff options
context:
space:
mode:
authordrh <>2022-04-30 00:06:52 +0000
committerdrh <>2022-04-30 00:06:52 +0000
commita25bbaf74a697b0ba59d11a75fd78a349f3e581d (patch)
tree127f5b99c80ce991340d93f313aab2f14b094086 /src/wherecode.c
parentc64f0e71c1e148c261970f79b213937ffc9866c5 (diff)
downloadsqlite-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.c28
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 ){