/ Hex Artifact Content
Login

Artifact 462346b82a892316a62291791c77e3dd5f1927745fe4a44b846ab4fd16eb28c3:


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 62 72 65 61 6b 3b 0a 20  }.      break;. 
2cf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2d00: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
2d10: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2d20: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
2d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2d40: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
2d50: 70 56 69 65 77 2c 20 22 25 64 22 2c 20 70 45 78  pView, "%d", pEx
2d60: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
2d70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d80: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d90: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
2da0: 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
2db0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oken);.      }. 
2dc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2dd0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2de0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
2df0: 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
2e00: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
2e10: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
2e20: 69 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20  ine(pView,"%s", 
2e30: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
2e40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2e50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2e60: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
2e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
2e80: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
2e90: 77 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  w,"%Q", pExpr->u
2ea0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
2eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2ec0: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
2ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
2ee0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
2ef0: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
2f00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f10: 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c   case TK_TRUEFAL
2f20: 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
2f30: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
2f40: 70 56 69 65 77 2c 0a 20 20 20 20 20 20 20 20 20  pView,.         
2f50: 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
2f60: 56 61 6c 75 65 28 70 45 78 70 72 29 20 3f 20 22  Value(pExpr) ? "
2f70: 54 52 55 45 22 20 3a 20 22 46 41 4c 53 45 22 29  TRUE" : "FALSE")
2f80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2f90: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
2fa0: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
2fb0: 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
2fc0: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
2fd0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
2fe0: 69 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20  ine(pView,"%s", 
2ff0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
3000: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3010: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3020: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
3030: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3040: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
3050: 69 65 77 2c 22 56 41 52 49 41 42 4c 45 28 25 73  iew,"VARIABLE(%s
3060: 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%d)",.         
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
3090: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
30a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
30c0: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
30d0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
30e0: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 52  iewLine(pView,"R
30f0: 45 47 49 53 54 45 52 28 25 64 29 22 2c 20 70 45  EGISTER(%d)", pE
3100: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
3110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
3130: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3140: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3150: 65 77 2c 22 49 44 20 5c 22 25 77 5c 22 22 2c 20  ew,"ID \"%w\"", 
3160: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
3170: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3180: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
3190: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
31a0: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
31b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
31c0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
31d0: 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
31e0: 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
31f0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
3200: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 43  iewLine(pView,"C
3210: 41 53 54 20 25 51 22 2c 20 70 45 78 70 72 2d 3e  AST %Q", pExpr->
3220: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
3230: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3240: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
3250: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  r->pLeft, 0);.  
3260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3270: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3280: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
3290: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
32a0: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54      zBinOp = "LT
32b0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
32c0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
32d0: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22     zBinOp = "LE"
32e0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
32f0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
3300: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b    zBinOp = "GT";
3310: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3320: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
3330: 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20   zBinOp = "GE"; 
3340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3350: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
3360: 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20  zBinOp = "NE";  
3370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3380: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
3390: 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20  BinOp = "EQ";   
33a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
33b0: 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42  e TK_IS:      zB
33c0: 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20  inOp = "IS";    
33d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
33e0: 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69   TK_ISNOT:   zBi
33f0: 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20  nOp = "ISNOT";  
3400: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3410: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e  TK_AND:     zBin
3420: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62  Op = "AND";    b
3430: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3440: 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_OR:      zBinO
3450: 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72  p = "OR";     br
3460: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3470: 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70  _PLUS:    zBinOp
3480: 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72 65   = "ADD";    bre
3490: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
34a0: 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20  STAR:    zBinOp 
34b0: 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61  = "MUL";    brea
34c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
34d0: 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  INUS:   zBinOp =
34e0: 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b   "SUB";    break
34f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
3500: 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  M:     zBinOp = 
3510: 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b  "REM";    break;
3520: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
3530: 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  AND:  zBinOp = "
3540: 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a  BITAND"; break;.
3550: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
3560: 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42  R:   zBinOp = "B
3570: 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ITOR";  break;. 
3580: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
3590: 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49  :   zBinOp = "DI
35a0: 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  V";    break;.  
35b0: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
35c0: 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48  :  zBinOp = "LSH
35d0: 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
35e0: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
35f0: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49    zBinOp = "RSHI
3600: 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  FT"; break;.    
3610: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
3620: 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41   zBinOp = "CONCA
3630: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
3640: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 20 20 20 20  ase TK_DOT:     
3650: 7a 42 69 6e 4f 70 20 3d 20 22 44 4f 54 22 3b 20  zBinOp = "DOT"; 
3660: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
3670: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20  ase TK_UMINUS:  
3680: 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53  zUniOp = "UMINUS
3690: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
36a0: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
36b0: 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b  UniOp = "UPLUS";
36c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
36d0: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55  e TK_BITNOT:  zU
36e0: 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b  niOp = "BITNOT";
36f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3700: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e   TK_NOT:     zUn
3710: 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20  iOp = "NOT";    
3720: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3730: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69  TK_ISNULL:  zUni
3740: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62  Op = "ISNULL"; b
3750: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3760: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f  K_NOTNULL: zUniO
3770: 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62  p = "NOTNULL"; b
3780: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
3790: 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
37a0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 63    int x;.      c
37b0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 70 5b  onst char *azOp[
37c0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 22  ] = {.         "
37d0: 49 53 2d 46 41 4c 53 45 22 2c 20 22 49 53 2d 54  IS-FALSE", "IS-T
37e0: 52 55 45 22 2c 20 22 49 53 2d 4e 4f 54 2d 46 41  RUE", "IS-NOT-FA
37f0: 4c 53 45 22 2c 20 22 49 53 2d 4e 4f 54 2d 54 52  LSE", "IS-NOT-TR
3800: 55 45 22 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  UE".      };.   
3810: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3820: 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 20 7c 7c 20  ->op2==TK_IS || 
3830: 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49  pExpr->op2==TK_I
3840: 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  SNOT );.      as
3850: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
3860: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
3870: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
3880: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  ht->op==TK_TRUEF
3890: 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 78 20  ALSE );.      x 
38a0: 3d 20 28 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  = (pExpr->op2==T
38b0: 4b 5f 49 53 4e 4f 54 29 2a 32 20 2b 20 73 71 6c  K_ISNOT)*2 + sql
38c0: 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
38d0: 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
38e0: 29 3b 0a 20 20 20 20 20 20 7a 55 6e 69 4f 70 20  );.      zUniOp 
38f0: 3d 20 61 7a 4f 70 5b 78 5d 3b 0a 20 20 20 20 20  = azOp[x];.     
3900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3910: 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
3920: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3930: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3940: 65 77 2c 20 22 53 50 41 4e 20 25 51 22 2c 20 70  ew, "SPAN %Q", p
3950: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
3960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
3970: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
3980: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
3990: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
39a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
39b0: 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   TK_COLLATE: {. 
39c0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
39d0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
39e0: 22 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 70 45  "COLLATE %Q", pE
39f0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
3a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
3a10: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
3a20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
3a30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3a40: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
3a50: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
3a60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
3a70: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
3a80: 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
3a90: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3aa0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
3ab0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 69 6e  nts */.      Win
3ac0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20  dow *pWin;.     
3ad0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
3ae0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
3af0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
3b00: 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
3b10: 20 20 20 20 20 20 20 20 70 57 69 6e 20 3d 20 30          pWin = 0
3b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3b30: 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
3b40: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 23  Expr->x.pList;.#
3b50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3b60: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
3b70: 20 20 20 20 20 20 70 57 69 6e 20 3d 20 70 45 78        pWin = pEx
3b80: 70 72 2d 3e 70 57 69 6e 3b 0a 23 65 6c 73 65 0a  pr->pWin;.#else.
3b90: 20 20 20 20 20 20 20 20 70 57 69 6e 20 3d 20 30          pWin = 0
3ba0: 3b 0a 23 65 6e 64 69 66 20 0a 20 20 20 20 20 20  ;.#endif .      
3bb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
3bc0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
3bd0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  NCTION ){.      
3be0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3bf0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 41 47  wLine(pView, "AG
3c00: 47 5f 46 55 4e 43 54 49 4f 4e 25 64 20 25 51 22  G_FUNCTION%d %Q"
3c10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3c30: 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72  Expr->op2, pExpr
3c40: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
3c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3c60: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3c70: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 46 55  wLine(pView, "FU
3c80: 4e 43 54 49 4f 4e 20 25 51 22 2c 20 70 45 78 70  NCTION %Q", pExp
3c90: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
3ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3cb0: 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
3cc0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3cd0: 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
3ce0: 70 46 61 72 67 2c 20 70 57 69 6e 21 3d 30 2c 20  pFarg, pWin!=0, 
3cf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  0);.      }.#ifn
3d00: 64 65 66 20 53 51 4c 49 54 65 5f 4f 4d 49 54 5f  def SQLITe_OMIT_
3d10: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
3d20: 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20   if( pWin ){.   
3d30: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
3d40: 56 69 65 77 57 69 6e 64 6f 77 28 70 56 69 65 77  ViewWindow(pView
3d50: 2c 20 70 57 69 6e 2c 20 30 29 3b 0a 20 20 20 20  , pWin, 0);.    
3d60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
3d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
3d80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3d90: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
3da0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b  ase TK_EXISTS: {
3db0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
3dc0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
3dd0: 2c 20 22 45 58 49 53 54 53 2d 65 78 70 72 20 66  , "EXISTS-expr f
3de0: 6c 61 67 73 3d 30 78 25 78 22 2c 20 70 45 78 70  lags=0x%x", pExp
3df0: 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  r->flags);.     
3e00: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
3e10: 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45  Select(pView, pE
3e20: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
3e30: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
3e40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3e50: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
3e60: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3e70: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53  ewLine(pView, "S
3e80: 45 4c 45 43 54 2d 65 78 70 72 20 66 6c 61 67 73  ELECT-expr flags
3e90: 3d 30 78 25 78 22 2c 20 70 45 78 70 72 2d 3e 66  =0x%x", pExpr->f
3ea0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  lags);.      sql
3eb0: 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
3ec0: 63 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  ct(pView, pExpr-
3ed0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  >x.pSelect, 0);.
3ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ef0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
3f00: 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
3f10: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
3f20: 56 69 65 77 2c 20 22 49 4e 20 66 6c 61 67 73 3d  View, "IN flags=
3f30: 30 78 25 78 22 2c 20 70 45 78 70 72 2d 3e 66 6c  0x%x", pExpr->fl
3f40: 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ags);.      sqli
3f50: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
3f60: 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
3f70: 65 66 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  eft, 1);.      i
3f80: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
3f90: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
3fa0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
3fb0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3fc0: 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20  ewSelect(pView, 
3fd0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
3fe0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
3ff0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4000: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
4010: 73 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  st(pView, pExpr-
4020: 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
4030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4040: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4050: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4060: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
4070: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
4080: 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
4090: 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
40a0: 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
40b0: 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
40c0: 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
40d0: 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
40e0: 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
40f0: 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
4100: 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
4110: 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
4120: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
4130: 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
4140: 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
4150: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
4160: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4170: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
4180: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
4190: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
41a0: 20 20 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45     Expr *pY = pE
41b0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
41c0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
41d0: 45 78 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72  Expr *pZ = pExpr
41e0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
41f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
4200: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
4210: 28 70 56 69 65 77 2c 20 22 42 45 54 57 45 45 4e  (pView, "BETWEEN
4220: 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
4230: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
4240: 69 65 77 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20  iew, pX, 1);.   
4250: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
4260: 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 59  ewExpr(pView, pY
4270: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4280: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
4290: 70 56 69 65 77 2c 20 70 5a 2c 20 30 29 3b 0a 20  pView, pZ, 0);. 
42a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
42b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
42c0: 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
42d0: 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
42e0: 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
42f0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
4300: 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
4310: 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
4320: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
4330: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
4340: 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
4350: 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
4360: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
4370: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
4380: 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
4390: 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
43a0: 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
43b0: 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
43c0: 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
43d0: 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
43e0: 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
43f0: 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
4400: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
4410: 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
4420: 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
4430: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
4440: 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
4450: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4460: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
4470: 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 28 25  ine(pView, "%s(%
4480: 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d)", .          
4490: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
44a0: 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70  "NEW" : "OLD", p
44b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
44c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
44e0: 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ASE: {.      sql
44f0: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
4500: 28 70 56 69 65 77 2c 20 22 43 41 53 45 22 29 3b  (pView, "CASE");
4510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
4520: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
4530: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
4540: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4550: 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73  3TreeViewExprLis
4560: 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  t(pView, pExpr->
4570: 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
4580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4590: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
45a0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
45b0: 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
45c0: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
45d0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75  char *zType = "u
45e0: 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  nk";.      switc
45f0: 68 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  h( pExpr->affini
4600: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  ty ){.        ca
4610: 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20  se OE_Rollback: 
4620: 20 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62    zType = "rollb
4630: 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ack";  break;.  
4640: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62        case OE_Ab
4650: 6f 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20  ort:      zType 
4660: 3d 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62  = "abort";     b
4670: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
4680: 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20  se OE_Fail:     
4690: 20 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22    zType = "fail"
46a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
46b0: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
46c0: 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20  nore:     zType 
46d0: 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62  = "ignore";    b
46e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
46f0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4700: 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
4710: 52 41 49 53 45 20 25 73 28 25 51 29 22 2c 20 7a  RAISE %s(%Q)", z
4720: 54 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  Type, pExpr->u.z
4730: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
4740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4750: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 41  f.    case TK_MA
4760: 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TCH: {.      sql
4770: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
4780: 28 70 56 69 65 77 2c 20 22 4d 41 54 43 48 20 7b  (pView, "MATCH {
4790: 25 64 3a 25 64 7d 25 73 22 2c 0a 20 20 20 20 20  %d:%d}%s",.     
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
47c0: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
47d0: 6d 6e 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20 20  mn, zFlgs);.    
47e0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
47f0: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78  wExpr(pView, pEx
4800: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
4810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4820: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56   }.    case TK_V
4830: 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  ECTOR: {.      s
4840: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 42 61  qlite3TreeViewBa
4850: 72 65 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  reExprList(pView
4860: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
4870: 2c 20 22 56 45 43 54 4f 52 22 29 3b 0a 20 20 20  , "VECTOR");.   
4880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4890: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
48a0: 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
48b0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
48c0: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53  ewLine(pView, "S
48d0: 45 4c 45 43 54 2d 43 4f 4c 55 4d 4e 20 25 64 22  ELECT-COLUMN %d"
48e0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
48f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4900: 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70  TreeViewSelect(p
4910: 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
4920: 66 74 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30  ft->x.pSelect, 0
4930: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4940: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4950: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b  K_IF_NULL_ROW: {
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 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
4980: 2c 20 22 49 46 2d 4e 55 4c 4c 2d 52 4f 57 20 25  , "IF-NULL-ROW %
4990: 64 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  d", pExpr->iTabl
49a0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
49b0: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
49c0: 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  iew, pExpr->pLef
49d0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  t, 0);.      bre
49e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
49f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
4a00: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
4a10: 6e 65 28 70 56 69 65 77 2c 20 22 6f 70 3d 25 64  ne(pView, "op=%d
4a20: 22 2c 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20  ", pExpr->op);. 
4a30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a40: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e  }.  }.  if( zBin
4a50: 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
4a60: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
4a70: 69 65 77 2c 20 22 25 73 25 73 22 2c 20 7a 42 69  iew, "%s%s", zBi
4a80: 6e 4f 70 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20  nOp, zFlgs);.   
4a90: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
4aa0: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
4ab0: 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20  r->pLeft, 1);.  
4ac0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4ad0: 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78  wExpr(pView, pEx
4ae0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
4af0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69    }else if( zUni
4b00: 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
4b10: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
4b20: 69 65 77 2c 20 22 25 73 25 73 22 2c 20 7a 55 6e  iew, "%s%s", zUn
4b30: 69 4f 70 2c 20 7a 46 6c 67 73 29 3b 0a 20 20 20  iOp, zFlgs);.   
4b40: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
4b50: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
4b60: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  r->pLeft, 0);.  
4b70: 7d 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56  }.  sqlite3TreeV
4b80: 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d  iewPop(pView);.}
4b90: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
4ba0: 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
4bb0: 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
4bc0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
4bd0: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
4be0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 42 61 72  lite3TreeViewBar
4bf0: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 54 72 65  eExprList(.  Tre
4c00: 65 56 69 65 77 20 2a 70 56 69 65 77 2c 0a 20 20  eView *pView,.  
4c10: 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a  const ExprList *
4c20: 70 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  pList,.  const c
4c30: 68 61 72 20 2a 7a 4c 61 62 65 6c 0a 29 7b 0a 20  har *zLabel.){. 
4c40: 20 69 66 28 20 7a 4c 61 62 65 6c 3d 3d 30 20 7c   if( zLabel==0 |
4c50: 7c 20 7a 4c 61 62 65 6c 5b 30 5d 3d 3d 30 20 29  | zLabel[0]==0 )
4c60: 20 7a 4c 61 62 65 6c 20 3d 20 22 4c 49 53 54 22   zLabel = "LIST"
4c70: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
4c80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
4c90: 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
4ca0: 77 2c 20 22 25 73 20 28 65 6d 70 74 79 29 22 2c  w, "%s (empty)",
4cb0: 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 65 6c 73   zLabel);.  }els
4cc0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
4cd0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4ce0: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73  wLine(pView, "%s
4cf0: 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ", zLabel);.    
4d00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
4d10: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
4d20: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 4c 69       int j = pLi
4d30: 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  st->a[i].u.x.iOr
4d40: 64 65 72 42 79 43 6f 6c 3b 0a 20 20 20 20 20 20  derByCol;.      
4d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
4d60: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
4d70: 0a 20 20 20 20 20 20 69 6e 74 20 6d 6f 72 65 54  .      int moreT
4d80: 6f 46 6f 6c 6c 6f 77 20 3d 20 69 3c 70 4c 69 73  oFollow = i<pLis
4d90: 74 2d 3e 6e 45 78 70 72 20 2d 20 31 3b 0a 20 20  t->nExpr - 1;.  
4da0: 20 20 20 20 69 66 28 20 6a 20 7c 7c 20 7a 4e 61      if( j || zNa
4db0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
4dc0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73  lite3TreeViewPus
4dd0: 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46  h(pView, moreToF
4de0: 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  ollow);.        
4df0: 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 20 3d 20 30  moreToFollow = 0
4e00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4e10: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
4e20: 69 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  iew, 0);.       
4e30: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
4e40: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
4e50: 73 74 64 6f 75 74 2c 20 22 41 53 20 25 73 20 22  stdout, "AS %s "
4e60: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
4e70: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4e80: 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  j ){.          f
4e90: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
4ea0: 69 4f 72 64 65 72 42 79 43 6f 6c 3d 25 64 22 2c  iOrderByCol=%d",
4eb0: 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   j);.        }. 
4ec0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
4ed0: 74 64 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  tdout, "\n");.  
4ee0: 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64        fflush(std
4ef0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
4f00: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4f10: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
4f20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
4f30: 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
4f40: 0a 20 20 20 20 20 20 69 66 28 20 6a 20 7c 7c 20  .      if( j || 
4f50: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
4f60: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
4f70: 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20  Pop(pView);.    
4f80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4f90: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65  void sqlite3Tree
4fa0: 56 69 65 77 45 78 70 72 4c 69 73 74 28 0a 20 20  ViewExprList(.  
4fb0: 54 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c  TreeView *pView,
4fc0: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  .  const ExprLis
4fd0: 74 20 2a 70 4c 69 73 74 2c 0a 20 20 75 38 20 6d  t *pList,.  u8 m
4fe0: 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c 0a 20 20 63  oreToFollow,.  c
4ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
5000: 6c 0a 29 7b 0a 20 20 70 56 69 65 77 20 3d 20 73  l.){.  pView = s
5010: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
5020: 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f  sh(pView, moreTo
5030: 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c 69 74  Follow);.  sqlit
5040: 65 33 54 72 65 65 56 69 65 77 42 61 72 65 45 78  e3TreeViewBareEx
5050: 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 4c  prList(pView, pL
5060: 69 73 74 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  ist, zLabel);.  
5070: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
5080: 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 0a 23 65  op(pView);.}..#e
5090: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
50a0: 45 42 55 47 20 2a 2f 0a                          EBUG */.