/ Hex Artifact Content
Login

Artifact e7a7f90552bb418533cdd0309b5eb71d4effa50165b880fc8c2001e613577e5f:


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 0a 2f  View);.  }.}.../
0dd0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
0de0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
0df0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
0e00: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select 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 65 6c 65 63 74 28 54 72 65  eeViewSelect(Tre
0e30: 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f  eView *pView, co
0e40: 6e 73 74 20 53 65 6c 65 63 74 20 2a 70 2c 20 75  nst Select *p, u
0e50: 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b  8 moreToFollow){
0e60: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
0e70: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
0e80: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
0e90: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
0ea0: 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 2d 53  ne(pView, "nil-S
0eb0: 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 72 65 74  ELECT");.    ret
0ec0: 75 72 6e 3b 0a 20 20 7d 20 0a 20 20 70 56 69 65  urn;.  } .  pVie
0ed0: 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56  w = sqlite3TreeV
0ee0: 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d  iewPush(pView, m
0ef0: 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20  oreToFollow);.  
0f00: 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29 7b 0a  if( p->pWith ){.
0f10: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
0f20: 69 65 77 57 69 74 68 28 70 56 69 65 77 2c 20 70  iewWith(pView, p
0f30: 2d 3e 70 57 69 74 68 2c 20 31 29 3b 0a 20 20 20  ->pWith, 1);.   
0f40: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73 71   cnt = 1;.    sq
0f50: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73  lite3TreeViewPus
0f60: 68 28 70 56 69 65 77 2c 20 31 29 3b 0a 20 20 7d  h(pView, 1);.  }
0f70: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
0f80: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
0f90: 56 69 65 77 2c 0a 20 20 20 20 20 20 22 53 45 4c  View,.      "SEL
0fa0: 45 43 54 25 73 25 73 20 28 25 75 2f 25 70 29 20  ECT%s%s (%u/%p) 
0fb0: 73 65 6c 46 6c 61 67 73 3d 30 78 25 78 20 6e 53  selFlags=0x%x nS
0fc0: 65 6c 65 63 74 52 6f 77 3d 25 64 22 2c 0a 20 20  electRow=%d",.  
0fd0: 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67      ((p->selFlag
0fe0: 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
0ff0: 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22 20 3a   ? " DISTINCT" :
1000: 20 22 22 29 2c 0a 20 20 20 20 20 20 28 28 70 2d   ""),.      ((p-
1010: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1020: 67 67 72 65 67 61 74 65 29 20 3f 20 22 20 61 67  ggregate) ? " ag
1030: 67 5f 66 6c 61 67 22 20 3a 20 22 22 29 2c 0a 20  g_flag" : ""),. 
1040: 20 20 20 20 20 70 2d 3e 73 65 6c 49 64 2c 20 70       p->selId, p
1050: 2c 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  , p->selFlags,. 
1060: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6e 53 65       (int)p->nSe
1070: 6c 65 63 74 52 6f 77 0a 20 20 20 20 29 3b 0a 20  lectRow.    );. 
1080: 20 20 20 69 66 28 20 63 6e 74 2b 2b 20 29 20 73     if( cnt++ ) s
1090: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
10a0: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 69 66  p(pView);.    if
10b0: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
10c0: 20 20 20 20 20 6e 20 3d 20 31 30 30 30 3b 0a 20       n = 1000;. 
10d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10e0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  n = 0;.      if(
10f0: 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70   p->pSrc && p->p
1100: 53 72 63 2d 3e 6e 53 72 63 20 29 20 6e 2b 2b 3b  Src->nSrc ) n++;
1110: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57  .      if( p->pW
1120: 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  here ) n++;.    
1130: 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
1140: 79 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  y ) n++;.      i
1150: 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 20  f( p->pHaving ) 
1160: 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n++;.      if( p
1170: 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 6e 2b 2b  ->pOrderBy ) n++
1180: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
1190: 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a 23 69 66  Limit ) n++;.#if
11a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11b0: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
11c0: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 20    if( p->pWin ) 
11d0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n++;.      if( p
11e0: 2d 3e 70 57 69 6e 44 65 66 6e 20 29 20 6e 2b 2b  ->pWinDefn ) n++
11f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
1200: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1210: 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
1220: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e 2d  , p->pEList, (n-
1230: 2d 29 3e 30 2c 20 22 72 65 73 75 6c 74 2d 73 65  -)>0, "result-se
1240: 74 22 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  t");.#ifndef SQL
1250: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1260: 55 4e 43 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  UNC.    if( p->p
1270: 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 57 69 6e  Win ){.      Win
1280: 64 6f 77 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  dow *pX;.      p
1290: 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
12a0: 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
12b0: 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
12c0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
12d0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 77 69  wLine(pView, "wi
12e0: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 22 29  ndow-functions")
12f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 58 3d 70  ;.      for(pX=p
1300: 2d 3e 70 57 69 6e 3b 20 70 58 3b 20 70 58 3d 70  ->pWin; pX; pX=p
1310: 58 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  X->pNextWin){.  
1320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1330: 65 56 69 65 77 57 69 6e 46 75 6e 63 28 70 56 69  eViewWinFunc(pVi
1340: 65 77 2c 20 70 58 2c 20 70 58 2d 3e 70 4e 65 78  ew, pX, pX->pNex
1350: 74 57 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  tWin!=0);.      
1360: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
1370: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1380: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1390: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20      if( p->pSrc 
13a0: 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
13b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
13c0: 0a 20 20 20 20 20 20 70 56 69 65 77 20 3d 20 73  .      pView = s
13d0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
13e0: 73 68 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e  sh(pView, (n--)>
13f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1400: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1410: 69 65 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20  iew, "FROM");.  
1420: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1430: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
1440: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
1450: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1460: 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
1470: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
1480: 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 20   StrAccum x;.   
1490: 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b       char zLine[
14a0: 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
14b0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
14c0: 74 28 26 78 2c 20 30 2c 20 7a 4c 69 6e 65 2c 20  t(&x, 0, zLine, 
14d0: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 30  sizeof(zLine), 0
14e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14f0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
1500: 78 2c 20 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74  x, "{%d,*}", pIt
1510: 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
1520: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1530: 3e 7a 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20  >zDatabase ){.  
1540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1550: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
1560: 22 20 25 73 2e 25 73 22 2c 20 70 49 74 65 6d 2d  " %s.%s", pItem-
1570: 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 49 74 65  >zDatabase, pIte
1580: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
1590: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
15a0: 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
15b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
15c0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
15d0: 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
15e0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
15f0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1600: 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
1610: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
1620: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 20 74 61  appendf(&x, " ta
1630: 62 6e 61 6d 65 3d 25 51 22 2c 20 70 49 74 65 6d  bname=%Q", pItem
1640: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1660: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
1670: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
1680: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1690: 65 6e 64 66 28 26 78 2c 20 22 20 28 41 53 20 25  endf(&x, " (AS %
16a0: 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  s)", pItem->zAli
16b0: 61 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  as);.        }. 
16c0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
16d0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
16e0: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20  JT_LEFT ){.     
16f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
1700: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 20 4c  _appendf(&x, " L
1710: 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
1720: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1730: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
1740: 69 73 68 28 26 78 29 3b 0a 20 20 20 20 20 20 20  ish(&x);.       
1750: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1760: 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69 6e  Item(pView, zLin
1770: 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  e, i<p->pSrc->nS
1780: 72 63 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  rc-1); .        
1790: 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
17a0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
17b0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
17c0: 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 49 74  elect(pView, pIt
17d0: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  em->pSelect, 0);
17e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17f0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1800: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
1820: 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
1830: 70 56 69 65 77 2c 20 70 49 74 65 6d 2d 3e 75 31  pView, pItem->u1
1840: 2e 70 46 75 6e 63 41 72 67 2c 20 30 2c 20 22 66  .pFuncArg, 0, "f
1850: 75 6e 63 2d 61 72 67 73 3a 22 29 3b 0a 20 20 20  unc-args:");.   
1860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1870: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1880: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20  p(pView);.      
1890: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
18a0: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
18b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18c0: 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
18d0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
18e0: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
18f0: 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29  WHERE", (n--)>0)
1900: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1910: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1920: 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 30 29  w, p->pWhere, 0)
1930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1940: 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1950: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1960: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
1970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1980: 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
1990: 69 65 77 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  iew, p->pGroupBy
19a0: 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 47 52 4f 55  , (n--)>0, "GROU
19b0: 50 42 59 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  PBY");.    }.   
19c0: 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
19d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19e0: 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
19f0: 65 77 2c 20 22 48 41 56 49 4e 47 22 2c 20 28 6e  ew, "HAVING", (n
1a00: 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20 73 71  --)>0);.      sq
1a10: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1a20: 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 48 61 76  r(pView, p->pHav
1a30: 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ing, 0);.      s
1a40: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1a50: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a  p(pView);.    }.
1a60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a70: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
1a80: 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 44 65     if( p->pWinDe
1a90: 66 6e 20 29 7b 0a 20 20 20 20 20 20 57 69 6e 64  fn ){.      Wind
1aa0: 6f 77 20 2a 70 58 3b 0a 20 20 20 20 20 20 73 71  ow *pX;.      sq
1ab0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
1ac0: 6d 28 70 56 69 65 77 2c 20 22 57 49 4e 44 4f 57  m(pView, "WINDOW
1ad0: 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20  ", (n--)>0);.   
1ae0: 20 20 20 66 6f 72 28 70 58 3d 70 2d 3e 70 57 69     for(pX=p->pWi
1af0: 6e 44 65 66 6e 3b 20 70 58 3b 20 70 58 3d 70 58  nDefn; pX; pX=pX
1b00: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
1b10: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1b20: 56 69 65 77 57 69 6e 64 6f 77 28 70 56 69 65 77  ViewWindow(pView
1b30: 2c 20 70 58 2c 20 70 58 2d 3e 70 4e 65 78 74 57  , pX, pX->pNextW
1b40: 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
1b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1b60: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
1b70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1b80: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1b90: 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
1ba0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
1bb0: 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 4f 72  st(pView, p->pOr
1bc0: 64 65 72 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20  derBy, (n--)>0, 
1bd0: 22 4f 52 44 45 52 42 59 22 29 3b 0a 20 20 20 20  "ORDERBY");.    
1be0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  }.    if( p->pLi
1bf0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
1c00: 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
1c10: 28 70 56 69 65 77 2c 20 22 4c 49 4d 49 54 22 2c  (pView, "LIMIT",
1c20: 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20   (n--)>0);.     
1c30: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c40: 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70  Expr(pView, p->p
1c50: 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 70 2d  Limit->pLeft, p-
1c60: 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 21  >pLimit->pRight!
1c70: 3d 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  =0);.      if( p
1c80: 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  ->pLimit->pRight
1c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ca0: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
1cb0: 70 56 69 65 77 2c 20 22 4f 46 46 53 45 54 22 2c  pView, "OFFSET",
1cc0: 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20   (n--)>0);.     
1cd0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1ce0: 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d  ewExpr(pView, p-
1cf0: 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c  >pLimit->pRight,
1d00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1d10: 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
1d20: 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a  pView);.      }.
1d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1d40: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
1d50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d60: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1d70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
1d80: 70 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20 20  p = "UNION";.   
1d90: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
1da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1db0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 20   TK_ALL:        
1dc0: 20 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 20 41 4c   zOp = "UNION AL
1dd0: 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  L";  break;.    
1de0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1df0: 52 53 45 43 54 3a 20 20 20 7a 4f 70 20 3d 20 22  RSECT:   zOp = "
1e00: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 62 72 65  INTERSECT";  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 45 58 43 45 50 54 3a 20 20 20 20 20   TK_EXCEPT:     
1e30: 20 7a 4f 70 20 3d 20 22 45 58 43 45 50 54 22 3b   zOp = "EXCEPT";
1e40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e50: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e60: 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56  3TreeViewItem(pV
1e70: 69 65 77 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20  iew, zOp, 1);.  
1e80: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
1e90: 50 72 69 6f 72 3b 0a 20 20 7d 77 68 69 6c 65 28  Prior;.  }while(
1ea0: 20 70 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p!=0 );.  sqlit
1eb0: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
1ec0: 69 65 77 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  iew);.}..#ifndef
1ed0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
1ee0: 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 47 65  DOWFUNC./*.** Ge
1ef0: 6e 65 72 61 74 65 20 61 20 64 65 73 63 72 69 70  nerate a descrip
1f00: 74 69 6f 6e 20 6f 66 20 73 74 61 72 74 69 6e 67  tion of starting
1f10: 20 6f 72 20 73 74 6f 70 70 69 6e 67 20 62 6f 75   or stopping bou
1f20: 6e 64 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nds.*/.void sqli
1f30: 74 65 33 54 72 65 65 56 69 65 77 42 6f 75 6e 64  te3TreeViewBound
1f40: 28 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70 56  (.  TreeView *pV
1f50: 69 65 77 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  iew,        /* V
1f60: 69 65 77 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  iew context */. 
1f70: 20 75 38 20 65 42 6f 75 6e 64 2c 20 20 20 20 20   u8 eBound,     
1f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 42 4f           /* UNBO
1f90: 55 4e 44 45 44 2c 20 43 55 52 52 45 4e 54 2c 20  UNDED, CURRENT, 
1fa0: 50 52 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f  PRECEDING, FOLLO
1fb0: 57 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20 2a  WING */.  Expr *
1fc0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
1fd0: 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 50    /* Value for P
1fe0: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
1ff0: 4f 57 49 4e 47 20 2a 2f 0a 20 20 75 38 20 6d 6f  OWING */.  u8 mo
2000: 72 65 54 6f 46 6f 6c 6c 6f 77 20 20 20 20 20 20  reToFollow      
2010: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 6f     /* True if mo
2020: 72 65 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  re to follow */.
2030: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 42 6f  ){.  switch( eBo
2040: 75 6e 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20  und ){.    case 
2050: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3a 20 7b 0a  TK_UNBOUNDED: {.
2060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2070: 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
2080: 20 22 55 4e 42 4f 55 4e 44 45 44 22 2c 20 6d 6f   "UNBOUNDED", mo
2090: 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20  reToFollow);.   
20a0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
20b0: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
20c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 55 52  .    case TK_CUR
20e0: 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  RENT: {.      sq
20f0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
2100: 6d 28 70 56 69 65 77 2c 20 22 43 55 52 52 45 4e  m(pView, "CURREN
2110: 54 22 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77  T", moreToFollow
2120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2130: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
2140: 77 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  w);.      break;
2150: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2160: 54 4b 5f 50 52 45 43 45 44 49 4e 47 3a 20 7b 0a  TK_PRECEDING: {.
2170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2180: 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
2190: 20 22 50 52 45 43 45 44 49 4e 47 22 2c 20 6d 6f   "PRECEDING", mo
21a0: 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20  reToFollow);.   
21b0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
21c0: 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
21d0: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
21e0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
21f0: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20  p(pView);.      
2200: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2210: 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49   case TK_FOLLOWI
2220: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
2230: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
2240: 70 56 69 65 77 2c 20 22 46 4f 4c 4c 4f 57 49 4e  pView, "FOLLOWIN
2250: 47 22 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77  G", moreToFollow
2260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2270: 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
2280: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
2290: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
22a0: 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
22b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22c0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
22d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
22e0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 23 69  INDOWFUNC */..#i
22f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2300: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a  T_WINDOWFUNC./*.
2310: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
2320: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70  man-readable exp
2330: 6c 61 6e 61 74 69 6f 6e 20 66 6f 72 20 61 20 57  lanation for a W
2340: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 0a 2a 2f 0a  indow object.*/.
2350: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65  void sqlite3Tree
2360: 56 69 65 77 57 69 6e 64 6f 77 28 54 72 65 65 56  ViewWindow(TreeV
2370: 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73  iew *pView, cons
2380: 74 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20  t Window *pWin, 
2390: 75 38 20 6d 6f 72 65 29 7b 0a 20 20 70 56 69 65  u8 more){.  pVie
23a0: 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56  w = sqlite3TreeV
23b0: 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d  iewPush(pView, m
23c0: 6f 72 65 29 3b 0a 20 20 69 66 28 20 70 57 69 6e  ore);.  if( pWin
23d0: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ->zName ){.    s
23e0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
23f0: 6e 65 28 70 56 69 65 77 2c 20 22 4f 56 45 52 20  ne(pView, "OVER 
2400: 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  %s", pWin->zName
2410: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2420: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
2430: 69 6e 65 28 70 56 69 65 77 2c 20 22 4f 56 45 52  ine(pView, "OVER
2440: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57  ");.  }.  if( pW
2450: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
2460: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
2470: 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
2480: 69 65 77 2c 20 70 57 69 6e 2d 3e 70 50 61 72 74  iew, pWin->pPart
2490: 69 74 69 6f 6e 2c 20 31 2c 20 22 50 41 52 54 49  ition, 1, "PARTI
24a0: 54 49 4f 4e 2d 42 59 22 29 3b 0a 20 20 7d 0a 20  TION-BY");.  }. 
24b0: 20 69 66 28 20 70 57 69 6e 2d 3e 70 4f 72 64 65   if( pWin->pOrde
24c0: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
24d0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
24e0: 73 74 28 70 56 69 65 77 2c 20 70 57 69 6e 2d 3e  st(pView, pWin->
24f0: 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 22 4f 52  pOrderBy, 1, "OR
2500: 44 45 52 2d 42 59 22 29 3b 0a 20 20 7d 0a 20 20  DER-BY");.  }.  
2510: 69 66 28 20 70 57 69 6e 2d 3e 65 54 79 70 65 20  if( pWin->eType 
2520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2530: 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
2540: 2c 20 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54  , pWin->eType==T
2550: 4b 5f 52 41 4e 47 45 20 3f 20 22 52 41 4e 47 45  K_RANGE ? "RANGE
2560: 22 20 3a 20 22 52 4f 57 53 22 2c 20 30 29 3b 0a  " : "ROWS", 0);.
2570: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2580: 69 65 77 42 6f 75 6e 64 28 70 56 69 65 77 2c 20  iewBound(pView, 
2590: 70 57 69 6e 2d 3e 65 53 74 61 72 74 2c 20 70 57  pWin->eStart, pW
25a0: 69 6e 2d 3e 70 53 74 61 72 74 2c 20 31 29 3b 0a  in->pStart, 1);.
25b0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
25c0: 69 65 77 42 6f 75 6e 64 28 70 56 69 65 77 2c 20  iewBound(pView, 
25d0: 70 57 69 6e 2d 3e 65 45 6e 64 2c 20 70 57 69 6e  pWin->eEnd, pWin
25e0: 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20  ->pEnd, 0);.    
25f0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
2600: 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20  op(pView);.  }. 
2610: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2620: 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65  Pop(pView);.}.#e
2630: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2640: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
2650: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2660: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
2670: 43 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  C./*.** Generate
2680: 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2690: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 66 6f  e explanation fo
26a0: 72 20 61 20 57 69 6e 64 6f 77 20 46 75 6e 63 74  r a Window Funct
26b0: 69 6f 6e 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  ion object.*/.vo
26c0: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
26d0: 65 77 57 69 6e 46 75 6e 63 28 54 72 65 65 56 69  ewWinFunc(TreeVi
26e0: 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74  ew *pView, const
26f0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 75   Window *pWin, u
2700: 38 20 6d 6f 72 65 29 7b 0a 20 20 70 56 69 65 77  8 more){.  pView
2710: 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69   = sqlite3TreeVi
2720: 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f  ewPush(pView, mo
2730: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 72  re);.  sqlite3Tr
2740: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
2750: 2c 20 22 57 49 4e 46 55 4e 43 20 25 73 28 25 64  , "WINFUNC %s(%d
2760: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
2770: 20 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d             pWin-
2780: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 2c 20 70  >pFunc->zName, p
2790: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 6e 41 72 67  Win->pFunc->nArg
27a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65  );.  sqlite3Tree
27b0: 56 69 65 77 57 69 6e 64 6f 77 28 70 56 69 65 77  ViewWindow(pView
27c0: 2c 20 70 57 69 6e 2c 20 30 29 3b 0a 20 20 73 71  , pWin, 0);.  sq
27d0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
27e0: 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69  (pView);.}.#endi
27f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2800: 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a  _WINDOWFUNC */..
2810: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
2820: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2830: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
2840: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2850: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2860: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 54  e3TreeViewExpr(T
2870: 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20  reeView *pView, 
2880: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
2890: 72 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c  r, u8 moreToFoll
28a0: 6f 77 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ow){.  const cha
28b0: 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20  r *zBinOp = 0;  
28c0: 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61   /* Binary opera
28d0: 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tor */.  const c
28e0: 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b  har *zUniOp = 0;
28f0: 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72     /* Unary oper
2900: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ator */.  char z
2910: 46 6c 67 73 5b 36 30 5d 3b 0a 20 20 70 56 69 65  Flgs[60];.  pVie
2920: 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56  w = sqlite3TreeV
2930: 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d  iewPush(pView, m
2940: 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20  oreToFollow);.  
2950: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
2960: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2970: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
2980: 6e 69 6c 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  nil");.    sqlit
2990: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
29a0: 69 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  iew);.    return
29b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
29c0: 72 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  r->flags ){.    
29d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
29e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
29f0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
2a00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2a10: 66 28 73 69 7a 65 6f 66 28 7a 46 6c 67 73 29 2c  f(sizeof(zFlgs),
2a20: 7a 46 6c 67 73 2c 22 20 20 66 6c 61 67 73 3d 30  zFlgs,"  flags=0
2a30: 78 25 78 20 69 52 4a 54 3d 25 64 22 2c 0a 20 20  x%x iRJT=%d",.  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
2a60: 73 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  s, pExpr->iRight
2a70: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20  JoinTable);.    
2a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2a90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2aa0: 7a 65 6f 66 28 7a 46 6c 67 73 29 2c 7a 46 6c 67  zeof(zFlgs),zFlg
2ab0: 73 2c 22 20 20 66 6c 61 67 73 3d 30 78 25 78 22  s,"  flags=0x%x"
2ac0: 2c 70 45 78 70 72 2d 3e 66 6c 61 67 73 29 3b 0a  ,pExpr->flags);.
2ad0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2ae0: 20 20 20 7a 46 6c 67 73 5b 30 5d 20 3d 20 30 3b     zFlgs[0] = 0;
2af0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
2b00: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2b10: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
2b20: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MN: {.      sqli
2b30: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
2b40: 70 56 69 65 77 2c 20 22 41 47 47 7b 25 64 3a 25  pView, "AGG{%d:%
2b50: 64 7d 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d}%s",.         
2b60: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
2b70: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
2b80: 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20 20 20  , zFlgs);.      
2b90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2ba0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2bb0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
2bc0: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2be0: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
2bf0: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
2c00: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
2c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2c20: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
2c30: 20 22 43 4f 4c 55 4d 4e 28 25 64 29 25 73 22 2c   "COLUMN(%d)%s",
2c40: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
2c50: 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20 20 20 7d   zFlgs);.      }
2c60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2c70: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
2c80: 65 28 70 56 69 65 77 2c 20 22 7b 25 64 3a 25 64  e(pView, "{%d:%d
2c90: 7d 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  }%s",.          
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
2cc0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
2cd0: 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20 20 20  , zFlgs);.      
2ce0: 7d 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  }.      if( Expr
2cf0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2d00: 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
2d10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2d20: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
2d30: 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
2d40: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ft, 0);.      }.
2d50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
2d70: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
2d80: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
2d90: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
2da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2db0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
2dc0: 69 65 77 2c 20 22 25 64 22 2c 20 70 45 78 70 72  iew, "%d", pExpr
2dd0: 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
2de0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2df0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2e00: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73  wLine(pView, "%s
2e10: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
2e20: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
2e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2e40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e50: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
2e60: 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
2e70: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
2e80: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
2e90: 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20 70 45  e(pView,"%s", pE
2ea0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
2eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ec0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
2ed0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
2ee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2ef0: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
2f00: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
2f10: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
2f20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2f30: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
2f40: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2f50: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
2f60: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
2f70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2f80: 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  ase TK_TRUEFALSE
2f90: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
2fa0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
2fb0: 69 65 77 2c 0a 20 20 20 20 20 20 20 20 20 73 71  iew,.         sq
2fc0: 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
2fd0: 6c 75 65 28 70 45 78 70 72 29 20 3f 20 22 54 52  lue(pExpr) ? "TR
2fe0: 55 45 22 20 3a 20 22 46 41 4c 53 45 22 29 3b 0a  UE" : "FALSE");.
2ff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3000: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
3010: 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
3020: 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
3030: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  BLOB: {.      sq
3040: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
3050: 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20 70 45  e(pView,"%s", pE
3060: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
3070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3080: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
3090: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
30a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
30b0: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
30c0: 77 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25  w,"VARIABLE(%s,%
30d0: 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d)",.           
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30f0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
3100: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
3110: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3120: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
3130: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
3140: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3150: 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 52 45 47  wLine(pView,"REG
3160: 49 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70  ISTER(%d)", pExp
3170: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
3180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3190: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
31a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
31b0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
31c0: 2c 22 49 44 20 5c 22 25 77 5c 22 22 2c 20 70 45  ,"ID \"%w\"", pE
31d0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
31e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31f0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
3200: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
3210: 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
3220: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
3230: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
3240: 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
3250: 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
3260: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3270: 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 43 41 53  wLine(pView,"CAS
3280: 54 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  T %Q", pExpr->u.
3290: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
32a0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
32b0: 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
32c0: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
32d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
32e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32f0: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
3300: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
3310: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b    zBinOp = "LT";
3320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3330: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
3340: 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20   zBinOp = "LE"; 
3350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3360: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
3370: 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20  zBinOp = "GT";  
3380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3390: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
33a0: 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20 20 20  BinOp = "GE";   
33b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
33c0: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42  e TK_NE:      zB
33d0: 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20  inOp = "NE";    
33e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
33f0: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 42 69   TK_EQ:      zBi
3400: 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  nOp = "EQ";     
3410: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3420: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42 69 6e  TK_IS:      zBin
3430: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 62  Op = "IS";     b
3440: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3450: 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f  K_ISNOT:   zBinO
3460: 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 62 72  p = "ISNOT";  br
3470: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3480: 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _AND:     zBinOp
3490: 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62 72 65   = "AND";    bre
34a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
34b0: 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  OR:      zBinOp 
34c0: 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72 65 61  = "OR";     brea
34d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
34e0: 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d  LUS:    zBinOp =
34f0: 20 22 41 44 44 22 3b 20 20 20 20 62 72 65 61 6b   "ADD";    break
3500: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
3510: 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  AR:    zBinOp = 
3520: 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  "MUL";    break;
3530: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
3540: 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  US:   zBinOp = "
3550: 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  SUB";    break;.
3560: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
3570: 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52       zBinOp = "R
3580: 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  EM";    break;. 
3590: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
35a0: 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49  D:  zBinOp = "BI
35b0: 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TAND"; break;.  
35c0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
35d0: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54     zBinOp = "BIT
35e0: 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OR";  break;.   
35f0: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
3600: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49 56 22    zBinOp = "DIV"
3610: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
3620: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20  case TK_LSHIFT: 
3630: 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46   zBinOp = "LSHIF
3640: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
3650: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
3660: 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49 46 54  zBinOp = "RSHIFT
3670: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3680: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
3690: 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22  BinOp = "CONCAT"
36a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
36b0: 65 20 54 4b 5f 44 4f 54 3a 20 20 20 20 20 7a 42  e TK_DOT:     zB
36c0: 69 6e 4f 70 20 3d 20 22 44 4f 54 22 3b 20 20 20  inOp = "DOT";   
36d0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
36e0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55  e TK_UMINUS:  zU
36f0: 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b  niOp = "UMINUS";
3700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3710: 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e   TK_UPLUS:   zUn
3720: 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20  iOp = "UPLUS";  
3730: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3740: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69  TK_BITNOT:  zUni
3750: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62  Op = "BITNOT"; b
3760: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3770: 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f  K_NOT:     zUniO
3780: 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72  p = "NOT";    br
3790: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
37a0: 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70  _ISNULL:  zUniOp
37b0: 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65   = "ISNULL"; bre
37c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
37d0: 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20  NOTNULL: zUniOp 
37e0: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
37f0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
3800: 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20  _TRUTH: {.      
3810: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 63 6f 6e  int x;.      con
3820: 73 74 20 63 68 61 72 20 2a 61 7a 4f 70 5b 5d 20  st char *azOp[] 
3830: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 22 49 53  = {.         "IS
3840: 2d 46 41 4c 53 45 22 2c 20 22 49 53 2d 54 52 55  -FALSE", "IS-TRU
3850: 45 22 2c 20 22 49 53 2d 4e 4f 54 2d 46 41 4c 53  E", "IS-NOT-FALS
3860: 45 22 2c 20 22 49 53 2d 4e 4f 54 2d 54 52 55 45  E", "IS-NOT-TRUE
3870: 22 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ".      };.     
3880: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3890: 6f 70 32 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  op2==TK_IS || pE
38a0: 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
38b0: 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
38c0: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
38d0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
38e0: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
38f0: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op==TK_TRUEFAL
3900: 53 45 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  SE );.      x = 
3910: 28 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f  (pExpr->op2==TK_
3920: 49 53 4e 4f 54 29 2a 32 20 2b 20 73 71 6c 69 74  ISNOT)*2 + sqlit
3930: 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
3940: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
3950: 0a 20 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20  .      zUniOp = 
3960: 61 7a 4f 70 5b 78 5d 3b 0a 20 20 20 20 20 20 62  azOp[x];.      b
3970: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3980: 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 20 7b   case TK_SPAN: {
3990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
39a0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
39b0: 2c 20 22 53 50 41 4e 20 25 51 22 2c 20 70 45 78  , "SPAN %Q", pEx
39c0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
39d0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
39e0: 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
39f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
3a00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3a10: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
3a20: 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  K_COLLATE: {.   
3a30: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3a40: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43  ewLine(pView, "C
3a50: 4f 4c 4c 41 54 45 20 25 51 22 2c 20 70 45 78 70  OLLATE %Q", pExp
3a60: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
3a70: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
3a80: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
3a90: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  Expr->pLeft, 0);
3aa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ab0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
3ac0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
3ad0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
3ae0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
3af0: 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
3b00: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3b10: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
3b20: 73 20 2a 2f 0a 20 20 20 20 20 20 57 69 6e 64 6f  s */.      Windo
3b30: 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 69  w *pWin;.      i
3b40: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
3b50: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
3b60: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
3b70: 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
3b80: 20 20 20 20 20 20 70 57 69 6e 20 3d 20 30 3b 0a        pWin = 0;.
3b90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ba0: 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
3bb0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 23 69 66  pr->x.pList;.#if
3bc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3bd0: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
3be0: 20 20 20 20 70 57 69 6e 20 3d 20 70 45 78 70 72      pWin = pExpr
3bf0: 2d 3e 70 57 69 6e 3b 0a 23 65 6c 73 65 0a 20 20  ->pWin;.#else.  
3c00: 20 20 20 20 20 20 70 57 69 6e 20 3d 20 30 3b 0a        pWin = 0;.
3c10: 23 65 6e 64 69 66 20 0a 20 20 20 20 20 20 7d 0a  #endif .      }.
3c20: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
3c30: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
3c40: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  TION ){.        
3c50: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
3c60: 69 6e 65 28 70 56 69 65 77 2c 20 22 41 47 47 5f  ine(pView, "AGG_
3c70: 46 55 4e 43 54 49 4f 4e 25 64 20 25 51 22 2c 0a  FUNCTION%d %Q",.
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
3ca0: 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e  pr->op2, pExpr->
3cb0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
3cc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3cd0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
3ce0: 69 6e 65 28 70 56 69 65 77 2c 20 22 46 55 4e 43  ine(pView, "FUNC
3cf0: 54 49 4f 4e 20 25 51 22 2c 20 70 45 78 70 72 2d  TION %Q", pExpr-
3d00: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
3d10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
3d20: 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
3d30: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
3d40: 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 46  prList(pView, pF
3d50: 61 72 67 2c 20 70 57 69 6e 21 3d 30 2c 20 30 29  arg, pWin!=0, 0)
3d60: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
3d70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
3d80: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
3d90: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  f( pWin ){.     
3da0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3db0: 65 77 57 69 6e 64 6f 77 28 70 56 69 65 77 2c 20  ewWindow(pView, 
3dc0: 70 57 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  pWin, 0);.      
3dd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
3de0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
3df0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e00: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
3e10: 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20  e TK_EXISTS: {. 
3e20: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
3e30: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
3e40: 22 45 58 49 53 54 53 2d 65 78 70 72 20 66 6c 61  "EXISTS-expr fla
3e50: 67 73 3d 30 78 25 78 22 2c 20 70 45 78 70 72 2d  gs=0x%x", pExpr-
3e60: 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73  >flags);.      s
3e70: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
3e80: 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70  lect(pView, pExp
3e90: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29  r->x.pSelect, 0)
3ea0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3eb0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
3ec0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
3ed0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3ee0: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53 45 4c  Line(pView, "SEL
3ef0: 45 43 54 2d 65 78 70 72 20 66 6c 61 67 73 3d 30  ECT-expr flags=0
3f00: 78 25 78 22 2c 20 70 45 78 70 72 2d 3e 66 6c 61  x%x", pExpr->fla
3f10: 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  gs);.      sqlit
3f20: 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
3f30: 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
3f40: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
3f50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3f60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
3f70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3f80: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3f90: 65 77 2c 20 22 49 4e 20 66 6c 61 67 73 3d 30 78  ew, "IN flags=0x
3fa0: 25 78 22 2c 20 70 45 78 70 72 2d 3e 66 6c 61 67  %x", pExpr->flag
3fb0: 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
3fc0: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
3fd0: 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  iew, pExpr->pLef
3fe0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
3ff0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4000: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
4010: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
4020: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
4030: 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45  Select(pView, pE
4040: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
4050: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
4060: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4070: 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
4080: 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
4090: 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20  .pList, 0, 0);. 
40a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
40b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
40c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
40d0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
40e0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
40f0: 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
4100: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
4110: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
4120: 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
4130: 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
4140: 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
4150: 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
4160: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
4170: 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
4180: 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
4190: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
41a0: 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
41b0: 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
41c0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
41d0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
41e0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
41f0: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78    Expr *pX = pEx
4200: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
4210: 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70   Expr *pY = pExp
4220: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
4230: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
4240: 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e  pr *pZ = pExpr->
4250: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
4260: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
4270: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
4280: 56 69 65 77 2c 20 22 42 45 54 57 45 45 4e 22 29  View, "BETWEEN")
4290: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
42a0: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
42b0: 77 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20 20 20  w, pX, 1);.     
42c0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
42d0: 45 78 70 72 28 70 56 69 65 77 2c 20 70 59 2c 20  Expr(pView, pY, 
42e0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
42f0: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
4300: 69 65 77 2c 20 70 5a 2c 20 30 29 3b 0a 20 20 20  iew, pZ, 0);.   
4310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4320: 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
4330: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
4340: 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
4350: 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
4360: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
4370: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
4380: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
4390: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
43a0: 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
43b0: 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
43c0: 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
43d0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
43e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
43f0: 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
4400: 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
4410: 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
4420: 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
4430: 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
4440: 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
4450: 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
4460: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
4470: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
4480: 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
4490: 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
44a0: 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
44b0: 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
44c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
44d0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
44e0: 65 28 70 56 69 65 77 2c 20 22 25 73 28 25 64 29  e(pView, "%s(%d)
44f0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  ", .          pE
4500: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e  xpr->iTable ? "N
4510: 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78  EW" : "OLD", pEx
4520: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
4530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4540: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
4550: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4560: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
4570: 56 69 65 77 2c 20 22 43 41 53 45 22 29 3b 0a 20  View, "CASE");. 
4580: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
4590: 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
45a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29  pExpr->pLeft, 1)
45b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
45c0: 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
45d0: 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e  pView, pExpr->x.
45e0: 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
45f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4610: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
4620: 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
4630: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
4640: 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b  ar *zType = "unk
4650: 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
4660: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
4670: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
4680: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20   OE_Rollback:   
4690: 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63  zType = "rollbac
46a0: 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  k";  break;.    
46b0: 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
46c0: 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  t:      zType = 
46d0: 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65  "abort";     bre
46e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
46f0: 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20   OE_Fail:       
4700: 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20  zType = "fail"; 
4710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4720: 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
4730: 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  re:     zType = 
4740: 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65  "ignore";    bre
4750: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4760: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4770: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 52 41  wLine(pView, "RA
4780: 49 53 45 20 25 73 28 25 51 29 22 2c 20 7a 54 79  ISE %s(%Q)", zTy
4790: 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  pe, pExpr->u.zTo
47a0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
47b0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
47c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 41 54 43      case TK_MATC
47d0: 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  H: {.      sqlit
47e0: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
47f0: 56 69 65 77 2c 20 22 4d 41 54 43 48 20 7b 25 64  View, "MATCH {%d
4800: 3a 25 64 7d 25 73 22 2c 0a 20 20 20 20 20 20 20  :%d}%s",.       
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4830: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
4840: 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20 20 20  , zFlgs);.      
4850: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
4860: 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72  xpr(pView, pExpr
4870: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
4880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4890: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
48a0: 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
48b0: 69 74 65 33 54 72 65 65 56 69 65 77 42 61 72 65  ite3TreeViewBare
48c0: 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
48d0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
48e0: 22 56 45 43 54 4f 52 22 29 3b 0a 20 20 20 20 20  "VECTOR");.     
48f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4900: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
4910: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
4920: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
4930: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53 45 4c  Line(pView, "SEL
4940: 45 43 54 2d 43 4f 4c 55 4d 4e 20 25 64 22 2c 20  ECT-COLUMN %d", 
4950: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
4960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
4970: 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69  eeViewSelect(pVi
4980: 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ew, pExpr->pLeft
4990: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ->x.pSelect, 0);
49a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
49c0: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20  IF_NULL_ROW: {. 
49d0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
49e0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
49f0: 22 49 46 2d 4e 55 4c 4c 2d 52 4f 57 20 25 64 22  "IF-NULL-ROW %d"
4a00: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
4a10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
4a20: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
4a30: 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
4a40: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
4a60: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
4a70: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
4a80: 28 70 56 69 65 77 2c 20 22 6f 70 3d 25 64 22 2c  (pView, "op=%d",
4a90: 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20   pExpr->op);.   
4aa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4ab0: 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70    }.  if( zBinOp
4ac0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
4ad0: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
4ae0: 77 2c 20 22 25 73 25 73 22 2c 20 7a 42 69 6e 4f  w, "%s%s", zBinO
4af0: 70 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20 73  p, zFlgs);.    s
4b00: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
4b10: 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
4b20: 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20  >pLeft, 1);.    
4b30: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
4b40: 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72  xpr(pView, pExpr
4b50: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
4b60: 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70  }else if( zUniOp
4b70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
4b80: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
4b90: 77 2c 20 22 25 73 25 73 22 2c 20 7a 55 6e 69 4f  w, "%s%s", zUniO
4ba0: 70 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20 73  p, zFlgs);.    s
4bb0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
4bc0: 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
4bd0: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 7d 0a  >pLeft, 0);.  }.
4be0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4bf0: 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 0a  wPop(pView);.}..
4c00: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
4c10: 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
4c20: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
4c30: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
4c40: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
4c50: 74 65 33 54 72 65 65 56 69 65 77 42 61 72 65 45  te3TreeViewBareE
4c60: 78 70 72 4c 69 73 74 28 0a 20 20 54 72 65 65 56  xprList(.  TreeV
4c70: 69 65 77 20 2a 70 56 69 65 77 2c 0a 20 20 63 6f  iew *pView,.  co
4c80: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
4c90: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
4ca0: 72 20 2a 7a 4c 61 62 65 6c 0a 29 7b 0a 20 20 69  r *zLabel.){.  i
4cb0: 66 28 20 7a 4c 61 62 65 6c 3d 3d 30 20 7c 7c 20  f( zLabel==0 || 
4cc0: 7a 4c 61 62 65 6c 5b 30 5d 3d 3d 30 20 29 20 7a  zLabel[0]==0 ) z
4cd0: 4c 61 62 65 6c 20 3d 20 22 4c 49 53 54 22 3b 0a  Label = "LIST";.
4ce0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
4cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
4d00: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
4d10: 20 22 25 73 20 28 65 6d 70 74 79 29 22 2c 20 7a   "%s (empty)", z
4d20: 4c 61 62 65 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  Label);.  }else{
4d30: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4d40: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
4d50: 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c  ine(pView, "%s",
4d60: 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 66 6f   zLabel);.    fo
4d70: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
4d80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4d90: 20 20 20 69 6e 74 20 6a 20 3d 20 70 4c 69 73 74     int j = pList
4da0: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
4db0: 72 42 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 68  rByCol;.      ch
4dc0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73  ar *zName = pLis
4dd0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
4de0: 20 20 20 20 20 69 6e 74 20 6d 6f 72 65 54 6f 46       int moreToF
4df0: 6f 6c 6c 6f 77 20 3d 20 69 3c 70 4c 69 73 74 2d  ollow = i<pList-
4e00: 3e 6e 45 78 70 72 20 2d 20 31 3b 0a 20 20 20 20  >nExpr - 1;.    
4e10: 20 20 69 66 28 20 6a 20 7c 7c 20 7a 4e 61 6d 65    if( j || zName
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4e30: 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
4e40: 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c  pView, moreToFol
4e50: 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 6d 6f  low);.        mo
4e60: 72 65 54 6f 46 6f 6c 6c 6f 77 20 3d 20 30 3b 0a  reToFollow = 0;.
4e70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
4e80: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
4e90: 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  w, 0);.        i
4ea0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4eb0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
4ec0: 64 6f 75 74 2c 20 22 41 53 20 25 73 20 22 2c 20  dout, "AS %s ", 
4ed0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4ee0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 20  }.        if( j 
4ef0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
4f00: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 69 4f  intf(stdout, "iO
4f10: 72 64 65 72 42 79 43 6f 6c 3d 25 64 22 2c 20 6a  rderByCol=%d", j
4f20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4f30: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
4f40: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
4f50: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
4f60: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
4f70: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4f80: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69  wExpr(pView, pLi
4f90: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
4fa0: 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20  moreToFollow);. 
4fb0: 20 20 20 20 20 69 66 28 20 6a 20 7c 7c 20 7a 4e       if( j || zN
4fc0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
4fd0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
4fe0: 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20  p(pView);.      
4ff0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  }.    }.  }.}.vo
5000: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
5010: 65 77 45 78 70 72 4c 69 73 74 28 0a 20 20 54 72  ewExprList(.  Tr
5020: 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 0a 20  eeView *pView,. 
5030: 20 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20   const ExprList 
5040: 2a 70 4c 69 73 74 2c 0a 20 20 75 38 20 6d 6f 72  *pList,.  u8 mor
5050: 65 54 6f 46 6f 6c 6c 6f 77 2c 0a 20 20 63 6f 6e  eToFollow,.  con
5060: 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 0a  st char *zLabel.
5070: 29 7b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c  ){.  pView = sql
5080: 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
5090: 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f  (pView, moreToFo
50a0: 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  llow);.  sqlite3
50b0: 54 72 65 65 56 69 65 77 42 61 72 65 45 78 70 72  TreeViewBareExpr
50c0: 4c 69 73 74 28 70 56 69 65 77 2c 20 70 4c 69 73  List(pView, pLis
50d0: 74 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 73 71  t, zLabel);.  sq
50e0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
50f0: 28 70 56 69 65 77 29 3b 0a 7d 0a 0a 23 65 6e 64  (pView);.}..#end
5100: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
5110: 55 47 20 2a 2f 0a                                UG */.