/ Hex Artifact Content
Login

Artifact 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253:


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 5f  {.      sqlite3_
0690: 73 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63 2c  str_append(&acc,
06a0: 20 70 2d 3e 62 4c 69 6e 65 5b 69 5d 20 3f 20 22   p->bLine[i] ? "
06b0: 7c 20 20 20 22 20 3a 20 22 20 20 20 20 22 2c 20  |   " : "    ", 
06c0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  4);.    }.    sq
06d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
06e0: 28 26 61 63 63 2c 20 70 2d 3e 62 4c 69 6e 65 5b  (&acc, p->bLine[
06f0: 69 5d 20 3f 20 22 7c 2d 2d 20 22 20 3a 20 22 27  i] ? "|-- " : "'
0700: 2d 2d 20 22 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  -- ", 4);.  }.  
0710: 69 66 28 20 7a 46 6f 72 6d 61 74 21 3d 30 20 29  if( zFormat!=0 )
0720: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
0730: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
0740: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 76 61 70   sqlite3_str_vap
0750: 70 65 6e 64 66 28 26 61 63 63 2c 20 7a 46 6f 72  pendf(&acc, zFor
0760: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
0770: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 61 73  _end(ap);.    as
0780: 73 65 72 74 28 20 61 63 63 2e 6e 43 68 61 72 3e  sert( acc.nChar>
0790: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
07a0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63  _str_append(&acc
07b0: 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a  , "\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 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
0b90: 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20 70 43  ndf(&x, "%s", pC
0ba0: 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
0bb0: 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
0bc0: 73 20 26 26 20 70 43 74 65 2d 3e 70 43 6f 6c 73  s && pCte->pCols
0bd0: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20  ->nExpr>0 ){.   
0be0: 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d       char cSep =
0bf0: 20 27 28 27 3b 0a 20 20 20 20 20 20 20 20 69 6e   '(';.        in
0c00: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
0c10: 28 6a 3d 30 3b 20 6a 3c 70 43 74 65 2d 3e 70 43  (j=0; j<pCte->pC
0c20: 6f 6c 73 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ols->nExpr; j++)
0c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
0c40: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
0c50: 26 78 2c 20 22 25 63 25 73 22 2c 20 63 53 65 70  &x, "%c%s", cSep
0c60: 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 61  , pCte->pCols->a
0c70: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
0c80: 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27        cSep = ','
0c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
0cb0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 29 22 29  appendf(&x, ")")
0cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0cd0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
0ce0: 6e 64 66 28 26 78 2c 20 22 20 41 53 22 29 3b 0a  ndf(&x, " AS");.
0cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
0d00: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
0d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
0d20: 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
0d30: 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70 57 69 74 68  , zLine, i<pWith
0d40: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 20  ->nCte-1);.     
0d50: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
0d60: 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 43  Select(pView, pC
0d70: 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
0d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
0d90: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
0da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0db0: 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
0dc0: 56 69 65 77 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  View);.  }.}../*
0dd0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
0de0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
0df0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 53  scription of a S
0e00: 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a  rcList object..*
0e10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72  /.void sqlite3Tr
0e20: 65 65 56 69 65 77 53 72 63 4c 69 73 74 28 54 72  eeViewSrcList(Tr
0e30: 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63  eeView *pView, c
0e40: 6f 6e 73 74 20 53 72 63 4c 69 73 74 20 2a 70 53  onst SrcList *pS
0e50: 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rc){.  int i;.  
0e60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
0e70: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
0e80: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 72   const struct Sr
0e90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
0ea0: 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
0eb0: 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 78 3b  .    StrAccum x;
0ec0: 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  .    char zLine[
0ed0: 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  100];.    sqlite
0ee0: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
0ef0: 2c 20 30 2c 20 7a 4c 69 6e 65 2c 20 73 69 7a 65  , 0, zLine, size
0f00: 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b 0a 20  of(zLine), 0);. 
0f10: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
0f20: 70 70 65 6e 64 66 28 26 78 2c 20 22 7b 25 64 2c  ppendf(&x, "{%d,
0f30: 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  *}", pItem->iCur
0f40: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49  sor);.    if( pI
0f50: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 29  tem->zDatabase )
0f60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0f70: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
0f80: 22 20 25 73 2e 25 73 22 2c 20 70 49 74 65 6d 2d  " %s.%s", pItem-
0f90: 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 49 74 65  >zDatabase, pIte
0fa0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
0fb0: 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
0fc0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  zName ){.      s
0fd0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
0fe0: 64 66 28 26 78 2c 20 22 20 25 73 22 2c 20 70 49  df(&x, " %s", pI
0ff0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1000: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d   }.    if( pItem
1010: 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
1020: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
1030: 6e 64 66 28 26 78 2c 20 22 20 74 61 62 6e 61 6d  ndf(&x, " tabnam
1040: 65 3d 25 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54  e=%Q", pItem->pT
1050: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1060: 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  }.    if( pItem-
1070: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
1080: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1090: 65 6e 64 66 28 26 78 2c 20 22 20 28 41 53 20 25  endf(&x, " (AS %
10a0: 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  s)", pItem->zAli
10b0: 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  as);.    }.    i
10c0: 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  f( pItem->fg.joi
10d0: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
10e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10f0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
1100: 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a   " LEFT-JOIN");.
1110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1120: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
1130: 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &x);.    sqlite3
1140: 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
1150: 65 77 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70 53 72  ew, zLine, i<pSr
1160: 63 2d 3e 6e 53 72 63 2d 31 29 3b 20 0a 20 20 20  c->nSrc-1); .   
1170: 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1180: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
1190: 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
11a0: 63 74 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d  ct(pView, pItem-
11b0: 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
11c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65    }.    if( pIte
11d0: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
11e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11f0: 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1200: 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d 3e 75  (pView, pItem->u
1210: 31 2e 70 46 75 6e 63 41 72 67 2c 20 30 2c 20 22  1.pFuncArg, 0, "
1220: 66 75 6e 63 2d 61 72 67 73 3a 22 29 3b 0a 20 20  func-args:");.  
1230: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54    }.    sqlite3T
1240: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1250: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1260: 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
1270: 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69  -readable descri
1280: 70 74 69 6f 6e 20 6f 66 20 61 20 53 65 6c 65 63  ption of a Selec
1290: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
12a0: 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  d sqlite3TreeVie
12b0: 77 53 65 6c 65 63 74 28 54 72 65 65 56 69 65 77  wSelect(TreeView
12c0: 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20 53   *pView, const S
12d0: 65 6c 65 63 74 20 2a 70 2c 20 75 38 20 6d 6f 72  elect *p, u8 mor
12e0: 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e  eToFollow){.  in
12f0: 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t n = 0;.  int c
1300: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  nt = 0;.  if( p=
1310: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1320: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1330: 69 65 77 2c 20 22 6e 69 6c 2d 53 45 4c 45 43 54  iew, "nil-SELECT
1340: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
1350: 20 20 7d 20 0a 20 20 70 56 69 65 77 20 3d 20 73    } .  pView = s
1360: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
1370: 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f  sh(pView, moreTo
1380: 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70  Follow);.  if( p
1390: 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73  ->pWith ){.    s
13a0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 57 69  qlite3TreeViewWi
13b0: 74 68 28 70 56 69 65 77 2c 20 70 2d 3e 70 57 69  th(pView, p->pWi
13c0: 74 68 2c 20 31 29 3b 0a 20 20 20 20 63 6e 74 20  th, 1);.    cnt 
13d0: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
13e0: 54 72 65 65 56 69 65 77 50 75 73 68 28 70 56 69  TreeViewPush(pVi
13f0: 65 77 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 64 6f  ew, 1);.  }.  do
1400: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
1410: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1420: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 25 73  .      "SELECT%s
1430: 25 73 20 28 25 75 2f 25 70 29 20 73 65 6c 46 6c  %s (%u/%p) selFl
1440: 61 67 73 3d 30 78 25 78 20 6e 53 65 6c 65 63 74  ags=0x%x nSelect
1450: 52 6f 77 3d 25 64 22 2c 0a 20 20 20 20 20 20 28  Row=%d",.      (
1460: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1470: 46 5f 44 69 73 74 69 6e 63 74 29 20 3f 20 22 20  F_Distinct) ? " 
1480: 44 49 53 54 49 4e 43 54 22 20 3a 20 22 22 29 2c  DISTINCT" : ""),
1490: 0a 20 20 20 20 20 20 28 28 70 2d 3e 73 65 6c 46  .      ((p->selF
14a0: 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
14b0: 61 74 65 29 20 3f 20 22 20 61 67 67 5f 66 6c 61  ate) ? " agg_fla
14c0: 67 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20  g" : ""),.      
14d0: 70 2d 3e 73 65 6c 49 64 2c 20 70 2c 20 70 2d 3e  p->selId, p, p->
14e0: 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  selFlags,.      
14f0: 28 69 6e 74 29 70 2d 3e 6e 53 65 6c 65 63 74 52  (int)p->nSelectR
1500: 6f 77 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ow.    );.    if
1510: 28 20 63 6e 74 2b 2b 20 29 20 73 71 6c 69 74 65  ( cnt++ ) sqlite
1520: 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69  3TreeViewPop(pVi
1530: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ew);.    if( p->
1540: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20  pPrior ){.      
1550: 6e 20 3d 20 31 30 30 30 3b 0a 20 20 20 20 7d 65  n = 1000;.    }e
1560: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 30  lse{.      n = 0
1570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
1580: 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
1590: 6e 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  nSrc ) n++;.    
15a0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
15b0: 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) n++;.      if(
15c0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20 6e   p->pGroupBy ) n
15d0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
15e0: 3e 70 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a  >pHaving ) n++;.
15f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
1600: 64 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 20  derBy ) n++;.   
1610: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74     if( p->pLimit
1620: 20 29 20 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20   ) n++;.#ifndef 
1630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
1640: 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  OWFUNC.      if(
1650: 20 70 2d 3e 70 57 69 6e 20 29 20 6e 2b 2b 3b 0a   p->pWin ) n++;.
1660: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69        if( p->pWi
1670: 6e 44 65 66 6e 20 29 20 6e 2b 2b 3b 0a 23 65 6e  nDefn ) n++;.#en
1680: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1690: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
16a0: 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e  rList(pView, p->
16b0: 70 45 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e 30 2c  pEList, (n--)>0,
16c0: 20 22 72 65 73 75 6c 74 2d 73 65 74 22 29 3b 0a   "result-set");.
16d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16e0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
16f0: 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29     if( p->pWin )
1700: 7b 0a 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a  {.      Window *
1710: 70 58 3b 0a 20 20 20 20 20 20 70 56 69 65 77 20  pX;.      pView 
1720: 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
1730: 77 50 75 73 68 28 70 56 69 65 77 2c 20 28 6e 2d  wPush(pView, (n-
1740: 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  -)>0);.      sql
1750: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1760: 28 70 56 69 65 77 2c 20 22 77 69 6e 64 6f 77 2d  (pView, "window-
1770: 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20  functions");.   
1780: 20 20 20 66 6f 72 28 70 58 3d 70 2d 3e 70 57 69     for(pX=p->pWi
1790: 6e 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  n; pX; pX=pX->pN
17a0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20  extWin){.       
17b0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
17c0: 57 69 6e 46 75 6e 63 28 70 56 69 65 77 2c 20 70  WinFunc(pView, p
17d0: 58 2c 20 70 58 2d 3e 70 4e 65 78 74 57 69 6e 21  X, pX->pNextWin!
17e0: 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
17f0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1800: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
1810: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
1820: 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  f( p->pSrc && p-
1830: 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  >pSrc->nSrc ){. 
1840: 20 20 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c       pView = sql
1850: 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
1860: 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29  (pView, (n--)>0)
1870: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1880: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1890: 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20 20  w, "FROM");.    
18a0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
18b0: 77 53 72 63 4c 69 73 74 28 70 56 69 65 77 2c 20  wSrcList(pView, 
18c0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  p->pSrc);.      
18d0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
18e0: 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d  op(pView);.    }
18f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 68 65  .    if( p->pWhe
1900: 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  re ){.      sqli
1910: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
1920: 70 56 69 65 77 2c 20 22 57 48 45 52 45 22 2c 20  pView, "WHERE", 
1930: 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20  (n--)>0);.      
1940: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1950: 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 57  xpr(pView, p->pW
1960: 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
1970: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
1980: 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d  op(pView);.    }
1990: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  .    if( p->pGro
19a0: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71  upBy ){.      sq
19b0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
19c0: 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e  rList(pView, p->
19d0: 70 47 72 6f 75 70 42 79 2c 20 28 6e 2d 2d 29 3e  pGroupBy, (n--)>
19e0: 30 2c 20 22 47 52 4f 55 50 42 59 22 29 3b 0a 20  0, "GROUPBY");. 
19f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1a00: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1a10: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1a20: 49 74 65 6d 28 70 56 69 65 77 2c 20 22 48 41 56  Item(pView, "HAV
1a30: 49 4e 47 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  ING", (n--)>0);.
1a40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1a50: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
1a60: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 3b   p->pHaving, 0);
1a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1a80: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
1a90: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1aa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
1ab0: 4f 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70  OWFUNC.    if( p
1ac0: 2d 3e 70 57 69 6e 44 65 66 6e 20 29 7b 0a 20 20  ->pWinDefn ){.  
1ad0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 58 3b 0a      Window *pX;.
1ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1af0: 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
1b00: 20 22 57 49 4e 44 4f 57 22 2c 20 28 6e 2d 2d 29   "WINDOW", (n--)
1b10: 3e 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  >0);.      for(p
1b20: 58 3d 70 2d 3e 70 57 69 6e 44 65 66 6e 3b 20 70  X=p->pWinDefn; p
1b30: 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 57  X; pX=pX->pNextW
1b40: 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  in){.        sql
1b50: 69 74 65 33 54 72 65 65 56 69 65 77 57 69 6e 64  ite3TreeViewWind
1b60: 6f 77 28 70 56 69 65 77 2c 20 70 58 2c 20 70 58  ow(pView, pX, pX
1b70: 2d 3e 70 4e 65 78 74 57 69 6e 21 3d 30 29 3b 0a  ->pNextWin!=0);.
1b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1b90: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1ba0: 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 23  (pView);.    }.#
1bb0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
1bc0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1bd0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1be0: 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
1bf0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 28  , p->pOrderBy, (
1c00: 6e 2d 2d 29 3e 30 2c 20 22 4f 52 44 45 52 42 59  n--)>0, "ORDERBY
1c10: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
1c20: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
1c30: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1c40: 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20  ViewItem(pView, 
1c50: 22 4c 49 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e 30  "LIMIT", (n--)>0
1c60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c70: 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
1c80: 65 77 2c 20 70 2d 3e 70 4c 69 6d 69 74 2d 3e 70  ew, p->pLimit->p
1c90: 4c 65 66 74 2c 20 70 2d 3e 70 4c 69 6d 69 74 2d  Left, p->pLimit-
1ca0: 3e 70 52 69 67 68 74 21 3d 30 29 3b 0a 20 20 20  >pRight!=0);.   
1cb0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74     if( p->pLimit
1cc0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
1cd0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1ce0: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
1cf0: 4f 46 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e 30  OFFSET", (n--)>0
1d00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d10: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1d20: 56 69 65 77 2c 20 70 2d 3e 70 4c 69 6d 69 74 2d  View, p->pLimit-
1d30: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
1d40: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d50: 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
1d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d70: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1d80: 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20  (pView);.    }. 
1d90: 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
1da0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1db0: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 22 55 4e 49  char *zOp = "UNI
1dc0: 4f 4e 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  ON";.      switc
1dd0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
1de0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
1df0: 20 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22           zOp = "
1e00: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 62 72 65  UNION ALL";  bre
1e10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1e20: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 20   TK_INTERSECT:  
1e30: 20 7a 4f 70 20 3d 20 22 49 4e 54 45 52 53 45 43   zOp = "INTERSEC
1e40: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
1e50: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
1e60: 50 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  PT:      zOp = "
1e70: 45 58 43 45 50 54 22 3b 20 20 20 20 20 62 72 65  EXCEPT";     bre
1e80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1e90: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1ea0: 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4f 70  wItem(pView, zOp
1eb0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1ec0: 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
1ed0: 20 7d 77 68 69 6c 65 28 20 70 21 3d 30 20 29 3b   }while( p!=0 );
1ee0: 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  .  sqlite3TreeVi
1ef0: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a  ewPop(pView);.}.
1f00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f10: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
1f20: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1f30: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
1f40: 73 74 61 72 74 69 6e 67 20 6f 72 20 73 74 6f 70  starting or stop
1f50: 70 69 6e 67 20 62 6f 75 6e 64 73 0a 2a 2f 0a 76  ping bounds.*/.v
1f60: 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56  oid sqlite3TreeV
1f70: 69 65 77 42 6f 75 6e 64 28 0a 20 20 54 72 65 65  iewBound(.  Tree
1f80: 56 69 65 77 20 2a 70 56 69 65 77 2c 20 20 20 20  View *pView,    
1f90: 20 20 20 20 2f 2a 20 56 69 65 77 20 63 6f 6e 74      /* View cont
1fa0: 65 78 74 20 2a 2f 0a 20 20 75 38 20 65 42 6f 75  ext */.  u8 eBou
1fb0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
1fc0: 20 2f 2a 20 55 4e 42 4f 55 4e 44 45 44 2c 20 43   /* UNBOUNDED, C
1fd0: 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e  URRENT, PRECEDIN
1fe0: 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a  G, FOLLOWING */.
1ff0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
2000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
2010: 75 65 20 66 6f 72 20 50 52 45 43 45 44 49 4e 47  ue for PRECEDING
2020: 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f   or FOLLOWING */
2030: 0a 20 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c  .  u8 moreToFoll
2040: 6f 77 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ow         /* Tr
2050: 75 65 20 69 66 20 6d 6f 72 65 20 74 6f 20 66 6f  ue if more to fo
2060: 6c 6c 6f 77 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  llow */.){.  swi
2070: 74 63 68 28 20 65 42 6f 75 6e 64 20 29 7b 0a 20  tch( eBound ){. 
2080: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55     case TK_UNBOU
2090: 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  NDED: {.      sq
20a0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
20b0: 6d 28 70 56 69 65 77 2c 20 22 55 4e 42 4f 55 4e  m(pView, "UNBOUN
20c0: 44 45 44 22 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c  DED", moreToFoll
20d0: 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
20e0: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
20f0: 69 65 77 29 3b 0a 20 20 20 20 20 20 62 72 65 61  iew);.      brea
2100: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2110: 65 20 54 4b 5f 43 55 52 52 45 4e 54 3a 20 7b 0a  e TK_CURRENT: {.
2120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2130: 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
2140: 20 22 43 55 52 52 45 4e 54 22 2c 20 6d 6f 72 65   "CURRENT", more
2150: 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20  ToFollow);.     
2160: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2170: 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20  Pop(pView);.    
2180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2190: 20 20 20 63 61 73 65 20 54 4b 5f 50 52 45 43 45     case TK_PRECE
21a0: 44 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71  DING: {.      sq
21b0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
21c0: 6d 28 70 56 69 65 77 2c 20 22 50 52 45 43 45 44  m(pView, "PRECED
21d0: 49 4e 47 22 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c  ING", moreToFoll
21e0: 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
21f0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
2200: 56 69 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b  View, pExpr, 0);
2210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
2220: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
2230: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2240: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2250: 5f 46 4f 4c 4c 4f 57 49 4e 47 3a 20 7b 0a 20 20  _FOLLOWING: {.  
2260: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2270: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
2280: 46 4f 4c 4c 4f 57 49 4e 47 22 2c 20 6d 6f 72 65  FOLLOWING", more
2290: 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20  ToFollow);.     
22a0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
22b0: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
22c0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
22d0: 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
22e0: 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20 62 72  pView);.      br
22f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
2300: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2310: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
2320: 43 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  C */..#ifndef SQ
2330: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2340: 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  FUNC./*.** Gener
2350: 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
2360: 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  able explanation
2370: 20 66 6f 72 20 61 20 57 69 6e 64 6f 77 20 6f 62   for a Window ob
2380: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
2390: 69 74 65 33 54 72 65 65 56 69 65 77 57 69 6e 64  ite3TreeViewWind
23a0: 6f 77 28 54 72 65 65 56 69 65 77 20 2a 70 56 69  ow(TreeView *pVi
23b0: 65 77 2c 20 63 6f 6e 73 74 20 57 69 6e 64 6f 77  ew, const Window
23c0: 20 2a 70 57 69 6e 2c 20 75 38 20 6d 6f 72 65 29   *pWin, u8 more)
23d0: 7b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69  {.  pView = sqli
23e0: 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
23f0: 70 56 69 65 77 2c 20 6d 6f 72 65 29 3b 0a 20 20  pView, more);.  
2400: 69 66 28 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20  if( pWin->zName 
2410: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2420: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
2430: 2c 20 22 4f 56 45 52 20 25 73 22 2c 20 70 57 69  , "OVER %s", pWi
2440: 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  n->zName);.  }el
2450: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  se{.    sqlite3T
2460: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
2470: 77 2c 20 22 4f 56 45 52 22 29 3b 0a 20 20 7d 0a  w, "OVER");.  }.
2480: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72    if( pWin->pPar
2490: 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71  tition ){.    sq
24a0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
24b0: 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 57 69  rList(pView, pWi
24c0: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 31  n->pPartition, 1
24d0: 2c 20 22 50 41 52 54 49 54 49 4f 4e 2d 42 59 22  , "PARTITION-BY"
24e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 69  );.  }.  if( pWi
24f0: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  n->pOrderBy ){. 
2500: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2510: 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
2520: 2c 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  , pWin->pOrderBy
2530: 2c 20 31 2c 20 22 4f 52 44 45 52 2d 42 59 22 29  , 1, "ORDER-BY")
2540: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 69 6e  ;.  }.  if( pWin
2550: 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 73  ->eType ){.    s
2560: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74  qlite3TreeViewIt
2570: 65 6d 28 70 56 69 65 77 2c 20 70 57 69 6e 2d 3e  em(pView, pWin->
2580: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
2590: 3f 20 22 52 41 4e 47 45 22 20 3a 20 22 52 4f 57  ? "RANGE" : "ROW
25a0: 53 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  S", 0);.    sqli
25b0: 74 65 33 54 72 65 65 56 69 65 77 42 6f 75 6e 64  te3TreeViewBound
25c0: 28 70 56 69 65 77 2c 20 70 57 69 6e 2d 3e 65 53  (pView, pWin->eS
25d0: 74 61 72 74 2c 20 70 57 69 6e 2d 3e 70 53 74 61  tart, pWin->pSta
25e0: 72 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  rt, 1);.    sqli
25f0: 74 65 33 54 72 65 65 56 69 65 77 42 6f 75 6e 64  te3TreeViewBound
2600: 28 70 56 69 65 77 2c 20 70 57 69 6e 2d 3e 65 45  (pView, pWin->eE
2610: 6e 64 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 2c 20  nd, pWin->pEnd, 
2620: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
2630: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
2640: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2650: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
2660: 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  w);.}.#endif /* 
2670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2680: 4f 57 46 55 4e 43 20 2a 2f 0a 0a 23 69 66 6e 64  OWFUNC */..#ifnd
2690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
26a0: 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20  INDOWFUNC./*.** 
26b0: 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
26c0: 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
26d0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 57 69 6e 64  ation for a Wind
26e0: 6f 77 20 46 75 6e 63 74 69 6f 6e 20 6f 62 6a 65  ow Function obje
26f0: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
2700: 65 33 54 72 65 65 56 69 65 77 57 69 6e 46 75 6e  e3TreeViewWinFun
2710: 63 28 54 72 65 65 56 69 65 77 20 2a 70 56 69 65  c(TreeView *pVie
2720: 77 2c 20 63 6f 6e 73 74 20 57 69 6e 64 6f 77 20  w, const Window 
2730: 2a 70 57 69 6e 2c 20 75 38 20 6d 6f 72 65 29 7b  *pWin, u8 more){
2740: 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74  .  pView = sqlit
2750: 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70  e3TreeViewPush(p
2760: 56 69 65 77 2c 20 6d 6f 72 65 29 3b 0a 20 20 73  View, more);.  s
2770: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
2780: 6e 65 28 70 56 69 65 77 2c 20 22 57 49 4e 46 55  ne(pView, "WINFU
2790: 4e 43 20 25 73 28 25 64 29 22 2c 0a 20 20 20 20  NC %s(%d)",.    
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e     pWin->pFunc->
27c0: 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e 70 46 75  zName, pWin->pFu
27d0: 6e 63 2d 3e 6e 41 72 67 29 3b 0a 20 20 73 71 6c  nc->nArg);.  sql
27e0: 69 74 65 33 54 72 65 65 56 69 65 77 57 69 6e 64  ite3TreeViewWind
27f0: 6f 77 28 70 56 69 65 77 2c 20 70 57 69 6e 2c 20  ow(pView, pWin, 
2800: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 65  0);.  sqlite3Tre
2810: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
2820: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2830: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
2840: 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  UNC */../*.** Ge
2850: 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
2860: 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
2870: 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
2880: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
2890: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
28a0: 65 77 45 78 70 72 28 54 72 65 65 56 69 65 77 20  ewExpr(TreeView 
28b0: 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20 45 78  *pView, const Ex
28c0: 70 72 20 2a 70 45 78 70 72 2c 20 75 38 20 6d 6f  pr *pExpr, u8 mo
28d0: 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 63  reToFollow){.  c
28e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f  onst char *zBinO
28f0: 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61  p = 0;   /* Bina
2900: 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ry operator */. 
2910: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e   const char *zUn
2920: 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e  iOp = 0;   /* Un
2930: 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ary operator */.
2940: 20 20 63 68 61 72 20 7a 46 6c 67 73 5b 36 30 5d    char zFlgs[60]
2950: 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69  ;.  pView = sqli
2960: 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
2970: 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c  pView, moreToFol
2980: 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70 45 78 70  low);.  if( pExp
2990: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
29a0: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
29b0: 70 56 69 65 77 2c 20 22 6e 69 6c 22 29 3b 0a 20  pView, "nil");. 
29c0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
29d0: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
29e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
29f0: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
2a00: 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72   ){.    if( Expr
2a10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2a20: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
2a30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a40: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2a50: 28 7a 46 6c 67 73 29 2c 7a 46 6c 67 73 2c 22 20  (zFlgs),zFlgs," 
2a60: 20 66 6c 61 67 73 3d 30 78 25 78 20 69 52 4a 54   flags=0x%x iRJT
2a70: 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%d",.          
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2a90: 70 72 2d 3e 66 6c 61 67 73 2c 20 70 45 78 70 72  pr->flags, pExpr
2aa0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2ab0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2ad0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 46 6c  rintf(sizeof(zFl
2ae0: 67 73 29 2c 7a 46 6c 67 73 2c 22 20 20 66 6c 61  gs),zFlgs,"  fla
2af0: 67 73 3d 30 78 25 78 22 2c 70 45 78 70 72 2d 3e  gs=0x%x",pExpr->
2b00: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
2b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 6c 67 73  }else{.    zFlgs
2b20: 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  [0] = 0;.  }.  s
2b30: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2b50: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
2b60: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2b70: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
2b80: 41 47 47 7b 25 64 3a 25 64 7d 25 73 22 2c 0a 20  AGG{%d:%d}%s",. 
2b90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2ba0: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
2bb0: 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73 29  >iColumn, zFlgs)
2bc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2bd0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2be0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
2bf0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2c00: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
2c10: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
2c20: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
2c30: 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
2c40: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ts */.        sq
2c50: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
2c60: 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 55 4d 4e  e(pView, "COLUMN
2c70: 28 25 64 29 25 73 22 2c 20 70 45 78 70 72 2d 3e  (%d)%s", pExpr->
2c80: 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73 29 3b  iColumn, zFlgs);
2c90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2cb0: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
2cc0: 20 22 7b 25 64 3a 25 64 7d 25 73 22 2c 0a 20 20   "{%d:%d}%s",.  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2cf0: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
2d00: 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73 29  >iColumn, zFlgs)
2d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d20: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2d30: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
2d40: 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  xedCol) ){.     
2d50: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2d60: 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
2d70: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
2d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
2d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2da0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
2db0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2dc0: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
2dd0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  tValue ){.      
2de0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2df0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 64  wLine(pView, "%d
2e00: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
2e10: 75 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ue);.      }else
2e20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e30: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
2e40: 69 65 77 2c 20 22 25 73 22 2c 20 70 45 78 70 72  iew, "%s", pExpr
2e50: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
2e60: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
2e70: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
2e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
2e90: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
2ea0: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
2eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2ec0: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
2ed0: 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
2ee0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
2ef0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
2f00: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
2f10: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71  RING: {.      sq
2f20: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
2f30: 65 28 70 56 69 65 77 2c 22 25 51 22 2c 20 70 45  e(pView,"%Q", pE
2f40: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
2f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
2f70: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
2f80: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
2f90: 28 70 56 69 65 77 2c 22 4e 55 4c 4c 22 29 3b 0a  (pView,"NULL");.
2fa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2fb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
2fc0: 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  RUEFALSE: {.    
2fd0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2fe0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 0a 20 20 20  wLine(pView,.   
2ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3000: 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
3010: 72 29 20 3f 20 22 54 52 55 45 22 20 3a 20 22 46  r) ? "TRUE" : "F
3020: 41 4c 53 45 22 29 3b 0a 20 20 20 20 20 20 62 72  ALSE");.      br
3030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
3040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
3050: 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
3060: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
3070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
3080: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
3090: 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
30a0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
30b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
30c0: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
30d0: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
30e0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
30f0: 69 6e 65 28 70 56 69 65 77 2c 22 56 41 52 49 41  ine(pView,"VARIA
3100: 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20  BLE(%s,%d)",.   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
3130: 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69  zToken, pExpr->i
3140: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
3150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3160: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
3170: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3180: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
3190: 69 65 77 2c 22 52 45 47 49 53 54 45 52 28 25 64  iew,"REGISTER(%d
31a0: 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  )", pExpr->iTabl
31b0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
31c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
31d0: 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73  TK_ID: {.      s
31e0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
31f0: 6e 65 28 70 56 69 65 77 2c 22 49 44 20 5c 22 25  ne(pView,"ID \"%
3200: 77 5c 22 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  w\"", pExpr->u.z
3210: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
3220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
3230: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
3240: 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
3250: 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
3260: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
3270: 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
3280: 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
3290: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
32a0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
32b0: 69 65 77 2c 22 43 41 53 54 20 25 51 22 2c 20 70  iew,"CAST %Q", p
32c0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
32d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
32e0: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
32f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
3300: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
3310: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
3320: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
3330: 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
3340: 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _LT:      zBinOp
3350: 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65   = "LT";     bre
3360: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3370: 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  LE:      zBinOp 
3380: 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61  = "LE";     brea
3390: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
33a0: 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  T:      zBinOp =
33b0: 20 22 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b   "GT";     break
33c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
33d0: 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
33e0: 22 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "GE";     break;
33f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
3400: 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
3410: 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  NE";     break;.
3420: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
3430: 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45       zBinOp = "E
3440: 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Q";     break;. 
3450: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20     case TK_IS:  
3460: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53      zBinOp = "IS
3470: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
3480: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
3490: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e     zBinOp = "ISN
34a0: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
34b0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
34c0: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22    zBinOp = "AND"
34d0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
34e0: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20  case TK_OR:     
34f0: 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20   zBinOp = "OR"; 
3500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3510: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
3520: 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20  zBinOp = "ADD"; 
3530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3540: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
3550: 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20  BinOp = "MUL";  
3560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
3570: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42  e TK_MINUS:   zB
3580: 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20  inOp = "SUB";   
3590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
35a0: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69   TK_REM:     zBi
35b0: 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  nOp = "REM";    
35c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
35d0: 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e  TK_BITAND:  zBin
35e0: 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62  Op = "BITAND"; b
35f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3600: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f  K_BITOR:   zBinO
3610: 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72  p = "BITOR";  br
3620: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3630: 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70  _SLASH:   zBinOp
3640: 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72 65   = "DIV";    bre
3650: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3660: 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20  LSHIFT:  zBinOp 
3670: 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61  = "LSHIFT"; brea
3680: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
3690: 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  SHIFT:  zBinOp =
36a0: 20 22 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b   "RSHIFT"; break
36b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
36c0: 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  NCAT:  zBinOp = 
36d0: 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b  "CONCAT"; break;
36e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
36f0: 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
3700: 44 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DOT";    break;.
3710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
3720: 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  NUS:  zUniOp = "
3730: 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a  UMINUS"; break;.
3740: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
3750: 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55  S:   zUniOp = "U
3760: 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20  PLUS";  break;. 
3770: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
3780: 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49  T:  zUniOp = "BI
3790: 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TNOT"; break;.  
37a0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
37b0: 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54     zUniOp = "NOT
37c0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
37d0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
37e0: 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55    zUniOp = "ISNU
37f0: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL"; break;.    
3800: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
3810: 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55   zUniOp = "NOTNU
3820: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
3830: 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
3840: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20  {.      int x;. 
3850: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
3860: 2a 61 7a 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  *azOp[] = {.    
3870: 20 20 20 20 20 22 49 53 2d 46 41 4c 53 45 22 2c       "IS-FALSE",
3880: 20 22 49 53 2d 54 52 55 45 22 2c 20 22 49 53 2d   "IS-TRUE", "IS-
3890: 4e 4f 54 2d 46 41 4c 53 45 22 2c 20 22 49 53 2d  NOT-FALSE", "IS-
38a0: 4e 4f 54 2d 54 52 55 45 22 0a 20 20 20 20 20 20  NOT-TRUE".      
38b0: 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
38c0: 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
38d0: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 32  IS || pExpr->op2
38e0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
38f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3900: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
3910: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3920: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
3930: 5f 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20 20  _TRUEFALSE );.  
3940: 20 20 20 20 78 20 3d 20 28 70 45 78 70 72 2d 3e      x = (pExpr->
3950: 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 29 2a 32  op2==TK_ISNOT)*2
3960: 20 2b 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   + sqlite3ExprTr
3970: 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
3980: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7a  pRight);.      z
3990: 55 6e 69 4f 70 20 3d 20 61 7a 4f 70 5b 78 5d 3b  UniOp = azOp[x];
39a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
39b0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
39c0: 5f 53 50 41 4e 3a 20 7b 0a 20 20 20 20 20 20 73  _SPAN: {.      s
39d0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
39e0: 6e 65 28 70 56 69 65 77 2c 20 22 53 50 41 4e 20  ne(pView, "SPAN 
39f0: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
3a00: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
3a10: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
3a20: 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70  (pView, pExpr->p
3a30: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
3a40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a50: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
3a60: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
3a70: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
3a80: 56 69 65 77 2c 20 22 43 4f 4c 4c 41 54 45 20 25  View, "COLLATE %
3a90: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
3aa0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
3ab0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
3ac0: 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
3ad0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  eft, 0);.      b
3ae0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3af0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
3b00: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
3b10: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
3b20: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
3b30: 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
3b40: 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
3b50: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
3b60: 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b     Window *pWin;
3b70: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
3b80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
3b90: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
3ba0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
3bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 57   = 0;.        pW
3bc0: 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  in = 0;.      }e
3bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
3be0: 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
3bf0: 69 73 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ist;.#ifndef SQL
3c00: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
3c10: 55 4e 43 0a 20 20 20 20 20 20 20 20 70 57 69 6e  UNC.        pWin
3c20: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e   = pExpr->y.pWin
3c30: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
3c40: 70 57 69 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWin = 0;.#endif
3c50: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
3c60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
3c70: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
3c80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3c90: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
3ca0: 69 65 77 2c 20 22 41 47 47 5f 46 55 4e 43 54 49  iew, "AGG_FUNCTI
3cb0: 4f 4e 25 64 20 25 51 22 2c 0a 20 20 20 20 20 20  ON%d %Q",.      
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
3ce0: 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  2, pExpr->u.zTok
3cf0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
3d00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3d10: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
3d20: 69 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e 20 25  iew, "FUNCTION %
3d30: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
3d40: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
3d50: 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
3d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3d70: 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
3d80: 28 70 56 69 65 77 2c 20 70 46 61 72 67 2c 20 70  (pView, pFarg, p
3d90: 57 69 6e 21 3d 30 2c 20 30 29 3b 0a 20 20 20 20  Win!=0, 0);.    
3da0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
3db0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
3dc0: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70 57 69  NC.      if( pWi
3dd0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
3de0: 69 74 65 33 54 72 65 65 56 69 65 77 57 69 6e 64  ite3TreeViewWind
3df0: 6f 77 28 70 56 69 65 77 2c 20 70 57 69 6e 2c 20  ow(pView, pWin, 
3e00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
3e10: 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
3e20: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
3e30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3e40: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
3e50: 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73  XISTS: {.      s
3e60: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
3e70: 6e 65 28 70 56 69 65 77 2c 20 22 45 58 49 53 54  ne(pView, "EXIST
3e80: 53 2d 65 78 70 72 20 66 6c 61 67 73 3d 30 78 25  S-expr flags=0x%
3e90: 78 22 2c 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  x", pExpr->flags
3ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3eb0: 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70  TreeViewSelect(p
3ec0: 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  View, pExpr->x.p
3ed0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
3ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ef0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
3f00: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
3f10: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
3f20: 56 69 65 77 2c 20 22 53 45 4c 45 43 54 2d 65 78  View, "SELECT-ex
3f30: 70 72 20 66 6c 61 67 73 3d 30 78 25 78 22 2c 20  pr flags=0x%x", 
3f40: 70 45 78 70 72 2d 3e 66 6c 61 67 73 29 3b 0a 20  pExpr->flags);. 
3f50: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
3f60: 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77  ViewSelect(pView
3f70: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
3f80: 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ct, 0);.      br
3f90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3fa0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
3fb0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3fc0: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 49  ewLine(pView, "I
3fd0: 4e 20 66 6c 61 67 73 3d 30 78 25 78 22 2c 20 70  N flags=0x%x", p
3fe0: 45 78 70 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20  Expr->flags);.  
3ff0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4000: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
4010: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b  Expr->pLeft, 1);
4020: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
4030: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
4040: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
4050: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4060: 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
4070: 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
4080: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
4090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
40a0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
40b0: 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
40c0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
40d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
40e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
4100: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4110: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
4120: 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
4130: 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
4140: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
4150: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
4160: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
4170: 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
4180: 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
4190: 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
41a0: 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
41b0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
41c0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
41d0: 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
41e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
41f0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
4200: 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
4210: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
4220: 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
4230: 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
4240: 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
4250: 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
4260: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
4270: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
4280: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
4290: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
42a0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
42b0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
42c0: 22 42 45 54 57 45 45 4e 22 29 3b 0a 20 20 20 20  "BETWEEN");.    
42d0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
42e0: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 58 2c  wExpr(pView, pX,
42f0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
4300: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
4310: 56 69 65 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20  View, pY, 1);.  
4320: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4330: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
4340: 5a 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  Z, 0);.      bre
4350: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4360: 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
4370: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4380: 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
4390: 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
43a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
43b0: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
43c0: 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
43d0: 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
43e0: 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
43f0: 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
4400: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
4410: 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
4420: 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
4430: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
4440: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
4450: 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
4460: 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
4470: 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
4480: 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
4490: 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
44a0: 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
44b0: 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
44c0: 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
44d0: 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
44e0: 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
44f0: 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
4500: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
4510: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
4520: 77 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20  w, "%s(%d)", .  
4530: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4540: 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20  Table ? "NEW" : 
4550: 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43  "OLD", pExpr->iC
4560: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
4570: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4580: 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
4590: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
45a0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
45b0: 22 43 41 53 45 22 29 3b 0a 20 20 20 20 20 20 73  "CASE");.      s
45c0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
45d0: 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
45e0: 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20  >pLeft, 1);.    
45f0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4600: 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
4610: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
4620: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
4630: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
4640: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
4650: 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
4660: 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
4670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
4680: 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  ype = "unk";.   
4690: 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
46a0: 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ->affinity ){.  
46b0: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
46c0: 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20  llback:   zType 
46d0: 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62  = "rollback";  b
46e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
46f0: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20  se OE_Abort:    
4700: 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74    zType = "abort
4710: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
4720: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61        case OE_Fa
4730: 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20  il:       zType 
4740: 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62  = "fail";      b
4750: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
4760: 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20  se OE_Ignore:   
4770: 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72    zType = "ignor
4780: 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
4790: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
47a0: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
47b0: 70 56 69 65 77 2c 20 22 52 41 49 53 45 20 25 73  pView, "RAISE %s
47c0: 28 25 51 29 22 2c 20 7a 54 79 70 65 2c 20 70 45  (%Q)", zType, pE
47d0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
47e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
4800: 73 65 20 54 4b 5f 4d 41 54 43 48 3a 20 7b 0a 20  se TK_MATCH: {. 
4810: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
4820: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
4830: 22 4d 41 54 43 48 20 7b 25 64 3a 25 64 7d 25 73  "MATCH {%d:%d}%s
4840: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
4860: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
4870: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67  r->iColumn, zFlg
4880: 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
4890: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
48a0: 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  iew, pExpr->pRig
48b0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ht, 0);.      br
48c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
48d0: 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b  ase TK_VECTOR: {
48e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
48f0: 65 65 56 69 65 77 42 61 72 65 45 78 70 72 4c 69  eeViewBareExprLi
4900: 73 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  st(pView, pExpr-
4910: 3e 78 2e 70 4c 69 73 74 2c 20 22 56 45 43 54 4f  >x.pList, "VECTO
4920: 52 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  R");.      break
4930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4940: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
4950: 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
4960: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
4970: 56 69 65 77 2c 20 22 53 45 4c 45 43 54 2d 43 4f  View, "SELECT-CO
4980: 4c 55 4d 4e 20 25 64 22 2c 20 70 45 78 70 72 2d  LUMN %d", pExpr-
4990: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
49a0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
49b0: 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45  Select(pView, pE
49c0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53  xpr->pLeft->x.pS
49d0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
49e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
49f0: 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
4a00: 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 73  L_ROW: {.      s
4a10: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
4a20: 6e 65 28 70 56 69 65 77 2c 20 22 49 46 2d 4e 55  ne(pView, "IF-NU
4a30: 4c 4c 2d 52 4f 57 20 25 64 22 2c 20 70 45 78 70  LL-ROW %d", pExp
4a40: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
4a50: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4a60: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78  wExpr(pView, pEx
4a70: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
4a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a90: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
4aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
4ab0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
4ac0: 2c 20 22 6f 70 3d 25 64 22 2c 20 70 45 78 70 72  , "op=%d", pExpr
4ad0: 2d 3e 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65  ->op);.      bre
4ae0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4af0: 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20  if( zBinOp ){.  
4b00: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4b10: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73  wLine(pView, "%s
4b20: 25 73 22 2c 20 7a 42 69 6e 4f 70 2c 20 7a 46 6c  %s", zBinOp, zFl
4b30: 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gs);.    sqlite3
4b40: 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
4b50: 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ew, pExpr->pLeft
4b60: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
4b70: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
4b80: 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  iew, pExpr->pRig
4b90: 68 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  ht, 0);.  }else 
4ba0: 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20  if( zUniOp ){.  
4bb0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4bc0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73  wLine(pView, "%s
4bd0: 25 73 22 2c 20 7a 55 6e 69 4f 70 2c 20 7a 46 6c  %s", zUniOp, zFl
4be0: 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gs);.    sqlite3
4bf0: 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
4c00: 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ew, pExpr->pLeft
4c10: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
4c20: 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
4c30: 56 69 65 77 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  View);.}.../*.**
4c40: 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
4c50: 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
4c60: 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70  nation of an exp
4c70: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65  .void sqlite3Tre
4c90: 65 56 69 65 77 42 61 72 65 45 78 70 72 4c 69 73  eViewBareExprLis
4ca0: 74 28 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70  t(.  TreeView *p
4cb0: 56 69 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78  View,.  const Ex
4cc0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20  prList *pList,. 
4cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61   const char *zLa
4ce0: 62 65 6c 0a 29 7b 0a 20 20 69 66 28 20 7a 4c 61  bel.){.  if( zLa
4cf0: 62 65 6c 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c  bel==0 || zLabel
4d00: 5b 30 5d 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20  [0]==0 ) zLabel 
4d10: 3d 20 22 4c 49 53 54 22 3b 0a 20 20 69 66 28 20  = "LIST";.  if( 
4d20: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
4d30: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
4d40: 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 20 28  ine(pView, "%s (
4d50: 65 6d 70 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29  empty)", zLabel)
4d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
4d70: 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
4d80: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
4d90: 69 65 77 2c 20 22 25 73 22 2c 20 7a 4c 61 62 65  iew, "%s", zLabe
4da0: 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l);.    for(i=0;
4db0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
4dc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
4dd0: 20 6a 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   j = pList->a[i]
4de0: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
4df0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  ;.      char *zN
4e00: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  ame = pList->a[i
4e10: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
4e20: 6e 74 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 20  nt moreToFollow 
4e30: 3d 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  = i<pList->nExpr
4e40: 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   - 1;.      if( 
4e50: 6a 20 7c 7c 20 7a 4e 61 6d 65 20 29 7b 0a 20 20  j || zName ){.  
4e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
4e70: 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c  eViewPush(pView,
4e80: 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a   moreToFollow);.
4e90: 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 46 6f          moreToFo
4ea0: 6c 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  llow = 0;.      
4eb0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4ec0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 30 29 3b  wLine(pView, 0);
4ed0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
4ee0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
4ef0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
4f00: 22 41 53 20 25 73 20 22 2c 20 7a 4e 61 6d 65 29  "AS %s ", zName)
4f10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4f20: 20 20 20 20 69 66 28 20 6a 20 29 7b 0a 20 20 20      if( j ){.   
4f30: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
4f40: 74 64 6f 75 74 2c 20 22 69 4f 72 64 65 72 42 79  tdout, "iOrderBy
4f50: 43 6f 6c 3d 25 64 22 2c 20 6a 29 3b 0a 20 20 20  Col=%d", j);.   
4f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
4f70: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
4f80: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 66 66  \n");.        ff
4f90: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4fb0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
4fc0: 70 56 69 65 77 2c 20 70 4c 69 73 74 2d 3e 61 5b  pView, pList->a[
4fd0: 69 5d 2e 70 45 78 70 72 2c 20 6d 6f 72 65 54 6f  i].pExpr, moreTo
4fe0: 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20 20 69  Follow);.      i
4ff0: 66 28 20 6a 20 7c 7c 20 7a 4e 61 6d 65 20 29 7b  f( j || zName ){
5000: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5010: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
5020: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
5030: 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
5040: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
5050: 4c 69 73 74 28 0a 20 20 54 72 65 65 56 69 65 77  List(.  TreeView
5060: 20 2a 70 56 69 65 77 2c 0a 20 20 63 6f 6e 73 74   *pView,.  const
5070: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5080: 2c 0a 20 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c  ,.  u8 moreToFol
5090: 6c 6f 77 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  low,.  const cha
50a0: 72 20 2a 7a 4c 61 62 65 6c 0a 29 7b 0a 20 20 70  r *zLabel.){.  p
50b0: 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
50c0: 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
50d0: 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
50e0: 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  .  sqlite3TreeVi
50f0: 65 77 42 61 72 65 45 78 70 72 4c 69 73 74 28 70  ewBareExprList(p
5100: 56 69 65 77 2c 20 70 4c 69 73 74 2c 20 7a 4c 61  View, pList, zLa
5110: 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  bel);.  sqlite3T
5120: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
5130: 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
5140: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.