diff options
author | drh <drh@noemail.net> | 2013-12-20 13:11:45 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2013-12-20 13:11:45 +0000 |
commit | 7e61d18eb4dfaae65f151c8bd9ad01cde1e5bb58 (patch) | |
tree | 0ec6ffd153a1b0ab5efd8d8b59cb6658d9da8247 /src/select.c | |
parent | 1001ee8819a825d2b6076b7f4e98949deb1aef92 (diff) | |
download | sqlite-7e61d18eb4dfaae65f151c8bd9ad01cde1e5bb58.tar.gz sqlite-7e61d18eb4dfaae65f151c8bd9ad01cde1e5bb58.zip |
Simplify the accumulator reset for aggregate query processing so that it
uses a single multi-register OP_Null rather than a separate OP_Null for each
register.
FossilOrigin-Name: 2c7fd9b043f5f3d9d8e22dbefa84a9770ca951d0
Diffstat (limited to 'src/select.c')
-rw-r--r-- | src/select.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/select.c b/src/select.c index 132d54697..d07511674 100644 --- a/src/select.c +++ b/src/select.c @@ -3822,14 +3822,23 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ Vdbe *v = pParse->pVdbe; int i; struct AggInfo_func *pFunc; - if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ - return; - } + int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + if( nReg==0 ) return; +#ifdef SQLITE_DEBUG + /* Verify that all AggInfo registers are within the range specified by + ** AggInfo.mnReg..AggInfo.mxReg */ + assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 ); for(i=0; i<pAggInfo->nColumn; i++){ - sqlite3VdbeAddOp2(v, OP_Null, 0, pAggInfo->aCol[i].iMem); + assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg + && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg ); } + for(i=0; i<pAggInfo->nFunc; i++){ + assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg + && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg ); + } +#endif + sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){ - sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem); if( pFunc->iDistinct>=0 ){ Expr *pE = pFunc->pExpr; assert( !ExprHasProperty(pE, EP_xIsSelect) ); @@ -4407,6 +4416,7 @@ int sqlite3Select( sNC.pParse = pParse; sNC.pSrcList = pTabList; sNC.pAggInfo = &sAggInfo; + sAggInfo.mnReg = pParse->nMem+1; sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; sAggInfo.pGroupBy = pGroupBy; sqlite3ExprAnalyzeAggList(&sNC, pEList); @@ -4421,6 +4431,7 @@ int sqlite3Select( sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList); sNC.ncFlags &= ~NC_InAggFunc; } + sAggInfo.mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; /* Processing for aggregates with GROUP BY is very different and |