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