15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2008 August 16
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains routines used for walking the parser tree for
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an SQL statement.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree.  Invoke the callback once for each node
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the expression, while decending.  (In other words, the callback
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is invoked before visiting children.)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The return value from the callback should be one of the WRC_*
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** constants to specify how to proceed with the walk.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    WRC_Continue      Continue descending down the tree.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    WRC_Prune         Do not descend into child nodes.  But allow
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                      the walk to continue with sibling nodes.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    WRC_Abort         Do no more callbacks.  Unwind the stack and
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                      return the top-level walk call.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The return value from this routine is WRC_Abort to abandon the tree walk
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and WRC_Continue to continue.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr==0 ) return WRC_Continue;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( ExprHasProperty(pExpr, EP_TokenOnly) );
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( ExprHasProperty(pExpr, EP_Reduced) );
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = pWalker->xExprCallback(pWalker, pExpr);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==WRC_Continue
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              && !ExprHasAnyProperty(pExpr,EP_TokenOnly) ){
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( ExprHasProperty(pExpr, EP_xIsSelect) ){
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc & WRC_Abort;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call sqlite3WalkExpr() for every expression in list p or until
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an abort request is seen.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3WalkExprList(Walker *pWalker, ExprList *p){
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExprList_item *pItem;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3WalkExpr(pWalker, pItem->pExpr) ) return WRC_Abort;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WRC_Continue;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk all expressions associated with SELECT statement p.  Do
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not invoke the SELECT callback on p, but do (of course) invoke
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any expr callbacks and SELECT callbacks that come from subqueries.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return WRC_Abort or WRC_Continue.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExprList(pWalker, p->pEList) ) return WRC_Abort;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExpr(pWalker, p->pWhere) ) return WRC_Abort;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExprList(pWalker, p->pGroupBy) ) return WRC_Abort;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WRC_Continue;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk the parse trees associated with all subqueries in the
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** FROM clause of SELECT statement p.  Do not invoke the select
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** callback on p, but do invoke it on each FROM clause subquery
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and on any subqueries further down in the tree.  Return
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WRC_Abort or WRC_Continue;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pSrc;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SrcList_item *pItem;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pSrc = p->pSrc;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pSrc) ){
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3WalkSelect(pWalker, pItem->pSelect) ){
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return WRC_Abort;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WRC_Continue;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call sqlite3WalkExpr() for every expression in Select statement p.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the compound select chain, p->pPrior.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return WRC_Continue under normal conditions.  Return WRC_Abort if
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** there is an abort request.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the Walker does not have an xSelectCallback() then this routine
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a no-op returning WRC_Continue.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3WalkSelect(Walker *pWalker, Select *p){
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || pWalker->xSelectCallback==0 ) return WRC_Continue;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = WRC_Continue;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( p  ){
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = pWalker->xSelectCallback(pWalker, p);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc ) break;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3WalkSelectExpr(pWalker, p) ) return WRC_Abort;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3WalkSelectFrom(pWalker, p) ) return WRC_Abort;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = p->pPrior;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc & WRC_Abort;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
137