aboutsummaryrefslogtreecommitdiff
path: root/src/walker.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-08-17 19:23:16 +0000
committerdrh <drh@noemail.net>2017-08-17 19:23:16 +0000
commitdceed86d07146bedbe8b54a613601d2db0d937f8 (patch)
tree5d70287f4477f66bfc6d61cc3418747f141214f7 /src/walker.c
parent6f7fbcf0bb90adbbf988bd2fbda7fa78a0baf89e (diff)
downloadsqlite-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.c26
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;
}