diff options
author | drh <drh@noemail.net> | 2013-05-03 18:29:22 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2013-05-03 18:29:22 +0000 |
commit | ec7ecb8c9a42c68e6152f7e72b2badcbb8671c55 (patch) | |
tree | e0ff1a0cdbb5bafdea569c861d8913ef63d962fb /src/walker.c | |
parent | 16fb176814bd2b8fe46f7ed0e50a0b3d33db89a0 (diff) | |
parent | bce5beee18befa9b3ee47938e9e4c3e2e572cf3c (diff) | |
download | sqlite-ec7ecb8c9a42c68e6152f7e72b2badcbb8671c55.tar.gz sqlite-ec7ecb8c9a42c68e6152f7e72b2badcbb8671c55.zip |
Merge all recent trunk changes into the sessions branch.
FossilOrigin-Name: 3879ab1b532828fcc12a50a95b6730faebcb69e9
Diffstat (limited to 'src/walker.c')
-rw-r--r-- | src/walker.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/walker.c b/src/walker.c index eab96ea24..e71ed2ac4 100644 --- a/src/walker.c +++ b/src/walker.c @@ -113,7 +113,9 @@ 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. Invoke the xSelectCallback() +** either before or after the walk of expressions and FROM clause, depending +** on whether pWalker->bSelectDepthFirst is false or true, respectively. ** ** Return WRC_Continue under normal conditions. Return WRC_Abort if ** there is an abort request. @@ -127,14 +129,23 @@ int sqlite3WalkSelect(Walker *pWalker, Select *p){ rc = WRC_Continue; pWalker->walkerDepth++; while( p ){ - rc = pWalker->xSelectCallback(pWalker, p); - if( rc ) break; + if( !pWalker->bSelectDepthFirst ){ + rc = pWalker->xSelectCallback(pWalker, p); + if( rc ) break; + } if( sqlite3WalkSelectExpr(pWalker, p) || sqlite3WalkSelectFrom(pWalker, p) ){ pWalker->walkerDepth--; return WRC_Abort; } + if( pWalker->bSelectDepthFirst ){ + rc = pWalker->xSelectCallback(pWalker, p); + /* Depth-first search is currently only used for + ** selectAddSubqueryTypeInfo() and that routine always returns + ** WRC_Continue (0). So the following branch is never taken. */ + if( NEVER(rc) ) break; + } p = p->pPrior; } pWalker->walkerDepth--; |