/ Hex Artifact Content
Login

Artifact 588e7f5faf30d2e68aa9b176258bb3225d0553171b998b06b69ed74a0528e986:


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 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0220: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0230: 46 55 4e 43 29 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  FUNC)./*.** Walk
0240: 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 73   all expressions
0250: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 74 68 65   linked into the
0260: 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20   list of Window 
0270: 6f 62 6a 65 63 74 73 20 70 61 73 73 65 64 0a 2a  objects passed.*
0280: 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
0290: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
02a0: 74 69 63 20 69 6e 74 20 77 61 6c 6b 57 69 6e 64  tic int walkWind
02b0: 6f 77 4c 69 73 74 28 57 61 6c 6b 65 72 20 2a 70  owList(Walker *p
02c0: 57 61 6c 6b 65 72 2c 20 57 69 6e 64 6f 77 20 2a  Walker, Window *
02d0: 70 4c 69 73 74 29 7b 0a 20 20 57 69 6e 64 6f 77  pList){.  Window
02e0: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
02f0: 69 6e 3d 70 4c 69 73 74 3b 20 70 57 69 6e 3b 20  in=pList; pWin; 
0300: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
0310: 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Win){.    if( sq
0320: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
0330: 74 28 70 57 61 6c 6b 65 72 2c 20 70 57 69 6e 2d  t(pWalker, pWin-
0340: 3e 70 4f 72 64 65 72 42 79 29 20 29 20 72 65 74  >pOrderBy) ) ret
0350: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
0360: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
0370: 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b  lkExprList(pWalk
0380: 65 72 2c 20 70 57 69 6e 2d 3e 70 50 61 72 74 69  er, pWin->pParti
0390: 74 69 6f 6e 29 20 29 20 72 65 74 75 72 6e 20 57  tion) ) return W
03a0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
03b0: 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  ( sqlite3WalkExp
03c0: 72 28 70 57 61 6c 6b 65 72 2c 20 70 57 69 6e 2d  r(pWalker, pWin-
03d0: 3e 70 46 69 6c 74 65 72 29 20 29 20 72 65 74 75  >pFilter) ) retu
03e0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
03f0: 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
0400: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
0410: 66 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  f../*.** Walk an
0420: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
0430: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61  .  Invoke the ca
0440: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
0450: 65 61 63 68 20 6e 6f 64 65 0a 2a 2a 20 6f 66 20  each node.** of 
0460: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  the expression, 
0470: 77 68 69 6c 65 20 64 65 73 63 65 6e 64 69 6e 67  while descending
0480: 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
0490: 64 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ds, the callback
04a0: 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  .** is invoked b
04b0: 65 66 6f 72 65 20 76 69 73 69 74 69 6e 67 20 63  efore visiting c
04c0: 68 69 6c 64 72 65 6e 2e 29 0a 2a 2a 0a 2a 2a 20  hildren.).**.** 
04d0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
04e0: 20 66 72 6f 6d 20 74 68 65 20 63 61 6c 6c 62 61   from the callba
04f0: 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  ck should be one
0500: 20 6f 66 20 74 68 65 20 57 52 43 5f 2a 0a 2a 2a   of the WRC_*.**
0510: 20 63 6f 6e 73 74 61 6e 74 73 20 74 6f 20 73 70   constants to sp
0520: 65 63 69 66 79 20 68 6f 77 20 74 6f 20 70 72 6f  ecify how to pro
0530: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 77 61  ceed with the wa
0540: 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 57 52 43  lk..**.**    WRC
0550: 5f 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 20 43  _Continue      C
0560: 6f 6e 74 69 6e 75 65 20 64 65 73 63 65 6e 64 69  ontinue descendi
0570: 6e 67 20 64 6f 77 6e 20 74 68 65 20 74 72 65 65  ng down the tree
0580: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 57 52 43 5f 50  ..**.**    WRC_P
0590: 72 75 6e 65 20 20 20 20 20 20 20 20 20 44 6f 20  rune         Do 
05a0: 6e 6f 74 20 64 65 73 63 65 6e 64 20 69 6e 74 6f  not descend into
05b0: 20 63 68 69 6c 64 20 6e 6f 64 65 73 2c 20 62 75   child nodes, bu
05c0: 74 20 61 6c 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  t allow.**      
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 74 68 65 20 77 61 6c 6b 20 74 6f 20 63 6f 6e 74  the walk to cont
05f0: 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e  inue with siblin
0600: 67 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  g nodes..**.**  
0610: 20 20 57 52 43 5f 41 62 6f 72 74 20 20 20 20 20    WRC_Abort     
0620: 20 20 20 20 44 6f 20 6e 6f 20 6d 6f 72 65 20 63      Do no more c
0630: 61 6c 6c 62 61 63 6b 73 2e 20 20 55 6e 77 69 6e  allbacks.  Unwin
0640: 64 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 0a  d the stack and.
0650: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0660: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
0670: 72 6f 6d 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  rom the top-leve
0680: 6c 20 77 61 6c 6b 20 63 61 6c 6c 2e 0a 2a 2a 0a  l walk call..**.
0690: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
06a0: 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  lue from this ro
06b0: 75 74 69 6e 65 20 69 73 20 57 52 43 5f 41 62 6f  utine is WRC_Abo
06c0: 72 74 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68  rt to abandon th
06d0: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
06e0: 6e 64 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20  nd WRC_Continue 
06f0: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a  to continue..*/.
0700: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
0710: 49 4e 4c 49 4e 45 20 69 6e 74 20 77 61 6c 6b 45  INLINE int walkE
0720: 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  xpr(Walker *pWal
0730: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
0740: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 74  ){.  int rc;.  t
0750: 65 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73  estcase( ExprHas
0760: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0770: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b  EP_TokenOnly) );
0780: 0a 20 20 74 65 73 74 63 61 73 65 28 20 45 78 70  .  testcase( Exp
0790: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
07a0: 70 72 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  pr, EP_Reduced) 
07b0: 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  );.  while(1){. 
07c0: 20 20 20 72 63 20 3d 20 70 57 61 6c 6b 65 72 2d     rc = pWalker-
07d0: 3e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 28 70  >xExprCallback(p
07e0: 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a  Walker, pExpr);.
07f0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
0800: 75 72 6e 20 72 63 20 26 20 57 52 43 5f 41 62 6f  urn rc & WRC_Abo
0810: 72 74 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70  rt;.    if( !Exp
0820: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0830: 70 72 2c 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr,(EP_TokenOnly
0840: 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20  |EP_Leaf)) ){.  
0850: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
0860: 4c 65 66 74 20 26 26 20 77 61 6c 6b 45 78 70 72  Left && walkExpr
0870: 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d  (pWalker, pExpr-
0880: 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
0890: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
08a0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
08b0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
08c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
08d0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
08e0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
08f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
0900: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0910: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
0920: 63 7c 45 50 5f 46 69 6c 74 65 72 29 20 29 3b 0a  c|EP_Filter) );.
0930: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
0940: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
0950: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
0960: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
0970: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0980: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
0990: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
09a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
09b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
09c0: 20 45 50 5f 57 69 6e 46 75 6e 63 7c 45 50 5f 46   EP_WinFunc|EP_F
09d0: 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 20 20  ilter) );.      
09e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c    if( sqlite3Wal
09f0: 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
0a00: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
0a10: 74 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  t) ) return WRC_
0a20: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Abort;.      }el
0a30: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
0a40: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
0a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
0a60: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
0a70: 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ist(pWalker, pEx
0a80: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 20 29 20 72  pr->x.pList) ) r
0a90: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
0aa0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  .        }.#ifnd
0ab0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
0ac0: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
0ad0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ae0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0af0: 57 69 6e 46 75 6e 63 7c 45 50 5f 46 69 6c 74 65  WinFunc|EP_Filte
0b00: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
0b10: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
0b20: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
0b30: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
0b40: 20 20 20 20 20 20 69 66 28 20 77 61 6c 6b 57 69        if( walkWi
0b50: 6e 64 6f 77 4c 69 73 74 28 70 57 61 6c 6b 65 72  ndowList(pWalker
0b60: 2c 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 29  , pExpr->y.pWin)
0b70: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
0b80: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ort;.          }
0b90: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
0ba0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0bb0: 45 50 5f 46 69 6c 74 65 72 29 20 29 7b 0a 20 20  EP_Filter) ){.  
0bc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 61            if( wa
0bd0: 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20  lkExpr(pWalker, 
0be0: 70 45 78 70 72 2d 3e 79 2e 70 46 69 6c 74 65 72  pExpr->y.pFilter
0bf0: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
0c00: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  bort;.          
0c10: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
0c20: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  if.      }.    }
0c30: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
0c40: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
0c50: 74 69 6e 75 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  tinue;.}.int sql
0c60: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 57 61 6c  ite3WalkExpr(Wal
0c70: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
0c80: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65  pr *pExpr){.  re
0c90: 74 75 72 6e 20 70 45 78 70 72 20 3f 20 77 61 6c  turn pExpr ? wal
0ca0: 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 70 45  kExpr(pWalker,pE
0cb0: 78 70 72 29 20 3a 20 57 52 43 5f 43 6f 6e 74 69  xpr) : WRC_Conti
0cc0: 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  nue;.}../*.** Ca
0cd0: 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
0ce0: 70 72 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  pr() for every e
0cf0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73  xpression in lis
0d00: 74 20 70 20 6f 72 20 75 6e 74 69 6c 0a 2a 2a 20  t p or until.** 
0d10: 61 6e 20 61 62 6f 72 74 20 72 65 71 75 65 73 74  an abort request
0d20: 20 69 73 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74   is seen..*/.int
0d30: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
0d40: 4c 69 73 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  List(Walker *pWa
0d50: 6c 6b 65 72 2c 20 45 78 70 72 4c 69 73 74 20 2a  lker, ExprList *
0d60: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
0d70: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
0d80: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
0d90: 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ( p ){.    for(i
0da0: 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  =p->nExpr, pItem
0db0: 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  =p->a; i>0; i--,
0dc0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
0dd0: 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
0de0: 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70 49  Expr(pWalker, pI
0df0: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 72 65  tem->pExpr) ) re
0e00: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
0e10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0e20: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
0e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
0e40: 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ll expressions a
0e50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 53  ssociated with S
0e60: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
0e70: 70 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 69 6e  p.  Do.** not in
0e80: 76 6f 6b 65 20 74 68 65 20 53 45 4c 45 43 54 20  voke the SELECT 
0e90: 63 61 6c 6c 62 61 63 6b 20 6f 6e 20 70 2c 20 62  callback on p, b
0ea0: 75 74 20 64 6f 20 28 6f 66 20 63 6f 75 72 73 65  ut do (of course
0eb0: 29 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  ) invoke.** any 
0ec0: 65 78 70 72 20 63 61 6c 6c 62 61 63 6b 73 20 61  expr callbacks a
0ed0: 6e 64 20 53 45 4c 45 43 54 20 63 61 6c 6c 62 61  nd SELECT callba
0ee0: 63 6b 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72  cks that come fr
0ef0: 6f 6d 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  om subqueries..*
0f00: 2a 20 52 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  * Return WRC_Abo
0f10: 72 74 20 6f 72 20 57 52 43 5f 43 6f 6e 74 69 6e  rt or WRC_Contin
0f20: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
0f30: 65 33 57 61 6c 6b 53 65 6c 65 63 74 45 78 70 72  e3WalkSelectExpr
0f40: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
0f50: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
0f60: 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  if( sqlite3WalkE
0f70: 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c  xprList(pWalker,
0f80: 20 70 2d 3e 70 45 4c 69 73 74 29 20 29 20 72 65   p->pEList) ) re
0f90: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
0fa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c    if( sqlite3Wal
0fb0: 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  kExpr(pWalker, p
0fc0: 2d 3e 70 57 68 65 72 65 29 20 29 20 72 65 74 75  ->pWhere) ) retu
0fd0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
0fe0: 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  if( sqlite3WalkE
0ff0: 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c  xprList(pWalker,
1000: 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 20   p->pGroupBy) ) 
1010: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1020: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  ;.  if( sqlite3W
1030: 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c  alkExpr(pWalker,
1040: 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 20 72   p->pHaving) ) r
1050: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1060: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61  .  if( sqlite3Wa
1070: 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b  lkExprList(pWalk
1080: 65 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  er, p->pOrderBy)
1090: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
10a0: 6f 72 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ort;.  if( sqlit
10b0: 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b  e3WalkExpr(pWalk
10c0: 65 72 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29  er, p->pLimit) )
10d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10e0: 74 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  t;.#if !defined(
10f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
1100: 4f 57 46 55 4e 43 29 20 26 26 20 21 64 65 66 69  OWFUNC) && !defi
1110: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1120: 41 4c 54 45 52 54 41 42 4c 45 29 0a 20 20 7b 0a  ALTERTABLE).  {.
1130: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
1140: 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1150: 72 73 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rse;.    if( pPa
1160: 72 73 65 20 26 26 20 49 4e 5f 52 45 4e 41 4d 45  rse && IN_RENAME
1170: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
1180: 20 69 6e 74 20 72 63 20 3d 20 77 61 6c 6b 57 69   int rc = walkWi
1190: 6e 64 6f 77 4c 69 73 74 28 70 57 61 6c 6b 65 72  ndowList(pWalker
11a0: 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a  , p->pWinDefn);.
11b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11c0: 3d 3d 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 29  ==WRC_Continue )
11d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
11e0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
11f0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
1200: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1210: 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 70 61 72  .** Walk the par
1220: 73 65 20 74 72 65 65 73 20 61 73 73 6f 63 69 61  se trees associa
1230: 74 65 64 20 77 69 74 68 20 61 6c 6c 20 73 75 62  ted with all sub
1240: 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  queries in the.*
1250: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1260: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1270: 74 20 70 2e 20 20 44 6f 20 6e 6f 74 20 69 6e 76  t p.  Do not inv
1280: 6f 6b 65 20 74 68 65 20 73 65 6c 65 63 74 0a 2a  oke the select.*
1290: 2a 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 20 70 2c  * callback on p,
12a0: 20 62 75 74 20 64 6f 20 69 6e 76 6f 6b 65 20 69   but do invoke i
12b0: 74 20 6f 6e 20 65 61 63 68 20 46 52 4f 4d 20 63  t on each FROM c
12c0: 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 0a 2a  lause subquery.*
12d0: 2a 20 61 6e 64 20 6f 6e 20 61 6e 79 20 73 75 62  * and on any sub
12e0: 71 75 65 72 69 65 73 20 66 75 72 74 68 65 72 20  queries further 
12f0: 64 6f 77 6e 20 69 6e 20 74 68 65 20 74 72 65 65  down in the tree
1300: 2e 20 20 52 65 74 75 72 6e 20 0a 2a 2a 20 57 52  .  Return .** WR
1310: 43 5f 41 62 6f 72 74 20 6f 72 20 57 52 43 5f 43  C_Abort or WRC_C
1320: 6f 6e 74 69 6e 75 65 3b 0a 2a 2f 0a 69 6e 74 20  ontinue;.*/.int 
1330: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1340: 74 46 72 6f 6d 28 57 61 6c 6b 65 72 20 2a 70 57  tFrom(Walker *pW
1350: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1360: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1370: 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  rc;.  int i;.  s
1380: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1390: 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 70 53  em *pItem;..  pS
13a0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
13b0: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
13c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  );.  for(i=pSrc-
13d0: 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
13e0: 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
13f0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
1400: 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1410: 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 6b 53   && sqlite3WalkS
1420: 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
1430: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 20 29  Item->pSelect) )
1440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1450: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
1460: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1470: 67 2e 69 73 54 61 62 46 75 6e 63 0a 20 20 20 20  g.isTabFunc.    
1480: 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 6b 45   && sqlite3WalkE
1490: 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c  xprList(pWalker,
14a0: 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
14b0: 41 72 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Arg).    ){.    
14c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
14d0: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rt;.    }.  }.  
14e0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
14f0: 6e 75 65 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 43  nue;.} ../*.** C
1500: 61 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  all sqlite3WalkE
1510: 78 70 72 28 29 20 66 6f 72 20 65 76 65 72 79 20  xpr() for every 
1520: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65  expression in Se
1530: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
1540: 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
1550: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 29 20  te3WalkSelect() 
1560: 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 69  for subqueries i
1570: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1580: 65 20 61 6e 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  e and.** on the 
1590: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
15a0: 63 68 61 69 6e 2c 20 70 2d 3e 70 50 72 69 6f 72  chain, p->pPrior
15b0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  . .**.** If it i
15c0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  s not NULL, the 
15d0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28  xSelectCallback(
15e0: 29 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  ) callback is in
15f0: 76 6f 6b 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  voked before.** 
1600: 74 68 65 20 77 61 6c 6b 20 6f 66 20 74 68 65 20  the walk of the 
1610: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
1620: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 54 68 65  FROM clause. The
1630: 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
1640: 32 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 69 73  2().** method is
1650: 20 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77 69   invoked followi
1660: 6e 67 20 74 68 65 20 77 61 6c 6b 20 6f 66 20 74  ng the walk of t
1670: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
1680: 6e 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  nd FROM clause,.
1690: 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 69 66 20 62  ** but only if b
16a0: 6f 74 68 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  oth xSelectCallb
16b0: 61 63 6b 20 61 6e 64 20 78 53 65 6c 65 63 74 43  ack and xSelectC
16c0: 61 6c 6c 62 61 63 6b 32 20 61 72 65 20 62 6f 74  allback2 are bot
16d0: 68 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 6e  h non-NULL.** an
16e0: 64 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  d if the express
16f0: 69 6f 6e 73 20 61 6e 64 20 46 52 4f 4d 20 63 6c  ions and FROM cl
1700: 61 75 73 65 20 62 6f 74 68 20 72 65 74 75 72 6e  ause both return
1710: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 2a   WRC_Continue;.*
1720: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 57 52 43 5f  *.** Return WRC_
1730: 43 6f 6e 74 69 6e 75 65 20 75 6e 64 65 72 20 6e  Continue under n
1740: 6f 72 6d 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  ormal conditions
1750: 2e 20 20 52 65 74 75 72 6e 20 57 52 43 5f 41 62  .  Return WRC_Ab
1760: 6f 72 74 20 69 66 0a 2a 2a 20 74 68 65 72 65 20  ort if.** there 
1770: 69 73 20 61 6e 20 61 62 6f 72 74 20 72 65 71 75  is an abort requ
1780: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  est..**.** If th
1790: 65 20 57 61 6c 6b 65 72 20 64 6f 65 73 20 6e 6f  e Walker does no
17a0: 74 20 68 61 76 65 20 61 6e 20 78 53 65 6c 65 63  t have an xSelec
17b0: 74 43 61 6c 6c 62 61 63 6b 28 29 20 74 68 65 6e  tCallback() then
17c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
17d0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 72 65 74 75   is a no-op retu
17e0: 72 6e 69 6e 67 20 57 52 43 5f 43 6f 6e 74 69 6e  rning WRC_Contin
17f0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
1800: 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 57 61 6c  e3WalkSelect(Wal
1810: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
1820: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
1830: 72 63 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  rc;.  if( p==0 )
1840: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1850: 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 57 61 6c  inue;.  if( pWal
1860: 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c  ker->xSelectCall
1870: 62 61 63 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e  back==0 ) return
1880: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
1890: 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 70 57   do{.    rc = pW
18a0: 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61  alker->xSelectCa
18b0: 6c 6c 62 61 63 6b 28 70 57 61 6c 6b 65 72 2c 20  llback(pWalker, 
18c0: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  p);.    if( rc )
18d0: 20 72 65 74 75 72 6e 20 72 63 20 26 20 57 52 43   return rc & WRC
18e0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
18f0: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1900: 74 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  tExpr(pWalker, p
1910: 29 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  ).     || sqlite
1920: 33 57 61 6c 6b 53 65 6c 65 63 74 46 72 6f 6d 28  3WalkSelectFrom(
1930: 70 57 61 6c 6b 65 72 2c 20 70 29 0a 20 20 20 20  pWalker, p).    
1940: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1950: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
1960: 0a 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72  .    if( pWalker
1970: 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  ->xSelectCallbac
1980: 6b 32 20 29 7b 0a 20 20 20 20 20 20 70 57 61 6c  k2 ){.      pWal
1990: 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c  ker->xSelectCall
19a0: 62 61 63 6b 32 28 70 57 61 6c 6b 65 72 2c 20 70  back2(pWalker, p
19b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  );.    }.    p =
19c0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 77   p->pPrior;.  }w
19d0: 68 69 6c 65 28 20 70 21 3d 30 20 29 3b 0a 20 20  hile( p!=0 );.  
19e0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
19f0: 6e 75 65 3b 0a 7d 0a                             nue;.}.