diff options
author | drh <drh@noemail.net> | 2018-09-20 19:02:15 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2018-09-20 19:02:15 +0000 |
commit | eda079cd2c8ac1217574cd372c7bbcf6f651ccab (patch) | |
tree | 1426ab64c86073c55d49fd39029c8cd092348dd8 /src/window.c | |
parent | 85c6892aa45dc0f476aa9bd772c678215f679853 (diff) | |
download | sqlite-eda079cd2c8ac1217574cd372c7bbcf6f651ccab.tar.gz sqlite-eda079cd2c8ac1217574cd372c7bbcf6f651ccab.zip |
Combine the Expr.pTab and Expr.pWin fields into a union named "y". Add a new
EP_WinFunc property that is only true if Expr.y.pWin is a valid pointer.
This reduces the size of the Expr object by 8 bytes, reduces the overall
amount of code, and shaves over 1 million cycles off of the speed test.
FossilOrigin-Name: ad130bb86e74e6ce165fdbdce3a19699510f0e62071c1c7923b5a4538d888c7c
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/window.c b/src/window.c index ce51de790..36cfc1c28 100644 --- a/src/window.c +++ b/src/window.c @@ -624,12 +624,12 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ switch( pExpr->op ){ case TK_FUNCTION: - if( pExpr->pWin==0 ){ + if( !ExprHasProperty(pExpr, EP_WinFunc) ){ break; }else{ Window *pWin; for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){ - if( pExpr->pWin==pWin ){ + if( pExpr->y.pWin==pWin ){ assert( pWin->pOwner==pExpr ); return WRC_Prune; } @@ -959,11 +959,13 @@ windowAllocErr: */ void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ if( p ){ + assert( p->op==TK_FUNCTION ); /* This routine is only called for the parser. If pWin was not ** allocated due to an OOM, then the parser would fail before ever ** invoking this routine */ if( ALWAYS(pWin) ){ - p->pWin = pWin; + p->y.pWin = pWin; + ExprSetProperty(p, EP_WinFunc); pWin->pOwner = p; if( p->flags & EP_Distinct ){ sqlite3ErrorMsg(pParse, @@ -2126,7 +2128,7 @@ static void windowCodeDefaultStep( */ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ Window *pNew = 0; - if( p ){ + if( ALWAYS(p) ){ pNew = sqlite3DbMallocZero(db, sizeof(Window)); if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); |