/ Hex Artifact Content
Login

Artifact e0d62678314abf0e1e6d09ea405f4de3f404a17b4641c2169c304b5edf509320:


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 7a 46 6f 72 6d 61 74 2c 20 61 70  acc, zFormat, ap
0750: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
0760: 0a 20 20 61 73 73 65 72 74 28 20 61 63 63 2e 6e  .  assert( acc.n
0770: 43 68 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Char>0 );.  if( 
0780: 7a 42 75 66 5b 61 63 63 2e 6e 43 68 61 72 2d 31  zBuf[acc.nChar-1
0790: 5d 21 3d 27 5c 6e 27 20 29 20 73 71 6c 69 74 65  ]!='\n' ) sqlite
07a0: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
07b0: 26 61 63 63 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a  &acc, "\n", 1);.
07c0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
07d0: 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20  mFinish(&acc);. 
07e0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
07f0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 66  "%s", zBuf);.  f
0800: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d  flush(stdout);.}
0810: 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 72 74 68 61 6e  ../*.** Shorthan
0820: 64 20 66 6f 72 20 73 74 61 72 74 69 6e 67 20 61  d for starting a
0830: 20 6e 65 77 20 74 72 65 65 20 69 74 65 6d 20 74   new tree item t
0840: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
0850: 61 20 73 69 6e 67 6c 65 20 6c 61 62 65 6c 0a 2a  a single label.*
0860: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
0870: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
0880: 6d 28 54 72 65 65 56 69 65 77 20 2a 70 2c 20 63  m(TreeView *p, c
0890: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
08a0: 6c 2c 75 38 20 6d 6f 72 65 46 6f 6c 6c 6f 77 73  l,u8 moreFollows
08b0: 29 7b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ){.  p = sqlite3
08c0: 54 72 65 65 56 69 65 77 50 75 73 68 28 70 2c 20  TreeViewPush(p, 
08d0: 6d 6f 72 65 46 6f 6c 6c 6f 77 73 29 3b 0a 20 20  moreFollows);.  
08e0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
08f0: 69 6e 65 28 70 2c 20 22 25 73 22 2c 20 7a 4c 61  ine(p, "%s", zLa
0900: 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  bel);.}../*.** G
0910: 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
0920: 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
0930: 74 69 6f 6e 20 6f 66 20 61 20 57 49 54 48 20 63  tion of a WITH c
0940: 6c 61 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lause..*/.void s
0950: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 57 69  qlite3TreeViewWi
0960: 74 68 28 54 72 65 65 56 69 65 77 20 2a 70 56 69  th(TreeView *pVi
0970: 65 77 2c 20 63 6f 6e 73 74 20 57 69 74 68 20 2a  ew, const With *
0980: 70 57 69 74 68 2c 20 75 38 20 6d 6f 72 65 54 6f  pWith, u8 moreTo
0990: 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74 20 69  Follow){.  int i
09a0: 3b 0a 20 20 69 66 28 20 70 57 69 74 68 3d 3d 30  ;.  if( pWith==0
09b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
09c0: 20 70 57 69 74 68 2d 3e 6e 43 74 65 3d 3d 30 20   pWith->nCte==0 
09d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
09e0: 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 29 7b  pWith->pOuter ){
09f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
0a00: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
0a10: 22 57 49 54 48 20 28 30 78 25 70 2c 20 70 4f 75  "WITH (0x%p, pOu
0a20: 74 65 72 3d 30 78 25 70 29 22 2c 70 57 69 74 68  ter=0x%p)",pWith
0a30: 2c 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 29 3b  ,pWith->pOuter);
0a40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
0a50: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
0a60: 65 28 70 56 69 65 77 2c 20 22 57 49 54 48 20 28  e(pView, "WITH (
0a70: 30 78 25 70 29 22 2c 20 70 57 69 74 68 29 3b 0a  0x%p)", pWith);.
0a80: 20 20 7d 0a 20 20 69 66 28 20 70 57 69 74 68 2d    }.  if( pWith-
0a90: 3e 6e 43 74 65 3e 30 20 29 7b 0a 20 20 20 20 70  >nCte>0 ){.    p
0aa0: 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
0ab0: 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
0ac0: 2c 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , 1);.    for(i=
0ad0: 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
0ae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53 74  ; i++){.      St
0af0: 72 41 63 63 75 6d 20 78 3b 0a 20 20 20 20 20 20  rAccum x;.      
0b00: 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
0b10: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74  ;.      const st
0b20: 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d  ruct Cte *pCte =
0b30: 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20   &pWith->a[i];. 
0b40: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
0b50: 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20  ccumInit(&x, 0, 
0b60: 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
0b70: 69 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  ine), 0);.      
0b80: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
0b90: 78 2c 20 22 25 73 22 2c 20 70 43 74 65 2d 3e 7a  x, "%s", pCte->z
0ba0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
0bb0: 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 26 26 20   pCte->pCols && 
0bc0: 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
0bd0: 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pr>0 ){.        
0be0: 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
0bf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
0c00: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
0c10: 20 6a 3c 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e   j<pCte->pCols->
0c20: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
0c30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
0c40: 72 69 6e 74 66 28 26 78 2c 20 22 25 63 25 73 22  rintf(&x, "%c%s"
0c50: 2c 20 63 53 65 70 2c 20 70 43 74 65 2d 3e 70 43  , cSep, pCte->pC
0c60: 6f 6c 73 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29  ols->a[j].zName)
0c70: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 53 65 70  ;.          cSep
0c80: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
0c90: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
0ca0: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 29 22  3XPrintf(&x, ")"
0cb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0cc0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
0cd0: 26 78 2c 20 22 20 41 53 22 29 3b 0a 20 20 20 20  &x, " AS");.    
0ce0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
0cf0: 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20  mFinish(&x);.   
0d00: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
0d10: 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c  ewItem(pView, zL
0d20: 69 6e 65 2c 20 69 3c 70 57 69 74 68 2d 3e 6e 43  ine, i<pWith->nC
0d30: 74 65 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  te-1);.      sql
0d40: 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
0d50: 63 74 28 70 56 69 65 77 2c 20 70 43 74 65 2d 3e  ct(pView, pCte->
0d60: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
0d70: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
0d80: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
0d90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54    }.    sqlite3T
0da0: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
0db0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
0dc0: 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
0dd0: 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72  n-readable descr
0de0: 69 70 74 69 6f 6e 20 6f 66 20 61 20 53 65 6c 65  iption of a Sele
0df0: 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ct object..*/.vo
0e00: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
0e10: 65 77 53 65 6c 65 63 74 28 54 72 65 65 56 69 65  ewSelect(TreeVie
0e20: 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20  w *pView, const 
0e30: 53 65 6c 65 63 74 20 2a 70 2c 20 75 38 20 6d 6f  Select *p, u8 mo
0e40: 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69  reToFollow){.  i
0e50: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
0e60: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  cnt = 0;.  if( p
0e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0e80: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
0e90: 56 69 65 77 2c 20 22 6e 69 6c 2d 53 45 4c 45 43  View, "nil-SELEC
0ea0: 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  T");.    return;
0eb0: 0a 20 20 7d 20 0a 20 20 70 56 69 65 77 20 3d 20  .  } .  pView = 
0ec0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
0ed0: 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54  ush(pView, moreT
0ee0: 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20  oFollow);.  if( 
0ef0: 70 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20  p->pWith ){.    
0f00: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 57  sqlite3TreeViewW
0f10: 69 74 68 28 70 56 69 65 77 2c 20 70 2d 3e 70 57  ith(pView, p->pW
0f20: 69 74 68 2c 20 31 29 3b 0a 20 20 20 20 63 6e 74  ith, 1);.    cnt
0f30: 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
0f40: 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70 56  3TreeViewPush(pV
0f50: 69 65 77 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 64  iew, 1);.  }.  d
0f60: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  o{.    sqlite3Tr
0f70: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
0f80: 2c 20 22 53 45 4c 45 43 54 25 73 25 73 20 28 30  , "SELECT%s%s (0
0f90: 78 25 70 29 20 73 65 6c 46 6c 61 67 73 3d 30 78  x%p) selFlags=0x
0fa0: 25 78 20 6e 53 65 6c 65 63 74 52 6f 77 3d 25 64  %x nSelectRow=%d
0fb0: 22 2c 0a 20 20 20 20 20 20 28 28 70 2d 3e 73 65  ",.      ((p->se
0fc0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
0fd0: 69 6e 63 74 29 20 3f 20 22 20 44 49 53 54 49 4e  inct) ? " DISTIN
0fe0: 43 54 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20  CT" : ""),.     
0ff0: 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   ((p->selFlags &
1000: 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 3f   SF_Aggregate) ?
1010: 20 22 20 61 67 67 5f 66 6c 61 67 22 20 3a 20 22   " agg_flag" : "
1020: 22 29 2c 20 70 2c 20 70 2d 3e 73 65 6c 46 6c 61  "), p, p->selFla
1030: 67 73 2c 0a 20 20 20 20 20 20 28 69 6e 74 29 70  gs,.      (int)p
1040: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 0a 20 20 20  ->nSelectRow.   
1050: 20 29 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 2b   );.    if( cnt+
1060: 2b 20 29 20 73 71 6c 69 74 65 33 54 72 65 65 56  + ) sqlite3TreeV
1070: 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
1080: 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
1090: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 30   ){.      n = 10
10a0: 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  00;.    }else{. 
10b0: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
10c0: 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
10d0: 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
10e0: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   n++;.      if( 
10f0: 70 2d 3e 70 57 68 65 72 65 20 29 20 6e 2b 2b 3b  p->pWhere ) n++;
1100: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 47  .      if( p->pG
1110: 72 6f 75 70 42 79 20 29 20 6e 2b 2b 3b 0a 20 20  roupBy ) n++;.  
1120: 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
1130: 6e 67 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  ng ) n++;.      
1140: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1150: 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) n++;.      if(
1160: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 6e 2b 2b   p->pLimit ) n++
1170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1180: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c  te3TreeViewExprL
1190: 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 45  ist(pView, p->pE
11a0: 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22  List, (n--)>0, "
11b0: 72 65 73 75 6c 74 2d 73 65 74 22 29 3b 0a 20 20  result-set");.  
11c0: 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
11d0: 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
11e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
11f0: 20 20 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c       pView = sql
1200: 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
1210: 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29  (pView, (n--)>0)
1220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1230: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1240: 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20 20  w, "FROM");.    
1250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1260: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
1270: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
1280: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1290: 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
12a0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 53  >a[i];.        S
12b0: 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 20 20 20  trAccum x;.     
12c0: 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30     char zLine[10
12d0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
12e0: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
12f0: 26 78 2c 20 30 2c 20 7a 4c 69 6e 65 2c 20 73 69  &x, 0, zLine, si
1300: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b  zeof(zLine), 0);
1310: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1320: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 7b 25 64  XPrintf(&x, "{%d
1330: 2c 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75  ,*}", pItem->iCu
1340: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rsor);.        i
1350: 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
1360: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ase ){.         
1370: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
1380: 26 78 2c 20 22 20 25 73 2e 25 73 22 2c 20 70 49  &x, " %s.%s", pI
1390: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20  tem->zDatabase, 
13a0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
13b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13c0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
13d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13e0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 20  e3XPrintf(&x, " 
13f0: 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
1400: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1410: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1420: 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
1430: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
1440: 66 28 26 78 2c 20 22 20 74 61 62 6e 61 6d 65 3d  f(&x, " tabname=
1450: 25 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %Q", pItem->pTab
1460: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1470: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1480: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
1490: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14a0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 20  e3XPrintf(&x, " 
14b0: 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
14c0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
14d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14e0: 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
14f0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
1500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1510: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 20 4c  3XPrintf(&x, " L
1520: 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
1530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1540: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
1550: 69 73 68 28 26 78 29 3b 0a 20 20 20 20 20 20 20  ish(&x);.       
1560: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1570: 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69 6e  Item(pView, zLin
1580: 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  e, i<p->pSrc->nS
1590: 72 63 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  rc-1); .        
15a0: 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
15b0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
15c0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
15d0: 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 49 74  elect(pView, pIt
15e0: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  em->pSelect, 0);
15f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1600: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1610: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
1630: 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
1640: 70 56 69 65 77 2c 20 70 49 74 65 6d 2d 3e 75 31  pView, pItem->u1
1650: 2e 70 46 75 6e 63 41 72 67 2c 20 30 2c 20 22 66  .pFuncArg, 0, "f
1660: 75 6e 63 2d 61 72 67 73 3a 22 29 3b 0a 20 20 20  unc-args:");.   
1670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1680: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1690: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20  p(pView);.      
16a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
16b0: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
16c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16d0: 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
16e0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
16f0: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
1700: 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29  WHERE", (n--)>0)
1710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1720: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1730: 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 30 29  w, p->pWhere, 0)
1740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1750: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1770: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
1780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1790: 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
17a0: 69 65 77 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  iew, p->pGroupBy
17b0: 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 47 52 4f 55  , (n--)>0, "GROU
17c0: 50 42 59 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  PBY");.    }.   
17d0: 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
17e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17f0: 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
1800: 65 77 2c 20 22 48 41 56 49 4e 47 22 2c 20 28 6e  ew, "HAVING", (n
1810: 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20 73 71  --)>0);.      sq
1820: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1830: 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 48 61 76  r(pView, p->pHav
1840: 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ing, 0);.      s
1850: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1860: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a  p(pView);.    }.
1870: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1880: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rBy ){.      sql
1890: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
18a0: 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70  List(pView, p->p
18b0: 4f 72 64 65 72 42 79 2c 20 28 6e 2d 2d 29 3e 30  OrderBy, (n--)>0
18c0: 2c 20 22 4f 52 44 45 52 42 59 22 29 3b 0a 20 20  , "ORDERBY");.  
18d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
18e0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
18f0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74  qlite3TreeViewIt
1900: 65 6d 28 70 56 69 65 77 2c 20 22 4c 49 4d 49 54  em(pView, "LIMIT
1910: 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20  ", (n--)>0);.   
1920: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1930: 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d  ewExpr(pView, p-
1940: 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20  >pLimit->pLeft, 
1950: 70 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  p->pLimit->pRigh
1960: 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t!=0);.      if(
1970: 20 70 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67   p->pLimit->pRig
1980: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ht ){.        sq
1990: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
19a0: 6d 28 70 56 69 65 77 2c 20 22 4f 46 46 53 45 54  m(pView, "OFFSET
19b0: 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20  ", (n--)>0);.   
19c0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
19d0: 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
19e0: 70 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  p->pLimit->pRigh
19f0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
1a00: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1a10: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20  p(pView);.      
1a20: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
1a30: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a50: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1a60: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a70: 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20  zOp = "UNION";. 
1a80: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
1a90: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  op ){.        ca
1aa0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
1ab0: 20 20 20 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 20     zOp = "UNION 
1ac0: 41 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ALL";  break;.  
1ad0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e        case TK_IN
1ae0: 54 45 52 53 45 43 54 3a 20 20 20 7a 4f 70 20 3d  TERSECT:   zOp =
1af0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 62   "INTERSECT";  b
1b00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1b10: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
1b20: 20 20 20 7a 4f 70 20 3d 20 22 45 58 43 45 50 54     zOp = "EXCEPT
1b30: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1b50: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
1b60: 70 56 69 65 77 2c 20 7a 4f 70 2c 20 31 29 3b 0a  pView, zOp, 1);.
1b70: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
1b80: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 77 68 69 6c  >pPrior;.  }whil
1b90: 65 28 20 70 21 3d 30 20 29 3b 0a 20 20 73 71 6c  e( p!=0 );.  sql
1ba0: 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
1bb0: 70 56 69 65 77 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pView);.}../*.**
1bc0: 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
1bd0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
1be0: 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70  nation of an exp
1bf0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
1c00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65  .void sqlite3Tre
1c10: 65 56 69 65 77 45 78 70 72 28 54 72 65 65 56 69  eViewExpr(TreeVi
1c20: 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74  ew *pView, const
1c30: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38   Expr *pExpr, u8
1c40: 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a   moreToFollow){.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
1c60: 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42  inOp = 0;   /* B
1c70: 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a  inary operator *
1c80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1c90: 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a  zUniOp = 0;   /*
1ca0: 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20   Unary operator 
1cb0: 2a 2f 0a 20 20 63 68 61 72 20 7a 46 6c 67 73 5b  */.  char zFlgs[
1cc0: 36 30 5d 3b 0a 20 20 70 56 69 65 77 20 3d 20 73  60];.  pView = s
1cd0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
1ce0: 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f  sh(pView, moreTo
1cf0: 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70  Follow);.  if( p
1d00: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Expr==0 ){.    s
1d10: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1d20: 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 22 29  ne(pView, "nil")
1d30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
1d40: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
1d50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d60: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1d70: 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ags ){.    if( E
1d80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d90: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
1da0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
1db0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1dc0: 65 6f 66 28 7a 46 6c 67 73 29 2c 7a 46 6c 67 73  eof(zFlgs),zFlgs
1dd0: 2c 22 20 20 66 6c 61 67 73 3d 30 78 25 78 20 69  ,"  flags=0x%x i
1de0: 52 4a 54 3d 25 64 22 2c 0a 20 20 20 20 20 20 20  RJT=%d",.       
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 70 45 78 70 72 2d 3e 66 6c 61 67 73 2c 20 70 45  pExpr->flags, pE
1e10: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e20: 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
1e30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1e40: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1e50: 7a 46 6c 67 73 29 2c 7a 46 6c 67 73 2c 22 20 20  zFlgs),zFlgs,"  
1e60: 66 6c 61 67 73 3d 30 78 25 78 22 2c 70 45 78 70  flags=0x%x",pExp
1e70: 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  r->flags);.    }
1e80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
1e90: 6c 67 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a  lgs[0] = 0;.  }.
1ea0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1eb0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1ec0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
1ed0: 0a 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 41 47 47 7b 25 64 3a 25 64 7d 25 73 22  , "AGG{%d:%d}%s"
1f00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ,.            pE
1f10: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
1f20: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c  pr->iColumn, zFl
1f30: 67 73 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  gs);.      break
1f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f50: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1f60: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1f70: 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
1f80: 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
1f90: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
1fa0: 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
1fb0: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
1fc0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1fd0: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c  Line(pView, "COL
1fe0: 55 4d 4e 28 25 64 29 25 73 22 2c 20 70 45 78 70  UMN(%d)%s", pExp
1ff0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67  r->iColumn, zFlg
2000: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
2010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2020: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
2030: 65 77 2c 20 22 7b 25 64 3a 25 64 7d 25 73 22 2c  ew, "{%d:%d}%s",
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2060: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
2070: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c  pr->iColumn, zFl
2080: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
2090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
20b0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  GER: {.      if(
20c0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
20d0: 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
20e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
20f0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
2100: 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
2110: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
2120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2130: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
2140: 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20  ne(pView, "%s", 
2150: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
2160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
2180: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2190: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
21a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
21b0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
21c0: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
21d0: 56 69 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72  View,"%s", pExpr
21e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
21f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2200: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
2210: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
2220: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2230: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 51  ewLine(pView,"%Q
2240: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
2250: 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
2260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2270: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
2280: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2290: 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 4e 55 4c  wLine(pView,"NUL
22a0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
22b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22c0: 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b   TK_TRUEFALSE: {
22d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
22e0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
22f0: 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
2300: 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
2310: 28 70 45 78 70 72 29 20 3f 20 22 54 52 55 45 22  (pExpr) ? "TRUE"
2320: 20 3a 20 22 46 41 4c 53 45 22 29 3b 0a 20 20 20   : "FALSE");.   
2330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2340: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2350: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
2360: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
2370: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
2380: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
2390: 56 69 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72  View,"%s", pExpr
23a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
23b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23c0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
23d0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
23e0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
23f0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
2400: 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22  VARIABLE(%s,%d)"
2410: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2420: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2430: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78  r->u.zToken, pEx
2440: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
2450: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2460: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
2470: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
2480: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
2490: 6e 65 28 70 56 69 65 77 2c 22 52 45 47 49 53 54  ne(pView,"REGIST
24a0: 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  ER(%d)", pExpr->
24b0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
24c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24d0: 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20  case TK_ID: {.  
24e0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
24f0: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 49  iewLine(pView,"I
2500: 44 20 5c 22 25 77 5c 22 22 2c 20 70 45 78 70 72  D \"%w\"", pExpr
2510: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
2520: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2530: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2540: 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
2550: 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
2560: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
2570: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
2580: 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
2590: 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73  oken) */.      s
25a0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
25b0: 6e 65 28 70 56 69 65 77 2c 22 43 41 53 54 20 25  ne(pView,"CAST %
25c0: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
25d0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
25e0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
25f0: 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
2600: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  eft, 0);.      b
2610: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
2620: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2630: 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
2640: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
2650: 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20  BinOp = "LT";   
2660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2670: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42  e TK_LE:      zB
2680: 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20  inOp = "LE";    
2690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
26a0: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69   TK_GT:      zBi
26b0: 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  nOp = "GT";     
26c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
26d0: 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GE:      zBin
26e0: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62  Op = "GE";     b
26f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
2700: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_NE:      zBinO
2710: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72  p = "NE";     br
2720: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
2730: 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _EQ:      zBinOp
2740: 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65   = "EQ";     bre
2750: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
2760: 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  IS:      zBinOp 
2770: 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61  = "IS";     brea
2780: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
2790: 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  SNOT:   zBinOp =
27a0: 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b   "ISNOT";  break
27b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
27c0: 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  D:     zBinOp = 
27d0: 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "AND";    break;
27e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
27f0: 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
2800: 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OR";     break;.
2810: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
2820: 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41  :    zBinOp = "A
2830: 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  DD";    break;. 
2840: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
2850: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55      zBinOp = "MU
2860: 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
2870: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
2880: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42     zBinOp = "SUB
2890: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
28a0: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
28b0: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22    zBinOp = "REM"
28c0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
28d0: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
28e0: 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e   zBinOp = "BITAN
28f0: 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
2900: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
2910: 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22  zBinOp = "BITOR"
2920: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
2930: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
2940: 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20  BinOp = "DIV";  
2950: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2960: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42  e TK_LSHIFT:  zB
2970: 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b  inOp = "LSHIFT";
2980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2990: 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69   TK_RSHIFT:  zBi
29a0: 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  nOp = "RSHIFT"; 
29b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
29c0: 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e  TK_CONCAT:  zBin
29d0: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62  Op = "CONCAT"; b
29e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
29f0: 4b 5f 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f  K_DOT:     zBinO
2a00: 70 20 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72  p = "DOT";    br
2a10: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
2a20: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f  K_UMINUS:  zUniO
2a30: 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72  p = "UMINUS"; br
2a40: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
2a50: 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70  _UPLUS:   zUniOp
2a60: 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65   = "UPLUS";  bre
2a70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
2a80: 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20  BITNOT:  zUniOp 
2a90: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61  = "BITNOT"; brea
2aa0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
2ab0: 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d  OT:     zUniOp =
2ac0: 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b   "NOT";    break
2ad0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
2ae0: 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  NULL:  zUniOp = 
2af0: 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  "ISNULL"; break;
2b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
2b10: 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22  NULL: zUniOp = "
2b20: 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
2b30: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
2b40: 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
2b50: 20 78 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   x;.      const 
2b60: 63 68 61 72 20 2a 61 7a 4f 70 5b 5d 20 3d 20 7b  char *azOp[] = {
2b70: 0a 20 20 20 20 20 20 20 20 20 22 49 53 2d 46 41  .         "IS-FA
2b80: 4c 53 45 22 2c 20 22 49 53 2d 54 52 55 45 22 2c  LSE", "IS-TRUE",
2b90: 20 22 49 53 2d 4e 4f 54 2d 46 41 4c 53 45 22 2c   "IS-NOT-FALSE",
2ba0: 20 22 49 53 2d 4e 4f 54 2d 54 52 55 45 22 0a 20   "IS-NOT-TRUE". 
2bb0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
2bc0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 32  sert( pExpr->op2
2bd0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
2be0: 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 20  ->op2==TK_ISNOT 
2bf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c00: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
2c10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f  pExpr->pRight->o
2c30: 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p==TK_TRUEFALSE 
2c40: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 70 45  );.      x = (pE
2c50: 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
2c60: 4f 54 29 2a 32 20 2b 20 73 71 6c 69 74 65 33 45  OT)*2 + sqlite3E
2c70: 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
2c80: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
2c90: 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 61 7a 4f      zUniOp = azO
2ca0: 70 5b 78 5d 3b 0a 20 20 20 20 20 20 62 72 65 61  p[x];.      brea
2cb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
2cc0: 73 65 20 54 4b 5f 53 50 41 4e 3a 20 7b 0a 20 20  se TK_SPAN: {.  
2cd0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2ce0: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
2cf0: 53 50 41 4e 20 25 51 22 2c 20 70 45 78 70 72 2d  SPAN %Q", pExpr-
2d00: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
2d10: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2d20: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78  wExpr(pView, pEx
2d30: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
2d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d50: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  }..    case TK_C
2d60: 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  OLLATE: {.      
2d70: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
2d80: 69 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 4c  ine(pView, "COLL
2d90: 41 54 45 20 25 51 22 2c 20 70 45 78 70 72 2d 3e  ATE %Q", pExpr->
2da0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
2db0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2dc0: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
2dd0: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  r->pLeft, 0);.  
2de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2df0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
2e00: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
2e10: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
2e20: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
2e30: 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
2e40: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
2e50: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
2e60: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
2e70: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2e80: 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
2e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
2ea0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
2eb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
2ec0: 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
2ed0: 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
2ee0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2ef0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f10: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
2f20: 70 56 69 65 77 2c 20 22 41 47 47 5f 46 55 4e 43  pView, "AGG_FUNC
2f30: 54 49 4f 4e 25 64 20 25 51 22 2c 0a 20 20 20 20  TION%d %Q",.    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2f60: 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  op2, pExpr->u.zT
2f70: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
2f80: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2f90: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
2fa0: 70 56 69 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e  pView, "FUNCTION
2fb0: 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a   %Q", pExpr->u.z
2fc0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Token);.      }.
2fd0: 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
2fe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ff0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
3000: 73 74 28 70 56 69 65 77 2c 20 70 46 61 72 67 2c  st(pView, pFarg,
3010: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
3020: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3030: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
3040: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
3050: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
3060: 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  TS: {.      sqli
3070: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
3080: 70 56 69 65 77 2c 20 22 45 58 49 53 54 53 2d 65  pView, "EXISTS-e
3090: 78 70 72 20 66 6c 61 67 73 3d 30 78 25 78 22 2c  xpr flags=0x%x",
30a0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 29 3b 0a   pExpr->flags);.
30b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
30c0: 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65  eViewSelect(pVie
30d0: 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  w, pExpr->x.pSel
30e0: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ect, 0);.      b
30f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3100: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
3110: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
3120: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
3130: 77 2c 20 22 53 45 4c 45 43 54 2d 65 78 70 72 20  w, "SELECT-expr 
3140: 66 6c 61 67 73 3d 30 78 25 78 22 2c 20 70 45 78  flags=0x%x", pEx
3150: 70 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr->flags);.    
3160: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3170: 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70  wSelect(pView, p
3180: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
3190: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
31a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
31b0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
31c0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
31d0: 69 6e 65 28 70 56 69 65 77 2c 20 22 49 4e 20 66  ine(pView, "IN f
31e0: 6c 61 67 73 3d 30 78 25 78 22 2c 20 70 45 78 70  lags=0x%x", pExp
31f0: 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  r->flags);.     
3200: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3210: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
3220: 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20  r->pLeft, 1);.  
3230: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
3240: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
3250: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
3260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
3270: 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56  reeViewSelect(pV
3280: 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  iew, pExpr->x.pS
3290: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
32a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32b0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
32c0: 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70  xprList(pView, p
32d0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  Expr->x.pList, 0
32e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
32f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3300: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3310: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
3320: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
3330: 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
3340: 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
3350: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
3360: 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
3370: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
3380: 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
3390: 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
33a0: 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
33b0: 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
33c0: 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
33d0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
33e0: 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
33f0: 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
3400: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
3410: 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
3420: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
3430: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
3440: 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
3450: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 59  ;.      Expr *pY
3460: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
3470: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
3480: 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20       Expr *pZ = 
3490: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
34a0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
34b0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
34c0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 42 45  wLine(pView, "BE
34d0: 54 57 45 45 4e 22 29 3b 0a 20 20 20 20 20 20 73  TWEEN");.      s
34e0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
34f0: 70 72 28 70 56 69 65 77 2c 20 70 58 2c 20 31 29  pr(pView, pX, 1)
3500: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
3510: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
3520: 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20 20 20 20  w, pY, 1);.     
3530: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3540: 45 78 70 72 28 70 56 69 65 77 2c 20 70 5a 2c 20  Expr(pView, pZ, 
3550: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
3560: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3570: 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
3580: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
3590: 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
35a0: 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
35b0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
35c0: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
35d0: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
35e0: 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
35f0: 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
3600: 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
3610: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
3620: 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
3630: 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
3640: 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
3650: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
3660: 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
3670: 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
3680: 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
3690: 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
36a0: 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
36b0: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
36c0: 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
36d0: 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
36e0: 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
36f0: 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
3700: 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ield..      */. 
3710: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
3720: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
3730: 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20  "%s(%d)", .     
3740: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
3750: 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c  le ? "NEW" : "OL
3760: 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  D", pExpr->iColu
3770: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
3780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3790: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
37a0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
37b0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43 41  wLine(pView, "CA
37c0: 53 45 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  SE");.      sqli
37d0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
37e0: 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
37f0: 65 66 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  eft, 1);.      s
3800: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
3810: 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 45  prList(pView, pE
3820: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c  xpr->x.pList, 0,
3830: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
3840: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
3850: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
3860: 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
3870: 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63  RAISE: {.      c
3880: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
3890: 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
38a0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61  switch( pExpr->a
38b0: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
38c0: 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
38d0: 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22  ack:   zType = "
38e0: 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61  rollback";  brea
38f0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
3900: 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a  OE_Abort:      z
3910: 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20  Type = "abort"; 
3920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3930: 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
3940: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
3950: 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61  fail";      brea
3960: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
3970: 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a  OE_Ignore:     z
3980: 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b  Type = "ignore";
3990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
39a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
39b0: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
39c0: 65 77 2c 20 22 52 41 49 53 45 20 25 73 28 25 51  ew, "RAISE %s(%Q
39d0: 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72  )", zType, pExpr
39e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
39f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3a00: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
3a10: 54 4b 5f 4d 41 54 43 48 3a 20 7b 0a 20 20 20 20  TK_MATCH: {.    
3a20: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3a30: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 4d 41  wLine(pView, "MA
3a40: 54 43 48 20 7b 25 64 3a 25 64 7d 25 73 22 2c 0a  TCH {%d:%d}%s",.
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3a70: 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
3a80: 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73 29 3b  iColumn, zFlgs);
3a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
3aa0: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
3ab0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
3ac0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
3ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ae0: 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20   TK_VECTOR: {.  
3af0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
3b00: 69 65 77 42 61 72 65 45 78 70 72 4c 69 73 74 28  iewBareExprList(
3b10: 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e  pView, pExpr->x.
3b20: 70 4c 69 73 74 2c 20 22 56 45 43 54 4f 52 22 29  pList, "VECTOR")
3b30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
3b50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20  _SELECT_COLUMN: 
3b60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
3b70: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
3b80: 77 2c 20 22 53 45 4c 45 43 54 2d 43 4f 4c 55 4d  w, "SELECT-COLUM
3b90: 4e 20 25 64 22 2c 20 70 45 78 70 72 2d 3e 69 43  N %d", pExpr->iC
3ba0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
3bb0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
3bc0: 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70 72  ect(pView, pExpr
3bd0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
3be0: 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ct, 0);.      br
3bf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3c00: 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  ase TK_IF_NULL_R
3c10: 4f 57 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OW: {.      sqli
3c20: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
3c30: 70 56 69 65 77 2c 20 22 49 46 2d 4e 55 4c 4c 2d  pView, "IF-NULL-
3c40: 52 4f 57 20 25 64 22 2c 20 70 45 78 70 72 2d 3e  ROW %d", pExpr->
3c50: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  iTable);.      s
3c60: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
3c70: 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
3c80: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
3c90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ca0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3cb0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
3cc0: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
3cd0: 6f 70 3d 25 64 22 2c 20 70 45 78 70 72 2d 3e 6f  op=%d", pExpr->o
3ce0: 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  p);.      break;
3cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
3d00: 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73   zBinOp ){.    s
3d10: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
3d20: 6e 65 28 70 56 69 65 77 2c 20 22 25 73 25 73 22  ne(pView, "%s%s"
3d30: 2c 20 7a 42 69 6e 4f 70 2c 20 7a 46 6c 67 73 29  , zBinOp, zFlgs)
3d40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
3d50: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
3d60: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31   pExpr->pLeft, 1
3d70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
3d80: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
3d90: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
3da0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
3db0: 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73   zUniOp ){.    s
3dc0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
3dd0: 6e 65 28 70 56 69 65 77 2c 20 22 25 73 25 73 22  ne(pView, "%s%s"
3de0: 2c 20 7a 55 6e 69 4f 70 2c 20 7a 46 6c 67 73 29  , zUniOp, zFlgs)
3df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
3e00: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
3e10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
3e20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3e30: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
3e40: 77 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  w);.}.../*.** Ge
3e50: 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
3e60: 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
3e70: 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
3e80: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
3e90: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
3ea0: 65 77 42 61 72 65 45 78 70 72 4c 69 73 74 28 0a  ewBareExprList(.
3eb0: 20 20 54 72 65 65 56 69 65 77 20 2a 70 56 69 65    TreeView *pVie
3ec0: 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 4c  w,.  const ExprL
3ed0: 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20 63 6f  ist *pList,.  co
3ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  nst char *zLabel
3ef0: 0a 29 7b 0a 20 20 69 66 28 20 7a 4c 61 62 65 6c  .){.  if( zLabel
3f00: 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b 30 5d  ==0 || zLabel[0]
3f10: 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20 3d 20 22  ==0 ) zLabel = "
3f20: 4c 49 53 54 22 3b 0a 20 20 69 66 28 20 70 4c 69  LIST";.  if( pLi
3f30: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  st==0 ){.    sql
3f40: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
3f50: 28 70 56 69 65 77 2c 20 22 25 73 20 28 65 6d 70  (pView, "%s (emp
3f60: 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20  ty)", zLabel);. 
3f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
3f80: 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  i;.    sqlite3Tr
3f90: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
3fa0: 2c 20 22 25 73 22 2c 20 7a 4c 61 62 65 6c 29 3b  , "%s", zLabel);
3fb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3fc0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3fd0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  +){.      int j 
3fe0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e  = pList->a[i].u.
3ff0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20  x.iOrderByCol;. 
4000: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4010: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a   = pList->a[i].z
4020: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
4030: 6a 20 7c 7c 20 7a 4e 61 6d 65 20 29 7b 0a 20 20  j || zName ){.  
4040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
4050: 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c  eViewPush(pView,
4060: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4070: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
4080: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
4090: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
40a0: 77 2c 20 22 41 53 20 25 73 22 2c 20 7a 4e 61 6d  w, "AS %s", zNam
40b0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
40c0: 20 20 69 66 28 20 6a 20 29 7b 0a 20 20 20 20 20    if( j ){.     
40d0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
40e0: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 69  ewLine(pView, "i
40f0: 4f 72 64 65 72 42 79 43 6f 6c 3d 25 64 22 2c 20  OrderByCol=%d", 
4100: 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
4110: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4120: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69  wExpr(pView, pLi
4130: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
4140: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
4150: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 7c  );.      if( j |
4160: 7c 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  | zName ){.     
4170: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
4180: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
4190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
41a0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72  }.void sqlite3Tr
41b0: 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 0a  eeViewExprList(.
41c0: 20 20 54 72 65 65 56 69 65 77 20 2a 70 56 69 65    TreeView *pVie
41d0: 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 4c  w,.  const ExprL
41e0: 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20 75 38  ist *pList,.  u8
41f0: 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c 0a 20   moreToFollow,. 
4200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61   const char *zLa
4210: 62 65 6c 0a 29 7b 0a 20 20 70 56 69 65 77 20 3d  bel.){.  pView =
4220: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
4230: 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65  Push(pView, more
4240: 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c  ToFollow);.  sql
4250: 69 74 65 33 54 72 65 65 56 69 65 77 42 61 72 65  ite3TreeViewBare
4260: 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
4270: 70 4c 69 73 74 2c 20 7a 4c 61 62 65 6c 29 3b 0a  pList, zLabel);.
4280: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4290: 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 0a  wPop(pView);.}..
42a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
42b0: 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.