mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-18 10:21:03 +03:00
Fix a performance regression caused by the previous commit.
FossilOrigin-Name: c4db0ad12d4f3d2800d36404f391b325cdc4aa7f8dcea93b2d63a489d9095ad4
This commit is contained in:
24
src/where.c
24
src/where.c
@@ -310,6 +310,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** This is whereScanInit() for the case of an index on an expression.
|
||||
** It is factored out into a separate tail-recursion subroutine so that
|
||||
** the normal whereScanInit() routine, which is a high-runner, does not
|
||||
** need to push registers onto the stack as part of its prologue.
|
||||
*/
|
||||
static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){
|
||||
pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr);
|
||||
return whereScanNext(pScan);
|
||||
}
|
||||
|
||||
/*
|
||||
** Initialize a WHERE clause scanner object. Return a pointer to the
|
||||
** first match. Return NULL if there are no matches.
|
||||
@@ -342,13 +353,19 @@ static WhereTerm *whereScanInit(
|
||||
pScan->pIdxExpr = 0;
|
||||
pScan->idxaff = 0;
|
||||
pScan->zCollName = 0;
|
||||
pScan->opMask = opMask;
|
||||
pScan->k = 0;
|
||||
pScan->aiCur[0] = iCur;
|
||||
pScan->nEquiv = 1;
|
||||
pScan->iEquiv = 1;
|
||||
if( pIdx ){
|
||||
int j = iColumn;
|
||||
iColumn = pIdx->aiColumn[j];
|
||||
if( iColumn==XN_EXPR ){
|
||||
pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr;
|
||||
pScan->zCollName = pIdx->azColl[j];
|
||||
pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr);
|
||||
pScan->aiColumn[0] = XN_EXPR;
|
||||
return whereScanInitIndexExpr(pScan);
|
||||
}else if( iColumn==pIdx->pTable->iPKey ){
|
||||
iColumn = XN_ROWID;
|
||||
}else if( iColumn>=0 ){
|
||||
@@ -358,12 +375,7 @@ static WhereTerm *whereScanInit(
|
||||
}else if( iColumn==XN_EXPR ){
|
||||
return 0;
|
||||
}
|
||||
pScan->opMask = opMask;
|
||||
pScan->k = 0;
|
||||
pScan->aiCur[0] = iCur;
|
||||
pScan->aiColumn[0] = iColumn;
|
||||
pScan->nEquiv = 1;
|
||||
pScan->iEquiv = 1;
|
||||
return whereScanNext(pScan);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user