aboutsummaryrefslogtreecommitdiff
path: root/src/walker.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2013-05-03 18:29:22 +0000
committerdrh <drh@noemail.net>2013-05-03 18:29:22 +0000
commitec7ecb8c9a42c68e6152f7e72b2badcbb8671c55 (patch)
treee0ff1a0cdbb5bafdea569c861d8913ef63d962fb /src/walker.c
parent16fb176814bd2b8fe46f7ed0e50a0b3d33db89a0 (diff)
parentbce5beee18befa9b3ee47938e9e4c3e2e572cf3c (diff)
downloadsqlite-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.c17
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--;