diff options
author | drh <drh@noemail.net> | 2020-04-06 20:35:52 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2020-04-06 20:35:52 +0000 |
commit | 4047bdfd2c38b141b991ebaf3ada7666edc8fdc1 (patch) | |
tree | 9b209ead7c17b564fa9b93e68e214ac7364356bd /src/resolve.c | |
parent | d44390c8c54268e1651fafb9ee738574947aceba (diff) | |
download | sqlite-4047bdfd2c38b141b991ebaf3ada7666edc8fdc1.tar.gz sqlite-4047bdfd2c38b141b991ebaf3ada7666edc8fdc1.zip |
Performance improvement in sqlite3ResolveExprNameList().
FossilOrigin-Name: 7e170e67f24c7cdef7e7ceac4e0b81a75382618e4abe9e604f3d7f6db9dc6396
Diffstat (limited to 'src/resolve.c')
-rw-r--r-- | src/resolve.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/resolve.c b/src/resolve.c index 5877dfa37..60fed0b10 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1831,11 +1831,41 @@ int sqlite3ResolveExprListNames( ExprList *pList /* The expression list to be analyzed. */ ){ int i; - if( pList ){ - for(i=0; i<pList->nExpr; i++){ - if( sqlite3ResolveExprNames(pNC, pList->a[i].pExpr) ) return WRC_Abort; + int savedHasAgg = 0; + Walker w; + if( pList==0 ) return WRC_Continue; + w.pParse = pNC->pParse; + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.u.pNC = pNC; + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + for(i=0; i<pList->nExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + if( pExpr==0 ) continue; +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight += pExpr->nHeight; + if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + return WRC_Abort; + } +#endif + sqlite3WalkExpr(&w, pExpr); +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight -= pExpr->nHeight; +#endif + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin) ){ + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); + savedHasAgg |= pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); } + if( pNC->nErr>0 || w.pParse->nErr>0 ) return WRC_Abort; } + pNC->ncFlags |= savedHasAgg; return WRC_Continue; } |