aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <>2022-10-18 16:47:41 +0000
committerdrh <>2022-10-18 16:47:41 +0000
commita331cf7e5792949ada1371bf61fdbf3b26e9d8d5 (patch)
tree2b0c09f80ee4d86affb541a3a4481a80e955c594 /src/expr.c
parent9489e0a5d71361b790fea4060ef525b6e265f4be (diff)
downloadsqlite-a331cf7e5792949ada1371bf61fdbf3b26e9d8d5.tar.gz
sqlite-a331cf7e5792949ada1371bf61fdbf3b26e9d8d5.zip
Fix the indexed expression resolver for generated columns so that it picks
the correct table in a self-join. FossilOrigin-Name: 54c3eb085aca92da2b819f3532ee4750b377265f7e1e914600ea3c3d535efe51
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/expr.c b/src/expr.c
index 30f9031e2..c2e399f11 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -4057,8 +4057,13 @@ static SQLITE_NOINLINE int sqlite3IndexedExprLookup(
IndexedExpr *p;
Vdbe *v;
for(p=pParse->pIdxExpr; p; p=p->pIENext){
- if( p->iDataCur<0 ) continue;
- if( sqlite3ExprCompare(0, pExpr, p->pExpr, p->iDataCur)!=0 ) continue;
+ int iDataCur = p->iDataCur;
+ if( iDataCur<0 ) continue;
+ if( pParse->iSelfTab ){
+ if( p->iDataCur!=pParse->iSelfTab-1 ) continue;
+ iDataCur = -1;
+ }
+ if( sqlite3ExprCompare(0, pExpr, p->pExpr, iDataCur)!=0 ) continue;
v = pParse->pVdbe;
assert( v!=0 );
if( p->bMaybeNullRow ){
@@ -4108,17 +4113,14 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
assert( target>0 && target<=pParse->nMem );
assert( v!=0 );
- if( pParse->pIdxExpr!=0
- && pExpr!=0
+expr_code_doover:
+ if( pExpr==0 ){
+ op = TK_NULL;
+ }else if( pParse->pIdxExpr!=0
&& !ExprHasProperty(pExpr, EP_Leaf)
&& (r1 = sqlite3IndexedExprLookup(pParse, pExpr, target))>=0
){
return r1;
- }
-
-expr_code_doover:
- if( pExpr==0 ){
- op = TK_NULL;
}else{
assert( !ExprHasVVAProperty(pExpr,EP_Immutable) );
op = pExpr->op;