/ Hex Artifact Content
Login

Artifact e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 16.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75 74 69 6e   contains routin
0190: 65 73 20 75 73 65 64 20 66 6f 72 20 77 61 6c 6b  es used for walk
01a0: 69 6e 67 20 74 68 65 20 70 61 72 73 65 72 20 74  ing the parser t
01b0: 72 65 65 20 66 6f 72 0a 2a 2a 20 61 6e 20 53 51  ree for.** an SQ
01c0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
01d0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
01e0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
01f0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0200: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0210: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
0220: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
0230: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
0240: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
0250: 63 68 20 6e 6f 64 65 0a 2a 2a 20 6f 66 20 74 68  ch node.** of th
0260: 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 77 68  e expression, wh
0270: 69 6c 65 20 64 65 63 65 6e 64 69 6e 67 2e 20 20  ile decending.  
0280: 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
0290: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a   the callback.**
02a0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 65 66 6f   is invoked befo
02b0: 72 65 20 76 69 73 69 74 69 6e 67 20 63 68 69 6c  re visiting chil
02c0: 64 72 65 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  dren.).**.** The
02d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
02e0: 6f 6d 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  om the callback 
02f0: 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
0300: 20 74 68 65 20 57 52 43 5f 2a 0a 2a 2a 20 63 6f   the WRC_*.** co
0310: 6e 73 74 61 6e 74 73 20 74 6f 20 73 70 65 63 69  nstants to speci
0320: 66 79 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 65  fy how to procee
0330: 64 20 77 69 74 68 20 74 68 65 20 77 61 6c 6b 2e  d with the walk.
0340: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 52 43 5f 43 6f  .**.**    WRC_Co
0350: 6e 74 69 6e 75 65 20 20 20 20 20 20 43 6f 6e 74  ntinue      Cont
0360: 69 6e 75 65 20 64 65 73 63 65 6e 64 69 6e 67 20  inue descending 
0370: 64 6f 77 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  down the tree..*
0380: 2a 0a 2a 2a 20 20 20 20 57 52 43 5f 50 72 75 6e  *.**    WRC_Prun
0390: 65 20 20 20 20 20 20 20 20 20 44 6f 20 6e 6f 74  e         Do not
03a0: 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 63 68   descend into ch
03b0: 69 6c 64 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  ild nodes.  But 
03c0: 61 6c 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  allow.**        
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
03e0: 65 20 77 61 6c 6b 20 74 6f 20 63 6f 6e 74 69 6e  e walk to contin
03f0: 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 20  ue with sibling 
0400: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  nodes..**.**    
0410: 57 52 43 5f 41 62 6f 72 74 20 20 20 20 20 20 20  WRC_Abort       
0420: 20 20 44 6f 20 6e 6f 20 6d 6f 72 65 20 63 61 6c    Do no more cal
0430: 6c 62 61 63 6b 73 2e 20 20 55 6e 77 69 6e 64 20  lbacks.  Unwind 
0440: 74 68 65 20 73 74 61 63 6b 20 61 6e 64 0a 2a 2a  the stack and.**
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0460: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
0470: 20 74 6f 70 2d 6c 65 76 65 6c 20 77 61 6c 6b 20   top-level walk 
0480: 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  call..**.** The 
0490: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
04a0: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
04b0: 73 20 57 52 43 5f 41 62 6f 72 74 20 74 6f 20 61  s WRC_Abort to a
04c0: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
04d0: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 57 52 43 5f  walk.** and WRC_
04e0: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 63 6f 6e 74  Continue to cont
04f0: 69 6e 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  inue..*/.int sql
0500: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 57 61 6c  ite3WalkExpr(Wal
0510: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
0520: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
0530: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78 70  t rc;.  if( pExp
0540: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
0550: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 74 65  C_Continue;.  te
0560: 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73 50  stcase( ExprHasP
0570: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0580: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
0590: 20 20 74 65 73 74 63 61 73 65 28 20 45 78 70 72    testcase( Expr
05a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
05b0: 72 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  r, EP_Reduced) )
05c0: 3b 0a 20 20 72 63 20 3d 20 70 57 61 6c 6b 65 72  ;.  rc = pWalker
05d0: 2d 3e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 28  ->xExprCallback(
05e0: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  pWalker, pExpr);
05f0: 0a 20 20 69 66 28 20 72 63 3d 3d 57 52 43 5f 43  .  if( rc==WRC_C
0600: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20  ontinue.        
0610: 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
0620: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0630: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
0640: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0650: 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65 72  WalkExpr(pWalker
0660: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  , pExpr->pLeft) 
0670: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
0680: 72 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  rt;.    if( sqli
0690: 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c  te3WalkExpr(pWal
06a0: 6b 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  ker, pExpr->pRig
06b0: 68 74 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ht) ) return WRC
06c0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
06d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
06e0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
06f0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ect) ){.      if
0700: 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  ( sqlite3WalkSel
0710: 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ect(pWalker, pEx
0720: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 20 29  pr->x.pSelect) )
0730: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
0740: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
0750: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
0760: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c  alkExprList(pWal
0770: 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ker, pExpr->x.pL
0780: 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 57 52  ist) ) return WR
0790: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
07a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26   }.  return rc &
07b0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f   WRC_Abort;.}../
07c0: 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
07d0: 33 57 61 6c 6b 45 78 70 72 28 29 20 66 6f 72 20  3WalkExpr() for 
07e0: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
07f0: 20 69 6e 20 6c 69 73 74 20 70 20 6f 72 20 75 6e   in list p or un
0800: 74 69 6c 0a 2a 2a 20 61 6e 20 61 62 6f 72 74 20  til.** an abort 
0810: 72 65 71 75 65 73 74 20 69 73 20 73 65 65 6e 2e  request is seen.
0820: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0830: 61 6c 6b 45 78 70 72 4c 69 73 74 28 57 61 6c 6b  alkExprList(Walk
0840: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
0850: 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 6e 74  rList *p){.  int
0860: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
0870: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
0880: 6d 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  m;.  if( p ){.  
0890: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72    for(i=p->nExpr
08a0: 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e  , pItem=p->a; i>
08b0: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
08c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
08d0: 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c  te3WalkExpr(pWal
08e0: 6b 65 72 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  ker, pItem->pExp
08f0: 72 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  r) ) return WRC_
0900: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
0910: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
0920: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
0930: 20 57 61 6c 6b 20 61 6c 6c 20 65 78 70 72 65 73   Walk all expres
0940: 73 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  sions associated
0950: 20 77 69 74 68 20 53 45 4c 45 43 54 20 73 74 61   with SELECT sta
0960: 74 65 6d 65 6e 74 20 70 2e 20 20 44 6f 0a 2a 2a  tement p.  Do.**
0970: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 74 68 65 20   not invoke the 
0980: 53 45 4c 45 43 54 20 63 61 6c 6c 62 61 63 6b 20  SELECT callback 
0990: 6f 6e 20 70 2c 20 62 75 74 20 64 6f 20 28 6f 66  on p, but do (of
09a0: 20 63 6f 75 72 73 65 29 20 69 6e 76 6f 6b 65 0a   course) invoke.
09b0: 2a 2a 20 61 6e 79 20 65 78 70 72 20 63 61 6c 6c  ** any expr call
09c0: 62 61 63 6b 73 20 61 6e 64 20 53 45 4c 45 43 54  backs and SELECT
09d0: 20 63 61 6c 6c 62 61 63 6b 73 20 74 68 61 74 20   callbacks that 
09e0: 63 6f 6d 65 20 66 72 6f 6d 20 73 75 62 71 75 65  come from subque
09f0: 72 69 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ries..** Return 
0a00: 57 52 43 5f 41 62 6f 72 74 20 6f 72 20 57 52 43  WRC_Abort or WRC
0a10: 5f 43 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 69 6e  _Continue..*/.in
0a20: 74 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  t sqlite3WalkSel
0a30: 65 63 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  ectExpr(Walker *
0a40: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
0a50: 2a 70 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *p){.  if( sqlit
0a60: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  e3WalkExprList(p
0a70: 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 45 4c 69 73  Walker, p->pELis
0a80: 74 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  t) ) return WRC_
0a90: 41 62 6f 72 74 3b 0a 20 20 69 66 28 20 73 71 6c  Abort;.  if( sql
0aa0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61  ite3WalkExpr(pWa
0ab0: 6c 6b 65 72 2c 20 70 2d 3e 70 57 68 65 72 65 29  lker, p->pWhere)
0ac0: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
0ad0: 6f 72 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ort;.  if( sqlit
0ae0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  e3WalkExprList(p
0af0: 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 47 72 6f 75  Walker, p->pGrou
0b00: 70 42 79 29 20 29 20 72 65 74 75 72 6e 20 57 52  pBy) ) return WR
0b10: 43 5f 41 62 6f 72 74 3b 0a 20 20 69 66 28 20 73  C_Abort;.  if( s
0b20: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 70  qlite3WalkExpr(p
0b30: 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69  Walker, p->pHavi
0b40: 6e 67 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ng) ) return WRC
0b50: 5f 41 62 6f 72 74 3b 0a 20 20 69 66 28 20 73 71  _Abort;.  if( sq
0b60: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
0b70: 74 28 70 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 4f  t(pWalker, p->pO
0b80: 72 64 65 72 42 79 29 20 29 20 72 65 74 75 72 6e  rderBy) ) return
0b90: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 69 66   WRC_Abort;.  if
0ba0: 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  ( sqlite3WalkExp
0bb0: 72 28 70 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 4c  r(pWalker, p->pL
0bc0: 69 6d 69 74 29 20 29 20 72 65 74 75 72 6e 20 57  imit) ) return W
0bd0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 69 66 28 20  RC_Abort;.  if( 
0be0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
0bf0: 70 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 4f 66 66  pWalker, p->pOff
0c00: 73 65 74 29 20 29 20 72 65 74 75 72 6e 20 57 52  set) ) return WR
0c10: 43 5f 41 62 6f 72 74 3b 0a 20 20 72 65 74 75 72  C_Abort;.  retur
0c20: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
0c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68  }../*.** Walk th
0c40: 65 20 70 61 72 73 65 20 74 72 65 65 73 20 61 73  e parse trees as
0c50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6c  sociated with al
0c60: 6c 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  l subqueries in 
0c70: 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
0c80: 73 65 20 6f 66 20 53 45 4c 45 43 54 20 73 74 61  se of SELECT sta
0c90: 74 65 6d 65 6e 74 20 70 2e 20 20 44 6f 20 6e 6f  tement p.  Do no
0ca0: 74 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 65 6c  t invoke the sel
0cb0: 65 63 74 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  ect.** callback 
0cc0: 6f 6e 20 70 2c 20 62 75 74 20 64 6f 20 69 6e 76  on p, but do inv
0cd0: 6f 6b 65 20 69 74 20 6f 6e 20 65 61 63 68 20 46  oke it on each F
0ce0: 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
0cf0: 65 72 79 0a 2a 2a 20 61 6e 64 20 6f 6e 20 61 6e  ery.** and on an
0d00: 79 20 73 75 62 71 75 65 72 69 65 73 20 66 75 72  y subqueries fur
0d10: 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ther down in the
0d20: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 0a   tree.  Return .
0d30: 2a 2a 20 57 52 43 5f 41 62 6f 72 74 20 6f 72 20  ** WRC_Abort or 
0d40: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 2a 2f  WRC_Continue;.*/
0d50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 6b  .int sqlite3Walk
0d60: 53 65 6c 65 63 74 46 72 6f 6d 28 57 61 6c 6b 65  SelectFrom(Walke
0d70: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
0d80: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
0d90: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
0da0: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
0db0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
0dc0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
0dd0: 63 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  c;.  if( ALWAYS(
0de0: 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
0df0: 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
0e00: 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
0e10: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
0e20: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
0e30: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
0e40: 61 6c 6b 65 72 2c 20 70 49 74 65 6d 2d 3e 70 53  alker, pItem->pS
0e50: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
0e60: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
0e70: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
0e80: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
0e90: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 20 0a  RC_Continue;.} .
0ea0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
0eb0: 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 66 6f  te3WalkExpr() fo
0ec0: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
0ed0: 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 73 74 61  on in Select sta
0ee0: 74 65 6d 65 6e 74 20 70 2e 0a 2a 2a 20 49 6e 76  tement p..** Inv
0ef0: 6f 6b 65 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  oke sqlite3WalkS
0f00: 65 6c 65 63 74 28 29 20 66 6f 72 20 73 75 62 71  elect() for subq
0f10: 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
0f20: 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a  OM clause and.**
0f30: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   on the compound
0f40: 20 73 65 6c 65 63 74 20 63 68 61 69 6e 2c 20 70   select chain, p
0f50: 2d 3e 70 50 72 69 6f 72 2e 20 20 49 6e 76 6f 6b  ->pPrior.  Invok
0f60: 65 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  e the xSelectCal
0f70: 6c 62 61 63 6b 28 29 0a 2a 2a 20 65 69 74 68 65  lback().** eithe
0f80: 72 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  r before or afte
0f90: 72 20 74 68 65 20 77 61 6c 6b 20 6f 66 20 65 78  r the walk of ex
0fa0: 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 46 52  pressions and FR
0fb0: 4f 4d 20 63 6c 61 75 73 65 2c 20 64 65 70 65 6e  OM clause, depen
0fc0: 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ding.** on wheth
0fd0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 62 53 65 6c  er pWalker->bSel
0fe0: 65 63 74 44 65 70 74 68 46 69 72 73 74 20 69 73  ectDepthFirst is
0ff0: 20 66 61 6c 73 65 20 6f 72 20 74 72 75 65 2c 20   false or true, 
1000: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1010: 0a 2a 2a 20 52 65 74 75 72 6e 20 57 52 43 5f 43  .** Return WRC_C
1020: 6f 6e 74 69 6e 75 65 20 75 6e 64 65 72 20 6e 6f  ontinue under no
1030: 72 6d 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  rmal conditions.
1040: 20 20 52 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    Return WRC_Abo
1050: 72 74 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 69  rt if.** there i
1060: 73 20 61 6e 20 61 62 6f 72 74 20 72 65 71 75 65  s an abort reque
1070: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
1080: 20 57 61 6c 6b 65 72 20 64 6f 65 73 20 6e 6f 74   Walker does not
1090: 20 68 61 76 65 20 61 6e 20 78 53 65 6c 65 63 74   have an xSelect
10a0: 43 61 6c 6c 62 61 63 6b 28 29 20 74 68 65 6e 20  Callback() then 
10b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
10c0: 69 73 20 61 20 6e 6f 2d 6f 70 20 72 65 74 75 72  is a no-op retur
10d0: 6e 69 6e 67 20 57 52 43 5f 43 6f 6e 74 69 6e 75  ning WRC_Continu
10e0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
10f0: 33 57 61 6c 6b 53 65 6c 65 63 74 28 57 61 6c 6b  3WalkSelect(Walk
1100: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1110: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ect *p){.  int r
1120: 63 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  c;.  if( p==0 ||
1130: 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63   pWalker->xSelec
1140: 74 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 20 72  tCallback==0 ) r
1150: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1160: 75 65 3b 0a 20 20 72 63 20 3d 20 57 52 43 5f 43  ue;.  rc = WRC_C
1170: 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 57 61 6c 6b  ontinue;.  pWalk
1180: 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b  er->walkerDepth+
1190: 2b 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  +;.  while( p ){
11a0: 0a 20 20 20 20 69 66 28 20 21 70 57 61 6c 6b 65  .    if( !pWalke
11b0: 72 2d 3e 62 53 65 6c 65 63 74 44 65 70 74 68 46  r->bSelectDepthF
11c0: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20 72  irst ){.       r
11d0: 63 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65  c = pWalker->xSe
11e0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 70 57 61  lectCallback(pWa
11f0: 6c 6b 65 72 2c 20 70 29 3b 0a 20 20 20 20 20 20  lker, p);.      
1200: 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
1210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1220: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1230: 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70 29  Expr(pWalker, p)
1240: 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
1250: 57 61 6c 6b 53 65 6c 65 63 74 46 72 6f 6d 28 70  WalkSelectFrom(p
1260: 57 61 6c 6b 65 72 2c 20 70 29 0a 20 20 20 20 29  Walker, p).    )
1270: 7b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  {.      pWalker-
1280: 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a  >walkerDepth--;.
1290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
12a0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
12b0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 62    if( pWalker->b
12c0: 53 65 6c 65 63 74 44 65 70 74 68 46 69 72 73 74  SelectDepthFirst
12d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
12e0: 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43  Walker->xSelectC
12f0: 61 6c 6c 62 61 63 6b 28 70 57 61 6c 6b 65 72 2c  allback(pWalker,
1300: 20 70 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65   p);.      /* De
1310: 70 74 68 2d 66 69 72 73 74 20 73 65 61 72 63 68  pth-first search
1320: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
1330: 6c 79 20 75 73 65 64 20 66 6f 72 0a 20 20 20 20  ly used for.    
1340: 20 20 2a 2a 20 73 65 6c 65 63 74 41 64 64 53 75    ** selectAddSu
1350: 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 29  bqueryTypeInfo()
1360: 20 61 6e 64 20 74 68 61 74 20 72 6f 75 74 69 6e   and that routin
1370: 65 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  e always returns
1380: 0a 20 20 20 20 20 20 2a 2a 20 57 52 43 5f 43 6f  .      ** WRC_Co
1390: 6e 74 69 6e 75 65 20 28 30 29 2e 20 20 53 6f 20  ntinue (0).  So 
13a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 72  the following br
13b0: 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
13c0: 6b 65 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ken. */.      if
13d0: 28 20 4e 45 56 45 52 28 72 63 29 20 29 20 62 72  ( NEVER(rc) ) br
13e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
13f0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
1400: 7d 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c  }.  pWalker->wal
1410: 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 20 20 72 65  kerDepth--;.  re
1420: 74 75 72 6e 20 72 63 20 26 20 57 52 43 5f 41 62  turn rc & WRC_Ab
1430: 6f 72 74 3b 0a 7d 0a                             ort;.}.