diff options
author | drh <drh@noemail.net> | 2017-08-17 19:23:16 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2017-08-17 19:23:16 +0000 |
commit | dceed86d07146bedbe8b54a613601d2db0d937f8 (patch) | |
tree | 5d70287f4477f66bfc6d61cc3418747f141214f7 /src/walker.c | |
parent | 6f7fbcf0bb90adbbf988bd2fbda7fa78a0baf89e (diff) | |
download | sqlite-dceed86d07146bedbe8b54a613601d2db0d937f8.tar.gz sqlite-dceed86d07146bedbe8b54a613601d2db0d937f8.zip |
Small optimization in the Expr tree walker.
FossilOrigin-Name: 264a5e1b75ee073bd019483e289c3d8d79abcf5a765435be23ac3c21b1db8246
Diffstat (limited to 'src/walker.c')
-rw-r--r-- | src/walker.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/walker.c b/src/walker.c index 2e292295d..49f9fa189 100644 --- a/src/walker.c +++ b/src/walker.c @@ -40,18 +40,22 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ int rc; testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); testcase( ExprHasProperty(pExpr, EP_Reduced) ); - rc = pWalker->xExprCallback(pWalker, pExpr); - if( rc ) return rc & WRC_Abort; - if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ - if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; - assert( pExpr->x.pList==0 || pExpr->pRight==0 ); - if( pExpr->pRight ){ - if( walkExpr(pWalker, pExpr->pRight) ) return WRC_Abort; - }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; - }else if( pExpr->x.pList ){ - if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + while(1){ + rc = pWalker->xExprCallback(pWalker, pExpr); + if( rc ) return rc & WRC_Abort; + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; + assert( pExpr->x.pList==0 || pExpr->pRight==0 ); + if( pExpr->pRight ){ + pExpr = pExpr->pRight; + continue; + }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; + }else if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } } + break; } return WRC_Continue; } |