aboutsummaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2018-09-20 19:02:15 +0000
committerdrh <drh@noemail.net>2018-09-20 19:02:15 +0000
commiteda079cd2c8ac1217574cd372c7bbcf6f651ccab (patch)
tree1426ab64c86073c55d49fd39029c8cd092348dd8 /src/window.c
parent85c6892aa45dc0f476aa9bd772c678215f679853 (diff)
downloadsqlite-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.c10
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);