diff options
author | drh <> | 2023-03-03 15:12:46 +0000 |
---|---|---|
committer | drh <> | 2023-03-03 15:12:46 +0000 |
commit | dc81902445ae7f2446fc9f3575cb2c2b78b18341 (patch) | |
tree | cd9f6a9818a18463657bad71af2c5f719660c000 /src/expr.c | |
parent | 0b23765b6f23368a5664d879f1d65ee4631c6ce5 (diff) | |
download | sqlite-dc81902445ae7f2446fc9f3575cb2c2b78b18341.tar.gz sqlite-dc81902445ae7f2446fc9f3575cb2c2b78b18341.zip |
Do not use an expression index on a generated column if generated column
has the wrong affinity. dbsqlfuzz 65f5eb57f8859344d5f1f33e08c77ee12960ed83
FossilOrigin-Name: e95439119ac200cb47d0e277622f41ee7986b364487cd252b485ce5fa030d70f
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/expr.c b/src/expr.c index b688e5b40..6135da786 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4133,6 +4133,7 @@ static SQLITE_NOINLINE int sqlite3IndexedExprLookup( IndexedExpr *p; Vdbe *v; for(p=pParse->pIdxEpr; p; p=p->pIENext){ + u8 exprAff; int iDataCur = p->iDataCur; if( iDataCur<0 ) continue; if( pParse->iSelfTab ){ @@ -4140,6 +4141,16 @@ static SQLITE_NOINLINE int sqlite3IndexedExprLookup( iDataCur = -1; } if( sqlite3ExprCompare(0, pExpr, p->pExpr, iDataCur)!=0 ) continue; + assert( p->aff>=SQLITE_AFF_BLOB && p->aff<=SQLITE_AFF_NUMERIC ); + exprAff = sqlite3ExprAffinity(pExpr); + if( (exprAff<=SQLITE_AFF_BLOB && p->aff!=SQLITE_AFF_BLOB) + || (exprAff==SQLITE_AFF_TEXT && p->aff!=SQLITE_AFF_TEXT) + || (exprAff>=SQLITE_AFF_NUMERIC && p->aff!=SQLITE_AFF_NUMERIC) + ){ + /* Affinity mismatch on a generated column */ + continue; + } + v = pParse->pVdbe; assert( v!=0 ); if( p->bMaybeNullRow ){ |