| Index: third_party/sqlite/src/src/walker.c
|
| diff --git a/third_party/sqlite/src/src/walker.c b/third_party/sqlite/src/src/walker.c
|
| index c95a9c169db3125ad877cca14d88abd13495ac21..e30bb60b5a493f19da3ddc117cf6b8d2c03e89c6 100644
|
| --- a/third_party/sqlite/src/src/walker.c
|
| +++ b/third_party/sqlite/src/src/walker.c
|
| @@ -19,7 +19,7 @@
|
|
|
| /*
|
| ** Walk an expression tree. Invoke the callback once for each node
|
| -** of the expression, while decending. (In other words, the callback
|
| +** of the expression, while descending. (In other words, the callback
|
| ** is invoked before visiting children.)
|
| **
|
| ** The return value from the callback should be one of the WRC_*
|
| @@ -43,7 +43,7 @@ int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){
|
| testcase( ExprHasProperty(pExpr, EP_Reduced) );
|
| rc = pWalker->xExprCallback(pWalker, pExpr);
|
| if( rc==WRC_Continue
|
| - && !ExprHasAnyProperty(pExpr,EP_TokenOnly) ){
|
| + && !ExprHasProperty(pExpr,EP_TokenOnly) ){
|
| if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort;
|
| if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort;
|
| if( ExprHasProperty(pExpr, EP_xIsSelect) ){
|
| @@ -113,7 +113,12 @@ int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
|
| /*
|
| ** Call sqlite3WalkExpr() for every expression in Select statement p.
|
| ** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and
|
| -** on the compound select chain, p->pPrior.
|
| +** on the compound select chain, p->pPrior.
|
| +**
|
| +** If it is not NULL, the xSelectCallback() callback is invoked before
|
| +** the walk of the expressions and FROM clause. The xSelectCallback2()
|
| +** method, if it is not NULL, is invoked following the walk of the
|
| +** expressions and FROM clause.
|
| **
|
| ** Return WRC_Continue under normal conditions. Return WRC_Abort if
|
| ** there is an abort request.
|
| @@ -123,14 +128,27 @@ int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
|
| */
|
| int sqlite3WalkSelect(Walker *pWalker, Select *p){
|
| int rc;
|
| - if( p==0 || pWalker->xSelectCallback==0 ) return WRC_Continue;
|
| + if( p==0 || (pWalker->xSelectCallback==0 && pWalker->xSelectCallback2==0) ){
|
| + return WRC_Continue;
|
| + }
|
| rc = WRC_Continue;
|
| - while( p ){
|
| - rc = pWalker->xSelectCallback(pWalker, p);
|
| - if( rc ) break;
|
| - if( sqlite3WalkSelectExpr(pWalker, p) ) return WRC_Abort;
|
| - if( sqlite3WalkSelectFrom(pWalker, p) ) return WRC_Abort;
|
| + pWalker->walkerDepth++;
|
| + while( p ){
|
| + if( pWalker->xSelectCallback ){
|
| + rc = pWalker->xSelectCallback(pWalker, p);
|
| + if( rc ) break;
|
| + }
|
| + if( sqlite3WalkSelectExpr(pWalker, p)
|
| + || sqlite3WalkSelectFrom(pWalker, p)
|
| + ){
|
| + pWalker->walkerDepth--;
|
| + return WRC_Abort;
|
| + }
|
| + if( pWalker->xSelectCallback2 ){
|
| + pWalker->xSelectCallback2(pWalker, p);
|
| + }
|
| p = p->pPrior;
|
| }
|
| + pWalker->walkerDepth--;
|
| return rc & WRC_Abort;
|
| }
|
|
|