/ Hex Artifact Content
Login

Artifact 78842e90c1f71269e7a73a1d4221b6fe360bab66:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 38  /*.** 2015-06-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20  contains C code 
0190: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
01a0: 20 54 72 65 65 56 69 65 77 20 64 65 62 75 67 67   TreeView debugg
01b0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  ing routines..**
01c0: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
01d0: 70 72 69 6e 74 20 61 20 70 61 72 73 65 20 74 72  print a parse tr
01e0: 65 65 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ee to standard o
01f0: 75 74 70 75 74 20 66 6f 72 20 64 65 62 75 67 67  utput for debugg
0200: 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
0210: 73 69 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sis. .**.** The 
0220: 69 6e 74 65 72 66 61 63 65 73 20 69 6e 20 74 68  interfaces in th
0230: 69 73 20 66 69 6c 65 20 69 73 20 6f 6e 6c 79 20  is file is only 
0240: 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 63  available when c
0250: 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68  ompiling.** with
0260: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 2e 0a 2a   SQLITE_DEBUG..*
0270: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0280: 74 65 49 6e 74 2e 68 22 0a 23 69 66 64 65 66 20  teInt.h".#ifdef 
0290: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
02a0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 73 75  .** Add a new su
02b0: 62 69 74 65 6d 20 74 6f 20 74 68 65 20 74 72 65  bitem to the tre
02c0: 65 2e 20 20 54 68 65 20 6d 6f 72 65 54 6f 46 6f  e.  The moreToFo
02d0: 6c 6c 6f 77 20 66 6c 61 67 20 69 6e 64 69 63 61  llow flag indica
02e0: 74 65 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a  tes that this.**
02f0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
0300: 20 69 74 65 6d 20 69 6e 20 74 68 65 20 74 72 65   item in the tre
0310: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 65  e..*/.static Tre
0320: 65 56 69 65 77 20 2a 73 71 6c 69 74 65 33 54 72  eView *sqlite3Tr
0330: 65 65 56 69 65 77 50 75 73 68 28 54 72 65 65 56  eeViewPush(TreeV
0340: 69 65 77 20 2a 70 2c 20 75 38 20 6d 6f 72 65 54  iew *p, u8 moreT
0350: 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 66 28 20  oFollow){.  if( 
0360: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  p==0 ){.    p = 
0370: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
0380: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
0390: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
03a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d  eturn 0;.    mem
03b0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
03c0: 28 2a 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (*p));.  }else{.
03d0: 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 2b 2b 3b      p->iLevel++;
03e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d  .  }.  assert( m
03f0: 6f 72 65 54 6f 46 6f 6c 6c 6f 77 3d 3d 30 20 7c  oreToFollow==0 |
0400: 7c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 3d 3d  | moreToFollow==
0410: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  1 );.  if( p->iL
0420: 65 76 65 6c 3c 73 69 7a 65 6f 66 28 70 2d 3e 62  evel<sizeof(p->b
0430: 4c 69 6e 65 29 20 29 20 70 2d 3e 62 4c 69 6e 65  Line) ) p->bLine
0440: 5b 70 2d 3e 69 4c 65 76 65 6c 5d 20 3d 20 6d 6f  [p->iLevel] = mo
0450: 72 65 54 6f 46 6f 6c 6c 6f 77 3b 0a 20 20 72 65  reToFollow;.  re
0460: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0470: 20 46 69 6e 69 73 68 65 64 20 77 69 74 68 20 6f   Finished with o
0480: 6e 65 20 6c 61 79 65 72 20 6f 66 20 74 68 65 20  ne layer of the 
0490: 74 72 65 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tree.*/.static v
04a0: 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56  oid sqlite3TreeV
04b0: 69 65 77 50 6f 70 28 54 72 65 65 56 69 65 77 20  iewPop(TreeView 
04c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
04d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 69  ) return;.  p->i
04e0: 4c 65 76 65 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  Level--;.  if( p
04f0: 2d 3e 69 4c 65 76 65 6c 3c 30 20 29 20 73 71 6c  ->iLevel<0 ) sql
0500: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
0510: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
0520: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
0530: 20 6f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20   output for the 
0540: 74 72 65 65 2c 20 77 69 74 68 20 61 20 70 72 65  tree, with a pre
0550: 66 69 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  fix that contain
0560: 73 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 61 70 70  s.** all the app
0570: 72 6f 70 72 69 61 74 65 20 74 72 65 65 20 6c 69  ropriate tree li
0580: 6e 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nes.*/.static vo
0590: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
05a0: 65 77 4c 69 6e 65 28 54 72 65 65 56 69 65 77 20  ewLine(TreeView 
05b0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05c0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
05d0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
05e0: 6e 74 20 69 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt i;.  StrAccum
05f0: 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75   acc;.  char zBu
0600: 66 5b 35 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  f[500];.  sqlite
0610: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
0620: 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  cc, 0, zBuf, siz
0630: 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20  eof(zBuf), 0);. 
0640: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
0650: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 69 4c 65 76  r(i=0; i<p->iLev
0660: 65 6c 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 70  el && i<sizeof(p
0670: 2d 3e 62 4c 69 6e 65 29 2d 31 3b 20 69 2b 2b 29  ->bLine)-1; i++)
0680: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
0690: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 61  trAccumAppend(&a
06a0: 63 63 2c 20 70 2d 3e 62 4c 69 6e 65 5b 69 5d 20  cc, p->bLine[i] 
06b0: 3f 20 22 7c 20 20 20 22 20 3a 20 22 20 20 20 20  ? "|   " : "    
06c0: 22 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 4);.    }.   
06d0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
06e0: 41 70 70 65 6e 64 28 26 61 63 63 2c 20 70 2d 3e  Append(&acc, p->
06f0: 62 4c 69 6e 65 5b 69 5d 20 3f 20 22 7c 2d 2d 20  bLine[i] ? "|-- 
0700: 22 20 3a 20 22 27 2d 2d 20 22 2c 20 34 29 3b 0a  " : "'-- ", 4);.
0710: 20 20 7d 0a 20 20 76 61 5f 73 74 61 72 74 28 61    }.  va_start(a
0720: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73  p, zFormat);.  s
0730: 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 28 26  qlite3VXPrintf(&
0740: 61 63 63 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c  acc, 0, zFormat,
0750: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
0760: 70 29 3b 0a 20 20 69 66 28 20 7a 42 75 66 5b 61  p);.  if( zBuf[a
0770: 63 63 2e 6e 43 68 61 72 2d 31 5d 21 3d 27 5c 6e  cc.nChar-1]!='\n
0780: 27 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  ' ) sqlite3StrAc
0790: 63 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c 20  cumAppend(&acc, 
07a0: 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69  "\n", 1);.  sqli
07b0: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
07c0: 68 28 26 61 63 63 29 3b 0a 20 20 66 70 72 69 6e  h(&acc);.  fprin
07d0: 74 66 28 73 74 64 6f 75 74 2c 22 25 73 22 2c 20  tf(stdout,"%s", 
07e0: 7a 42 75 66 29 3b 0a 20 20 66 66 6c 75 73 68 28  zBuf);.  fflush(
07f0: 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  stdout);.}../*.*
0800: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
0810: 73 74 61 72 74 69 6e 67 20 61 20 6e 65 77 20 74  starting a new t
0820: 72 65 65 20 69 74 65 6d 20 74 68 61 74 20 63 6f  ree item that co
0830: 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
0840: 6c 65 20 6c 61 62 65 6c 0a 2a 2f 0a 73 74 61 74  le label.*/.stat
0850: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 54  ic void sqlite3T
0860: 72 65 65 56 69 65 77 49 74 65 6d 28 54 72 65 65  reeViewItem(Tree
0870: 56 69 65 77 20 2a 70 2c 20 63 6f 6e 73 74 20 63  View *p, const c
0880: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 75 38 20 6d  har *zLabel,u8 m
0890: 6f 72 65 46 6f 6c 6c 6f 77 73 29 7b 0a 20 20 70  oreFollows){.  p
08a0: 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69   = sqlite3TreeVi
08b0: 65 77 50 75 73 68 28 70 2c 20 6d 6f 72 65 46 6f  ewPush(p, moreFo
08c0: 6c 6c 6f 77 73 29 3b 0a 20 20 73 71 6c 69 74 65  llows);.  sqlite
08d0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 2c  3TreeViewLine(p,
08e0: 20 22 25 73 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a   "%s", zLabel);.
08f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
0900: 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
0910: 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  le description o
0920: 66 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e  f a WITH clause.
0930: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0940: 54 72 65 65 56 69 65 77 57 69 74 68 28 54 72 65  TreeViewWith(Tre
0950: 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f  eView *pView, co
0960: 6e 73 74 20 57 69 74 68 20 2a 70 57 69 74 68 2c  nst With *pWith,
0970: 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77   u8 moreToFollow
0980: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
0990: 28 20 70 57 69 74 68 3d 3d 30 20 29 20 72 65 74  ( pWith==0 ) ret
09a0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 74 68  urn;.  if( pWith
09b0: 2d 3e 6e 43 74 65 3d 3d 30 20 29 20 72 65 74 75  ->nCte==0 ) retu
09c0: 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 74 68 2d  rn;.  if( pWith-
09d0: 3e 70 4f 75 74 65 72 20 29 7b 0a 20 20 20 20 73  >pOuter ){.    s
09e0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
09f0: 6e 65 28 70 56 69 65 77 2c 20 22 57 49 54 48 20  ne(pView, "WITH 
0a00: 28 30 78 25 70 2c 20 70 4f 75 74 65 72 3d 30 78  (0x%p, pOuter=0x
0a10: 25 70 29 22 2c 70 57 69 74 68 2c 70 57 69 74 68  %p)",pWith,pWith
0a20: 2d 3e 70 4f 75 74 65 72 29 3b 0a 20 20 7d 65 6c  ->pOuter);.  }el
0a30: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  se{.    sqlite3T
0a40: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
0a50: 77 2c 20 22 57 49 54 48 20 28 30 78 25 70 29 22  w, "WITH (0x%p)"
0a60: 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 20 20  , pWith);.  }.  
0a70: 69 66 28 20 70 57 69 74 68 2d 3e 6e 43 74 65 3e  if( pWith->nCte>
0a80: 30 20 29 7b 0a 20 20 20 20 70 56 69 65 77 20 3d  0 ){.    pView =
0a90: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
0aa0: 50 75 73 68 28 70 56 69 65 77 2c 20 31 29 3b 0a  Push(pView, 1);.
0ab0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
0ac0: 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
0ad0: 7b 0a 20 20 20 20 20 20 53 74 72 41 63 63 75 6d  {.      StrAccum
0ae0: 20 78 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   x;.      char z
0af0: 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a 20 20 20 20  Line[1000];.    
0b00: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 43    const struct C
0b10: 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
0b20: 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
0b30: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
0b40: 69 74 28 26 78 2c 20 30 2c 20 7a 4c 69 6e 65 2c  it(&x, 0, zLine,
0b50: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
0b60: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
0b70: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
0b80: 22 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  "%s", pCte->zNam
0b90: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  e);.      if( pC
0ba0: 74 65 2d 3e 70 43 6f 6c 73 20 26 26 20 70 43 74  te->pCols && pCt
0bb0: 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 3e  e->pCols->nExpr>
0bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
0bd0: 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20  r cSep = '(';.  
0be0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
0bf0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
0c00: 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
0c10: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
0c20: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
0c30: 74 66 28 26 78 2c 20 30 2c 20 22 25 63 25 73 22  tf(&x, 0, "%c%s"
0c40: 2c 20 63 53 65 70 2c 20 70 43 74 65 2d 3e 70 43  , cSep, pCte->pC
0c50: 6f 6c 73 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29  ols->a[j].zName)
0c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 53 65 70  ;.          cSep
0c70: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
0c80: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
0c90: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
0ca0: 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
0cb0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
0cc0: 74 66 28 26 78 2c 20 30 2c 20 22 20 41 53 22 29  tf(&x, 0, " AS")
0cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
0ce0: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78  trAccumFinish(&x
0cf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
0d00: 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
0d10: 65 77 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70 57 69  ew, zLine, i<pWi
0d20: 74 68 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20  th->nCte-1);.   
0d30: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
0d40: 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20  ewSelect(pView, 
0d50: 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
0d60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
0d70: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
0d80: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
0d90: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
0da0: 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pView);.  }.}..
0db0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
0dc0: 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
0dd0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
0de0: 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  a the Select obj
0df0: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
0e00: 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
0e10: 63 74 28 54 72 65 65 56 69 65 77 20 2a 70 56 69  ct(TreeView *pVi
0e20: 65 77 2c 20 63 6f 6e 73 74 20 53 65 6c 65 63 74  ew, const Select
0e30: 20 2a 70 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f   *p, u8 moreToFo
0e40: 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  llow){.  int n =
0e50: 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   0;.  int cnt = 
0e60: 30 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c  0;.  pView = sql
0e70: 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
0e80: 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f  (pView, moreToFo
0e90: 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70 2d 3e  llow);.  if( p->
0ea0: 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
0eb0: 69 74 65 33 54 72 65 65 56 69 65 77 57 69 74 68  ite3TreeViewWith
0ec0: 28 70 56 69 65 77 2c 20 70 2d 3e 70 57 69 74 68  (pView, p->pWith
0ed0: 2c 20 31 29 3b 0a 20 20 20 20 63 6e 74 20 3d 20  , 1);.    cnt = 
0ee0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  1;.    sqlite3Tr
0ef0: 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
0f00: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a  , 1);.  }.  do{.
0f10: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
0f20: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
0f30: 53 45 4c 45 43 54 25 73 25 73 20 28 30 78 25 70  SELECT%s%s (0x%p
0f40: 29 20 73 65 6c 46 6c 61 67 73 3d 30 78 25 78 22  ) selFlags=0x%x"
0f50: 2c 0a 20 20 20 20 20 20 28 28 70 2d 3e 73 65 6c  ,.      ((p->sel
0f60: 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
0f70: 6e 63 74 29 20 3f 20 22 20 44 49 53 54 49 4e 43  nct) ? " DISTINC
0f80: 54 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20  T" : ""),.      
0f90: 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ((p->selFlags & 
0fa0: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 3f 20  SF_Aggregate) ? 
0fb0: 22 20 61 67 67 5f 66 6c 61 67 22 20 3a 20 22 22  " agg_flag" : ""
0fc0: 29 2c 20 70 2c 20 70 2d 3e 73 65 6c 46 6c 61 67  ), p, p->selFlag
0fd0: 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  s.    );.    if(
0fe0: 20 63 6e 74 2b 2b 20 29 20 73 71 6c 69 74 65 33   cnt++ ) sqlite3
0ff0: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
1000: 77 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  w);.    if( p->p
1010: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 6e  Prior ){.      n
1020: 20 3d 20 31 30 30 30 3b 0a 20 20 20 20 7d 65 6c   = 1000;.    }el
1030: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b  se{.      n = 0;
1040: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
1050: 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e  rc && p->pSrc->n
1060: 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20  Src ) n++;.     
1070: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
1080: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   n++;.      if( 
1090: 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20 6e 2b  p->pGroupBy ) n+
10a0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
10b0: 70 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a 20  pHaving ) n++;. 
10c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
10d0: 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  erBy ) n++;.    
10e0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
10f0: 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) n++;.      if(
1100: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20 6e 2b   p->pOffset ) n+
1110: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
1120: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
1130: 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70  List(pView, p->p
1140: 45 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e 30 2c 20  EList, (n--)>0, 
1150: 22 72 65 73 75 6c 74 2d 73 65 74 22 29 3b 0a 20  "result-set");. 
1160: 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26     if( p->pSrc &
1170: 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20  & p->pSrc->nSrc 
1180: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1190: 20 20 20 20 20 20 70 56 69 65 77 20 3d 20 73 71        pView = sq
11a0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73  lite3TreeViewPus
11b0: 68 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30  h(pView, (n--)>0
11c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11d0: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
11e0: 65 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20  ew, "FROM");.   
11f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1200: 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
1210: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
1220: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1230: 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
1240: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
1250: 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 20 20  StrAccum x;.    
1260: 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31      char zLine[1
1270: 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  00];.        sql
1280: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
1290: 28 26 78 2c 20 30 2c 20 7a 4c 69 6e 65 2c 20 73  (&x, 0, zLine, s
12a0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29  izeof(zLine), 0)
12b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12c0: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
12d0: 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74 65 6d 2d  "{%d,*}", pItem-
12e0: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
12f0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44     if( pItem->zD
1300: 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 20  atabase ){.     
1310: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1320: 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25 73 2e  ntf(&x, 0, " %s.
1330: 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  %s", pItem->zDat
1340: 61 62 61 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e  abase, pItem->zN
1350: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
1360: 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
1370: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1380: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
1390: 28 26 78 2c 20 30 2c 20 22 20 25 73 22 2c 20 70  (&x, 0, " %s", p
13a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
13b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13c0: 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
13d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13e0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
13f0: 30 2c 20 22 20 74 61 62 6e 61 6d 65 3d 25 51 22  0, " tabname=%Q"
1400: 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
1410: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
1420: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1430: 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
1450: 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20  Printf(&x, 0, " 
1460: 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
1470: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
1480: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1490: 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
14a0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
14b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14c0: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
14d0: 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
14e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14f0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1500: 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20 20  Finish(&x);.    
1510: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1520: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a  iewItem(pView, z
1530: 4c 69 6e 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d  Line, i<p->pSrc-
1540: 3e 6e 53 72 63 2d 31 29 3b 20 0a 20 20 20 20 20  >nSrc-1); .     
1550: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
1560: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1570: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1580: 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20  ewSelect(pView, 
1590: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
15a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
15b0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
15c0: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
15d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15e0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
15f0: 73 74 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d  st(pView, pItem-
1600: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 30 2c  >u1.pFuncArg, 0,
1610: 20 22 66 75 6e 63 2d 61 72 67 73 3a 22 29 3b 0a   "func-args:");.
1620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1630: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1640: 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20  wPop(pView);.   
1650: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1660: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
1670: 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iew);.    }.    
1680: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
1690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
16a0: 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
16b0: 2c 20 22 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29  , "WHERE", (n--)
16c0: 3e 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >0);.      sqlit
16d0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
16e0: 56 69 65 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c  View, p->pWhere,
16f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1700: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
1710: 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iew);.    }.    
1720: 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
1730: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1740: 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1750: 28 70 56 69 65 77 2c 20 70 2d 3e 70 47 72 6f 75  (pView, p->pGrou
1760: 70 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 47  pBy, (n--)>0, "G
1770: 52 4f 55 50 42 59 22 29 3b 0a 20 20 20 20 7d 0a  ROUPBY");.    }.
1780: 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
1790: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
17a0: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
17b0: 70 56 69 65 77 2c 20 22 48 41 56 49 4e 47 22 2c  pView, "HAVING",
17c0: 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20   (n--)>0);.     
17d0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
17e0: 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70  Expr(pView, p->p
17f0: 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  Having, 0);.    
1800: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1810: 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20  wPop(pView);.   
1820: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f   }.    if( p->pO
1830: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1840: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1850: 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70  xprList(pView, p
1860: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 28 6e 2d 2d  ->pOrderBy, (n--
1870: 29 3e 30 2c 20 22 4f 52 44 45 52 42 59 22 29 3b  )>0, "ORDERBY");
1880: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1890: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
18a0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
18b0: 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4c 49  wItem(pView, "LI
18c0: 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  MIT", (n--)>0);.
18d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
18e0: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
18f0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->pLimit, 0);.
1900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1910: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
1920: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1930: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
1940: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1950: 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4f  ewItem(pView, "O
1960: 46 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e 30 29  FFSET", (n--)>0)
1970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1980: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1990: 77 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30  w, p->pOffset, 0
19a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19b0: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
19c0: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  w);.    }.    if
19d0: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
19e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
19f0: 2a 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a  *zOp = "UNION";.
1a00: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
1a10: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >op ){.        c
1a20: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
1a30: 20 20 20 20 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e      zOp = "UNION
1a40: 20 41 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20   ALL";  break;. 
1a50: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49         case TK_I
1a60: 4e 54 45 52 53 45 43 54 3a 20 20 20 7a 4f 70 20  NTERSECT:   zOp 
1a70: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
1a80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1a90: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
1aa0: 20 20 20 20 7a 4f 70 20 3d 20 22 45 58 43 45 50      zOp = "EXCEP
1ab0: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
1ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ad0: 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
1ae0: 28 70 56 69 65 77 2c 20 7a 4f 70 2c 20 31 29 3b  (pView, zOp, 1);
1af0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
1b00: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 77 68 69  ->pPrior;.  }whi
1b10: 6c 65 28 20 70 21 3d 30 20 29 3b 0a 20 20 73 71  le( p!=0 );.  sq
1b20: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1b30: 28 70 56 69 65 77 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pView);.}../*.*
1b40: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d  * Generate a hum
1b50: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c  an-readable expl
1b60: 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  anation of an ex
1b70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
1b80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72  /.void sqlite3Tr
1b90: 65 65 56 69 65 77 45 78 70 72 28 54 72 65 65 56  eeViewExpr(TreeV
1ba0: 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73  iew *pView, cons
1bb0: 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  t Expr *pExpr, u
1bc0: 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b  8 moreToFollow){
1bd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1be0: 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  BinOp = 0;   /* 
1bf0: 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20  Binary operator 
1c00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c10: 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f  *zUniOp = 0;   /
1c20: 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72  * Unary operator
1c30: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 46 6c 67 73   */.  char zFlgs
1c40: 5b 33 30 5d 3b 0a 20 20 70 56 69 65 77 20 3d 20  [30];.  pView = 
1c50: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
1c60: 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54  ush(pView, moreT
1c70: 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20  oFollow);.  if( 
1c80: 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1c90: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1ca0: 69 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 22  ine(pView, "nil"
1cb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
1cc0: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
1cd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1ce0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  }.  if( pExpr->f
1cf0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lags ){.    sqli
1d00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1d10: 65 6f 66 28 7a 46 6c 67 73 29 2c 7a 46 6c 67 73  eof(zFlgs),zFlgs
1d20: 2c 22 20 20 66 6c 61 67 73 3d 30 78 25 78 22 2c  ,"  flags=0x%x",
1d30: 70 45 78 70 72 2d 3e 66 6c 61 67 73 29 3b 0a 20  pExpr->flags);. 
1d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 6c 67   }else{.    zFlg
1d50: 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  s[0] = 0;.  }.  
1d60: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
1d70: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1d80: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1d90: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1da0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1db0: 22 41 47 47 7b 25 64 3a 25 64 7d 25 73 22 2c 0a  "AGG{%d:%d}%s",.
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1dd0: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
1de0: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73  ->iColumn, zFlgs
1df0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e10: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1e20: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
1e30: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
1e40: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
1e50: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
1e60: 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
1e70: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  nts */.        s
1e80: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1e90: 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 55 4d  ne(pView, "COLUM
1ea0: 4e 28 25 64 29 25 73 22 2c 20 70 45 78 70 72 2d  N(%d)%s", pExpr-
1eb0: 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73 29  >iColumn, zFlgs)
1ec0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1ee0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1ef0: 2c 20 22 7b 25 64 3a 25 64 7d 25 73 22 2c 0a 20  , "{%d:%d}%s",. 
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1f20: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
1f30: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73  ->iColumn, zFlgs
1f40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f60: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1f70: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
1f80: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1f90: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1fb0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1fc0: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
1fd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65  Value);.      }e
1fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1ff0: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
2000: 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 70 45  (pView, "%s", pE
2010: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
2020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
2030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
2040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2050: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
2060: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
2070: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
2080: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
2090: 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ew,"%s", pExpr->
20a0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
20b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
20c0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
20d0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
20e0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
20f0: 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 51 22 2c  Line(pView,"%Q",
2100: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
2110: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2120: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
2130: 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
2140: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
2150: 69 6e 65 28 70 56 69 65 77 2c 22 4e 55 4c 4c 22  ine(pView,"NULL"
2160: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2170: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2180: 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
2190: 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
21a0: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
21b0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
21c0: 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c  Line(pView,"%s",
21d0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
21e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
21f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2200: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
2210: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
2220: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
2230: 56 69 65 77 2c 22 56 41 52 49 41 42 4c 45 28 25  View,"VARIABLE(%
2240: 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  s,%d)",.        
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
2270: 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n, pExpr->iColum
2280: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
2290: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22a0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
22b0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
22c0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
22d0: 52 45 47 49 53 54 45 52 28 25 64 29 22 2c 20 70  REGISTER(%d)", p
22e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
22f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2300: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  }.    case TK_ID
2310: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
2320: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
2330: 69 65 77 2c 22 49 44 20 5c 22 25 77 5c 22 22 2c  iew,"ID \"%w\"",
2340: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
2350: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2360: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2370: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
2380: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
2390: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
23a0: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
23b0: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
23c0: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
23d0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
23e0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
23f0: 43 41 53 54 20 25 51 22 2c 20 70 45 78 70 72 2d  CAST %Q", pExpr-
2400: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
2410: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2420: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78  wExpr(pView, pEx
2430: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
2440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2460: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
2470: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
2480: 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
2490: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
24a0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
24b0: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45      zBinOp = "LE
24c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
24d0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
24e0: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22     zBinOp = "GT"
24f0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
2500: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
2510: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b    zBinOp = "GE";
2520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2530: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
2540: 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20   zBinOp = "NE"; 
2550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2560: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
2570: 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20  zBinOp = "EQ";  
2580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2590: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
25a0: 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20  BinOp = "IS";   
25b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
25c0: 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42  e TK_ISNOT:   zB
25d0: 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20  inOp = "ISNOT"; 
25e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
25f0: 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69   TK_AND:     zBi
2600: 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  nOp = "AND";    
2610: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2620: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e  TK_OR:      zBin
2630: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62  Op = "OR";     b
2640: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
2650: 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f  K_PLUS:    zBinO
2660: 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72  p = "ADD";    br
2670: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
2680: 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70  _STAR:    zBinOp
2690: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65   = "MUL";    bre
26a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
26b0: 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20  MINUS:   zBinOp 
26c0: 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61  = "SUB";    brea
26d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
26e0: 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  EM:     zBinOp =
26f0: 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b   "REM";    break
2700: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
2710: 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  TAND:  zBinOp = 
2720: 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b  "BITAND"; break;
2730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
2740: 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  OR:   zBinOp = "
2750: 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a  BITOR";  break;.
2760: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
2770: 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44  H:   zBinOp = "D
2780: 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IV";    break;. 
2790: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
27a0: 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53  T:  zBinOp = "LS
27b0: 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
27c0: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
27d0: 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48  :  zBinOp = "RSH
27e0: 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
27f0: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
2800: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43    zBinOp = "CONC
2810: 41 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AT"; break;.    
2820: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 20 20 20  case TK_DOT:    
2830: 20 7a 42 69 6e 4f 70 20 3d 20 22 44 4f 54 22 3b   zBinOp = "DOT";
2840: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2850: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
2860: 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55   zUniOp = "UMINU
2870: 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  S"; break;.    c
2880: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
2890: 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22  zUniOp = "UPLUS"
28a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
28b0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
28c0: 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22  UniOp = "BITNOT"
28d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
28e0: 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55  e TK_NOT:     zU
28f0: 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20  niOp = "NOT";   
2900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2910: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e   TK_ISNULL:  zUn
2920: 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  iOp = "ISNULL"; 
2930: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2940: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69  TK_NOTNULL: zUni
2950: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
2960: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
2970: 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   TK_COLLATE: {. 
2980: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2990: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
29a0: 22 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 70 45  "COLLATE %Q", pE
29b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
29c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
29d0: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
29e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
29f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2a00: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
2a10: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
2a20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
2a30: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
2a40: 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
2a50: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2a60: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
2a70: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nts */.      if(
2a80: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2a90: 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2aa0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
2ab0: 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
2ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ad0: 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
2ae0: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
2af0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
2b00: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
2b10: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20  CTION ){.       
2b20: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2b30: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 41 47 47  Line(pView, "AGG
2b40: 5f 46 55 4e 43 54 49 4f 4e 25 64 20 25 51 22 2c  _FUNCTION%d %Q",
2b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2b70: 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d  xpr->op2, pExpr-
2b80: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
2b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ba0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2bb0: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 46 55 4e  Line(pView, "FUN
2bc0: 43 54 49 4f 4e 20 25 51 22 2c 20 70 45 78 70 72  CTION %Q", pExpr
2bd0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
2be0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2bf0: 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
2c00: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
2c10: 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70  xprList(pView, p
2c20: 46 61 72 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Farg, 0, 0);.   
2c30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
2c40: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
2c50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2c60: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
2c70: 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20  _EXISTS: {.     
2c80: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2c90: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 45 58 49  Line(pView, "EXI
2ca0: 53 54 53 2d 65 78 70 72 22 29 3b 0a 20 20 20 20  STS-expr");.    
2cb0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2cc0: 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70  wSelect(pView, p
2cd0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
2ce0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
2cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2d00: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
2d10: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d20: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
2d30: 53 45 4c 45 43 54 2d 65 78 70 72 22 29 3b 0a 20  SELECT-expr");. 
2d40: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2d50: 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77  ViewSelect(pView
2d60: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
2d70: 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ct, 0);.      br
2d80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2d90: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
2da0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2db0: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 49  ewLine(pView, "I
2dc0: 4e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  N");.      sqlit
2dd0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
2de0: 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
2df0: 66 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  ft, 1);.      if
2e00: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2e10: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
2e20: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
2e30: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2e40: 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70  wSelect(pView, p
2e50: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
2e60: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
2e70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e80: 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73  3TreeViewExprLis
2e90: 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  t(pView, pExpr->
2ea0: 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
2ec0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
2ed0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2ee0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
2ef0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
2f00: 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
2f10: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f20: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
2f30: 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
2f40: 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
2f50: 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
2f60: 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
2f70: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
2f80: 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
2f90: 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
2fa0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
2fb0: 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
2fc0: 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
2fd0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
2fe0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
2ff0: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
3000: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
3010: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
3020: 20 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78    Expr *pY = pEx
3030: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
3040: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
3050: 78 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d  xpr *pZ = pExpr-
3060: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
3070: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
3080: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
3090: 70 56 69 65 77 2c 20 22 42 45 54 57 45 45 4e 22  pView, "BETWEEN"
30a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30b0: 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
30c0: 65 77 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20 20  ew, pX, 1);.    
30d0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30e0: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 59 2c  wExpr(pView, pY,
30f0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
3100: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
3110: 56 69 65 77 2c 20 70 5a 2c 20 30 29 3b 0a 20 20  View, pZ, 0);.  
3120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
3140: 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
3150: 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
3160: 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
3170: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
3180: 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
3190: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
31a0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
31b0: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
31c0: 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
31d0: 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
31e0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
31f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
3200: 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
3210: 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
3220: 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
3230: 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
3240: 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
3250: 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
3260: 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
3270: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
3280: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
3290: 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
32a0: 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
32b0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
32c0: 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
32d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
32e0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
32f0: 6e 65 28 70 56 69 65 77 2c 20 22 25 73 28 25 64  ne(pView, "%s(%d
3300: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
3310: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
3320: 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45  NEW" : "OLD", pE
3330: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
3340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3350: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
3360: 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
3370: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
3380: 70 56 69 65 77 2c 20 22 43 41 53 45 22 29 3b 0a  pView, "CASE");.
3390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
33a0: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
33b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31   pExpr->pLeft, 1
33c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33d0: 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
33e0: 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
33f0: 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20  .pList, 0, 0);. 
3400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3410: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3420: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
3430: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
3440: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
3450: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e  har *zType = "un
3460: 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  k";.      switch
3470: 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
3480: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  y ){.        cas
3490: 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20  e OE_Rollback:  
34a0: 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61   zType = "rollba
34b0: 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ck";  break;.   
34c0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f       case OE_Abo
34d0: 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  rt:      zType =
34e0: 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72   "abort";     br
34f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
3500: 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20  e OE_Fail:      
3510: 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b   zType = "fail";
3520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3530: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e       case OE_Ign
3540: 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d  ore:     zType =
3550: 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72   "ignore";    br
3560: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3570: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3580: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 52  ewLine(pView, "R
3590: 41 49 53 45 20 25 73 28 25 51 29 22 2c 20 7a 54  AISE %s(%Q)", zT
35a0: 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ype, pExpr->u.zT
35b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
35c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
35d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
35e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
35f0: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
3600: 20 22 6f 70 3d 25 64 22 2c 20 70 45 78 70 72 2d   "op=%d", pExpr-
3610: 3e 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >op);.      brea
3620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
3630: 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20  f( zBinOp ){.   
3640: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3650: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 25  Line(pView, "%s%
3660: 73 22 2c 20 7a 42 69 6e 4f 70 2c 20 7a 46 6c 67  s", zBinOp, zFlg
3670: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
3680: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
3690: 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
36a0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
36b0: 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
36c0: 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ew, pExpr->pRigh
36d0: 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  t, 0);.  }else i
36e0: 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20  f( zUniOp ){.   
36f0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3700: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 25  Line(pView, "%s%
3710: 73 22 2c 20 7a 55 6e 69 4f 70 2c 20 7a 46 6c 67  s", zUniOp, zFlg
3720: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
3730: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
3740: 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
3750: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
3760: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
3770: 69 65 77 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iew);.}../*.** G
3780: 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
3790: 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61  readable explana
37a0: 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65  tion of an expre
37b0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
37c0: 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56  oid sqlite3TreeV
37d0: 69 65 77 45 78 70 72 4c 69 73 74 28 0a 20 20 54  iewExprList(.  T
37e0: 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 0a  reeView *pView,.
37f0: 20 20 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74    const ExprList
3800: 20 2a 70 4c 69 73 74 2c 0a 20 20 75 38 20 6d 6f   *pList,.  u8 mo
3810: 72 65 54 6f 46 6f 6c 6c 6f 77 2c 0a 20 20 63 6f  reToFollow,.  co
3820: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  nst char *zLabel
3830: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  .){.  int i;.  p
3840: 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
3850: 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
3860: 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
3870: 0a 20 20 69 66 28 20 7a 4c 61 62 65 6c 3d 3d 30  .  if( zLabel==0
3880: 20 7c 7c 20 7a 4c 61 62 65 6c 5b 30 5d 3d 3d 30   || zLabel[0]==0
3890: 20 29 20 7a 4c 61 62 65 6c 20 3d 20 22 4c 49 53   ) zLabel = "LIS
38a0: 54 22 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  T";.  if( pList=
38b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
38c0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
38d0: 69 65 77 2c 20 22 25 73 20 28 65 6d 70 74 79 29  iew, "%s (empty)
38e0: 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 65  ", zLabel);.  }e
38f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
3900: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3910: 65 77 2c 20 22 25 73 22 2c 20 7a 4c 61 62 65 6c  ew, "%s", zLabel
3920: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
3930: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
3940: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
3950: 6a 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  j = pList->a[i].
3960: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3b  u.x.iOrderByCol;
3970: 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 7b 0a  .      if( j ){.
3980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
3990: 72 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65  reeViewPush(pVie
39a0: 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  w, 0);.        s
39b0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
39c0: 6e 65 28 70 56 69 65 77 2c 20 22 69 4f 72 64 65  ne(pView, "iOrde
39d0: 72 42 79 43 6f 6c 3d 25 64 22 2c 20 6a 29 3b 0a  rByCol=%d", j);.
39e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
39f0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
3a00: 72 28 70 56 69 65 77 2c 20 70 4c 69 73 74 2d 3e  r(pView, pList->
3a10: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 3c 70 4c  a[i].pExpr, i<pL
3a20: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
3a30: 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c       if( j ) sql
3a40: 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
3a50: 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20  pView);.    }.  
3a60: 7d 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56  }.  sqlite3TreeV
3a70: 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d  iewPop(pView);.}
3a80: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
3a90: 54 45 5f 44 45 42 55 47 20 2a 2f 0a              TE_DEBUG */.