aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <>2023-03-03 15:12:46 +0000
committerdrh <>2023-03-03 15:12:46 +0000
commitdc81902445ae7f2446fc9f3575cb2c2b78b18341 (patch)
treecd9f6a9818a18463657bad71af2c5f719660c000 /src/expr.c
parent0b23765b6f23368a5664d879f1d65ee4631c6ce5 (diff)
downloadsqlite-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.c11
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 ){