/ Hex Artifact Content
Login

Artifact cf03f9f6efb93288c7b9f17374ea48e4ce9111b0bc7e428d6850c3eee532b461:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 38  /*.** 2015-06-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20  contains C code 
0190: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
01a0: 20 54 72 65 65 56 69 65 77 20 64 65 62 75 67 67   TreeView debugg
01b0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  ing routines..**
01c0: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
01d0: 70 72 69 6e 74 20 61 20 70 61 72 73 65 20 74 72  print a parse tr
01e0: 65 65 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ee to standard o
01f0: 75 74 70 75 74 20 66 6f 72 20 64 65 62 75 67 67  utput for debugg
0200: 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
0210: 73 69 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sis. .**.** The 
0220: 69 6e 74 65 72 66 61 63 65 73 20 69 6e 20 74 68  interfaces in th
0230: 69 73 20 66 69 6c 65 20 69 73 20 6f 6e 6c 79 20  is file is only 
0240: 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 63  available when c
0250: 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68  ompiling.** with
0260: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 2e 0a 2a   SQLITE_DEBUG..*
0270: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0280: 74 65 49 6e 74 2e 68 22 0a 23 69 66 64 65 66 20  teInt.h".#ifdef 
0290: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
02a0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 73 75  .** Add a new su
02b0: 62 69 74 65 6d 20 74 6f 20 74 68 65 20 74 72 65  bitem to the tre
02c0: 65 2e 20 20 54 68 65 20 6d 6f 72 65 54 6f 46 6f  e.  The moreToFo
02d0: 6c 6c 6f 77 20 66 6c 61 67 20 69 6e 64 69 63 61  llow flag indica
02e0: 74 65 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a  tes that this.**
02f0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
0300: 20 69 74 65 6d 20 69 6e 20 74 68 65 20 74 72 65   item in the tre
0310: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 65  e..*/.static Tre
0320: 65 56 69 65 77 20 2a 73 71 6c 69 74 65 33 54 72  eView *sqlite3Tr
0330: 65 65 56 69 65 77 50 75 73 68 28 54 72 65 65 56  eeViewPush(TreeV
0340: 69 65 77 20 2a 70 2c 20 75 38 20 6d 6f 72 65 54  iew *p, u8 moreT
0350: 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 66 28 20  oFollow){.  if( 
0360: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  p==0 ){.    p = 
0370: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
0380: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
0390: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
03a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d  eturn 0;.    mem
03b0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
03c0: 28 2a 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (*p));.  }else{.
03d0: 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 2b 2b 3b      p->iLevel++;
03e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d  .  }.  assert( m
03f0: 6f 72 65 54 6f 46 6f 6c 6c 6f 77 3d 3d 30 20 7c  oreToFollow==0 |
0400: 7c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 3d 3d  | moreToFollow==
0410: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  1 );.  if( p->iL
0420: 65 76 65 6c 3c 73 69 7a 65 6f 66 28 70 2d 3e 62  evel<sizeof(p->b
0430: 4c 69 6e 65 29 20 29 20 70 2d 3e 62 4c 69 6e 65  Line) ) p->bLine
0440: 5b 70 2d 3e 69 4c 65 76 65 6c 5d 20 3d 20 6d 6f  [p->iLevel] = mo
0450: 72 65 54 6f 46 6f 6c 6c 6f 77 3b 0a 20 20 72 65  reToFollow;.  re
0460: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0470: 20 46 69 6e 69 73 68 65 64 20 77 69 74 68 20 6f   Finished with o
0480: 6e 65 20 6c 61 79 65 72 20 6f 66 20 74 68 65 20  ne layer of the 
0490: 74 72 65 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tree.*/.static v
04a0: 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56  oid sqlite3TreeV
04b0: 69 65 77 50 6f 70 28 54 72 65 65 56 69 65 77 20  iewPop(TreeView 
04c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
04d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 69  ) return;.  p->i
04e0: 4c 65 76 65 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  Level--;.  if( p
04f0: 2d 3e 69 4c 65 76 65 6c 3c 30 20 29 20 73 71 6c  ->iLevel<0 ) sql
0500: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
0510: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
0520: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
0530: 20 6f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20   output for the 
0540: 74 72 65 65 2c 20 77 69 74 68 20 61 20 70 72 65  tree, with a pre
0550: 66 69 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  fix that contain
0560: 73 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 61 70 70  s.** all the app
0570: 72 6f 70 72 69 61 74 65 20 74 72 65 65 20 6c 69  ropriate tree li
0580: 6e 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nes.*/.static vo
0590: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
05a0: 65 77 4c 69 6e 65 28 54 72 65 65 56 69 65 77 20  ewLine(TreeView 
05b0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05c0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
05d0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
05e0: 6e 74 20 69 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt i;.  StrAccum
05f0: 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75   acc;.  char zBu
0600: 66 5b 35 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  f[500];.  sqlite
0610: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
0620: 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  cc, 0, zBuf, siz
0630: 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20  eof(zBuf), 0);. 
0640: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
0650: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 69 4c 65 76  r(i=0; i<p->iLev
0660: 65 6c 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 70  el && i<sizeof(p
0670: 2d 3e 62 4c 69 6e 65 29 2d 31 3b 20 69 2b 2b 29  ->bLine)-1; i++)
0680: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0690: 73 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63 2c  str_append(&acc,
06a0: 20 70 2d 3e 62 4c 69 6e 65 5b 69 5d 20 3f 20 22   p->bLine[i] ? "
06b0: 7c 20 20 20 22 20 3a 20 22 20 20 20 20 22 2c 20  |   " : "    ", 
06c0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  4);.    }.    sq
06d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
06e0: 28 26 61 63 63 2c 20 70 2d 3e 62 4c 69 6e 65 5b  (&acc, p->bLine[
06f0: 69 5d 20 3f 20 22 7c 2d 2d 20 22 20 3a 20 22 27  i] ? "|-- " : "'
0700: 2d 2d 20 22 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  -- ", 4);.  }.  
0710: 69 66 28 20 7a 46 6f 72 6d 61 74 21 3d 30 20 29  if( zFormat!=0 )
0720: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
0730: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
0740: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 76 61 70   sqlite3_str_vap
0750: 70 65 6e 64 66 28 26 61 63 63 2c 20 7a 46 6f 72  pendf(&acc, zFor
0760: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
0770: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 61 73  _end(ap);.    as
0780: 73 65 72 74 28 20 61 63 63 2e 6e 43 68 61 72 3e  sert( acc.nChar>
0790: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
07a0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63  _str_append(&acc
07b0: 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a  , "\n", 1);.  }.
07c0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
07d0: 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20  mFinish(&acc);. 
07e0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
07f0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 66  "%s", zBuf);.  f
0800: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d  flush(stdout);.}
0810: 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 72 74 68 61 6e  ../*.** Shorthan
0820: 64 20 66 6f 72 20 73 74 61 72 74 69 6e 67 20 61  d for starting a
0830: 20 6e 65 77 20 74 72 65 65 20 69 74 65 6d 20 74   new tree item t
0840: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
0850: 61 20 73 69 6e 67 6c 65 20 6c 61 62 65 6c 0a 2a  a single label.*
0860: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
0870: 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
0880: 6d 28 54 72 65 65 56 69 65 77 20 2a 70 2c 20 63  m(TreeView *p, c
0890: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
08a0: 6c 2c 75 38 20 6d 6f 72 65 46 6f 6c 6c 6f 77 73  l,u8 moreFollows
08b0: 29 7b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ){.  p = sqlite3
08c0: 54 72 65 65 56 69 65 77 50 75 73 68 28 70 2c 20  TreeViewPush(p, 
08d0: 6d 6f 72 65 46 6f 6c 6c 6f 77 73 29 3b 0a 20 20  moreFollows);.  
08e0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
08f0: 69 6e 65 28 70 2c 20 22 25 73 22 2c 20 7a 4c 61  ine(p, "%s", zLa
0900: 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  bel);.}../*.** G
0910: 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
0920: 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
0930: 74 69 6f 6e 20 6f 66 20 61 20 57 49 54 48 20 63  tion of a WITH c
0940: 6c 61 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lause..*/.void s
0950: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 57 69  qlite3TreeViewWi
0960: 74 68 28 54 72 65 65 56 69 65 77 20 2a 70 56 69  th(TreeView *pVi
0970: 65 77 2c 20 63 6f 6e 73 74 20 57 69 74 68 20 2a  ew, const With *
0980: 70 57 69 74 68 2c 20 75 38 20 6d 6f 72 65 54 6f  pWith, u8 moreTo
0990: 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74 20 69  Follow){.  int i
09a0: 3b 0a 20 20 69 66 28 20 70 57 69 74 68 3d 3d 30  ;.  if( pWith==0
09b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
09c0: 20 70 57 69 74 68 2d 3e 6e 43 74 65 3d 3d 30 20   pWith->nCte==0 
09d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
09e0: 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 29 7b  pWith->pOuter ){
09f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
0a00: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
0a10: 22 57 49 54 48 20 28 30 78 25 70 2c 20 70 4f 75  "WITH (0x%p, pOu
0a20: 74 65 72 3d 30 78 25 70 29 22 2c 70 57 69 74 68  ter=0x%p)",pWith
0a30: 2c 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 29 3b  ,pWith->pOuter);
0a40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
0a50: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
0a60: 65 28 70 56 69 65 77 2c 20 22 57 49 54 48 20 28  e(pView, "WITH (
0a70: 30 78 25 70 29 22 2c 20 70 57 69 74 68 29 3b 0a  0x%p)", pWith);.
0a80: 20 20 7d 0a 20 20 69 66 28 20 70 57 69 74 68 2d    }.  if( pWith-
0a90: 3e 6e 43 74 65 3e 30 20 29 7b 0a 20 20 20 20 70  >nCte>0 ){.    p
0aa0: 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
0ab0: 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
0ac0: 2c 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , 1);.    for(i=
0ad0: 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
0ae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53 74  ; i++){.      St
0af0: 72 41 63 63 75 6d 20 78 3b 0a 20 20 20 20 20 20  rAccum x;.      
0b00: 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
0b10: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74  ;.      const st
0b20: 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d  ruct Cte *pCte =
0b30: 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20   &pWith->a[i];. 
0b40: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
0b50: 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20  ccumInit(&x, 0, 
0b60: 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
0b70: 69 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  ine), 0);.      
0b80: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
0b90: 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20 70 43  ndf(&x, "%s", pC
0ba0: 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
0bb0: 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
0bc0: 73 20 26 26 20 70 43 74 65 2d 3e 70 43 6f 6c 73  s && pCte->pCols
0bd0: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20  ->nExpr>0 ){.   
0be0: 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d       char cSep =
0bf0: 20 27 28 27 3b 0a 20 20 20 20 20 20 20 20 69 6e   '(';.        in
0c00: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
0c10: 28 6a 3d 30 3b 20 6a 3c 70 43 74 65 2d 3e 70 43  (j=0; j<pCte->pC
0c20: 6f 6c 73 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ols->nExpr; j++)
0c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
0c40: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
0c50: 26 78 2c 20 22 25 63 25 73 22 2c 20 63 53 65 70  &x, "%c%s", cSep
0c60: 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 61  , pCte->pCols->a
0c70: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
0c80: 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27        cSep = ','
0c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
0cb0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 29 22 29  appendf(&x, ")")
0cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0cd0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
0ce0: 6e 64 66 28 26 78 2c 20 22 20 41 53 22 29 3b 0a  ndf(&x, " AS");.
0cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
0d00: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
0d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
0d20: 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
0d30: 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70 57 69 74 68  , zLine, i<pWith
0d40: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 20  ->nCte-1);.     
0d50: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
0d60: 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 43  Select(pView, pC
0d70: 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
0d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
0d90: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
0da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0db0: 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
0dc0: 56 69 65 77 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  View);.  }.}../*
0dd0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
0de0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
0df0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 53  scription of a S
0e00: 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a  rcList object..*
0e10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72  /.void sqlite3Tr
0e20: 65 65 56 69 65 77 53 72 63 4c 69 73 74 28 54 72  eeViewSrcList(Tr
0e30: 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63  eeView *pView, c
0e40: 6f 6e 73 74 20 53 72 63 4c 69 73 74 20 2a 70 53  onst SrcList *pS
0e50: 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rc){.  int i;.  
0e60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
0e70: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
0e80: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 72   const struct Sr
0e90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
0ea0: 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
0eb0: 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 78 3b  .    StrAccum x;
0ec0: 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  .    char zLine[
0ed0: 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  100];.    sqlite
0ee0: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
0ef0: 2c 20 30 2c 20 7a 4c 69 6e 65 2c 20 73 69 7a 65  , 0, zLine, size
0f00: 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b 0a 20  of(zLine), 0);. 
0f10: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
0f20: 70 70 65 6e 64 66 28 26 78 2c 20 22 7b 25 64 2c  ppendf(&x, "{%d,
0f30: 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  *}", pItem->iCur
0f40: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49  sor);.    if( pI
0f50: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 29  tem->zDatabase )
0f60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0f70: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
0f80: 22 20 25 73 2e 25 73 22 2c 20 70 49 74 65 6d 2d  " %s.%s", pItem-
0f90: 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 49 74 65  >zDatabase, pIte
0fa0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
0fb0: 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
0fc0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  zName ){.      s
0fd0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
0fe0: 64 66 28 26 78 2c 20 22 20 25 73 22 2c 20 70 49  df(&x, " %s", pI
0ff0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1000: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d   }.    if( pItem
1010: 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
1020: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
1030: 6e 64 66 28 26 78 2c 20 22 20 74 61 62 3d 25 51  ndf(&x, " tab=%Q
1040: 20 6e 43 6f 6c 3d 25 64 20 70 74 72 3d 25 70 22   nCol=%d ptr=%p"
1050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 74  ,.           pIt
1060: 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  em->pTab->zName,
1070: 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 43   pItem->pTab->nC
1080: 6f 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  ol, pItem->pTab)
1090: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10a0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
10b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
10c0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
10d0: 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
10e0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d  ->zAlias);.    }
10f0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1100: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
1110: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 73  _LEFT ){.      s
1120: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
1130: 64 66 28 26 78 2c 20 22 20 4c 45 46 54 2d 4a 4f  df(&x, " LEFT-JO
1140: 49 4e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IN");.    }.    
1150: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1160: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20 20 73  inish(&x);.    s
1170: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74  qlite3TreeViewIt
1180: 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69 6e 65 2c  em(pView, zLine,
1190: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 29   i<pSrc->nSrc-1)
11a0: 3b 20 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ; .    if( pItem
11b0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11c0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
11d0: 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20  ewSelect(pView, 
11e0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
11f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
1200: 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
1210: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  bFunc ){.      s
1220: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1230: 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 49  prList(pView, pI
1240: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1250: 2c 20 30 2c 20 22 66 75 6e 63 2d 61 72 67 73 3a  , 0, "func-args:
1260: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ");.    }.    sq
1270: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1280: 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pView);.  }.}..
1290: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
12a0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
12b0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
12c0: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a   Select object..
12d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
12e0: 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 54 72  reeViewSelect(Tr
12f0: 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63  eeView *pView, c
1300: 6f 6e 73 74 20 53 65 6c 65 63 74 20 2a 70 2c 20  onst Select *p, 
1310: 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29  u8 moreToFollow)
1320: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
1330: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1340: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
1350: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1360: 69 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 2d  ine(pView, "nil-
1370: 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 72 65  SELECT");.    re
1380: 74 75 72 6e 3b 0a 20 20 7d 20 0a 20 20 70 56 69  turn;.  } .  pVi
1390: 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65  ew = sqlite3Tree
13a0: 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20  ViewPush(pView, 
13b0: 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20  moreToFollow);. 
13c0: 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29 7b   if( p->pWith ){
13d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
13e0: 56 69 65 77 57 69 74 68 28 70 56 69 65 77 2c 20  ViewWith(pView, 
13f0: 70 2d 3e 70 57 69 74 68 2c 20 31 29 3b 0a 20 20  p->pWith, 1);.  
1400: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73    cnt = 1;.    s
1410: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
1420: 73 68 28 70 56 69 65 77 2c 20 31 29 3b 0a 20 20  sh(pView, 1);.  
1430: 7d 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  }.  do{.    sqli
1440: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1450: 70 56 69 65 77 2c 0a 20 20 20 20 20 20 22 53 45  pView,.      "SE
1460: 4c 45 43 54 25 73 25 73 20 28 25 75 2f 25 70 29  LECT%s%s (%u/%p)
1470: 20 73 65 6c 46 6c 61 67 73 3d 30 78 25 78 20 6e   selFlags=0x%x n
1480: 53 65 6c 65 63 74 52 6f 77 3d 25 64 22 2c 0a 20  SelectRow=%d",. 
1490: 20 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61       ((p->selFla
14a0: 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
14b0: 29 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22 20  ) ? " DISTINCT" 
14c0: 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 28 28 70  : ""),.      ((p
14d0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14e0: 41 67 67 72 65 67 61 74 65 29 20 3f 20 22 20 61  Aggregate) ? " a
14f0: 67 67 5f 66 6c 61 67 22 20 3a 20 22 22 29 2c 0a  gg_flag" : ""),.
1500: 20 20 20 20 20 20 70 2d 3e 73 65 6c 49 64 2c 20        p->selId, 
1510: 70 2c 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  p, p->selFlags,.
1520: 20 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6e 53        (int)p->nS
1530: 65 6c 65 63 74 52 6f 77 0a 20 20 20 20 29 3b 0a  electRow.    );.
1540: 20 20 20 20 69 66 28 20 63 6e 74 2b 2b 20 29 20      if( cnt++ ) 
1550: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
1560: 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 69  op(pView);.    i
1570: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1580: 20 20 20 20 20 20 6e 20 3d 20 31 30 30 30 3b 0a        n = 1000;.
1590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15a0: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66   n = 0;.      if
15b0: 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e  ( p->pSrc && p->
15c0: 70 53 72 63 2d 3e 6e 53 72 63 20 29 20 6e 2b 2b  pSrc->nSrc ) n++
15d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
15e0: 57 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20 20 20  Where ) n++;.   
15f0: 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70     if( p->pGroup
1600: 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  By ) n++;.      
1610: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
1620: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   n++;.      if( 
1630: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 6e 2b  p->pOrderBy ) n+
1640: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
1650: 70 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a 23 69  pLimit ) n++;.#i
1660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1670: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
1680: 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29     if( p->pWin )
1690: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   n++;.      if( 
16a0: 70 2d 3e 70 57 69 6e 44 65 66 6e 20 29 20 6e 2b  p->pWinDefn ) n+
16b0: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  +;.#endif.    }.
16c0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
16d0: 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65  iewExprList(pVie
16e0: 77 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e  w, p->pEList, (n
16f0: 2d 2d 29 3e 30 2c 20 22 72 65 73 75 6c 74 2d 73  --)>0, "result-s
1700: 65 74 22 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  et");.#ifndef SQ
1710: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
1720: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 2d 3e  FUNC.    if( p->
1730: 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 57 69  pWin ){.      Wi
1740: 6e 64 6f 77 20 2a 70 58 3b 0a 20 20 20 20 20 20  ndow *pX;.      
1750: 70 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54  pView = sqlite3T
1760: 72 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65  reeViewPush(pVie
1770: 77 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20  w, (n--)>0);.   
1780: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1790: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 77  ewLine(pView, "w
17a0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 22  indow-functions"
17b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 58 3d  );.      for(pX=
17c0: 70 2d 3e 70 57 69 6e 3b 20 70 58 3b 20 70 58 3d  p->pWin; pX; pX=
17d0: 70 58 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  pX->pNextWin){. 
17e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
17f0: 65 65 56 69 65 77 57 69 6e 46 75 6e 63 28 70 56  eeViewWinFunc(pV
1800: 69 65 77 2c 20 70 58 2c 20 70 58 2d 3e 70 4e 65  iew, pX, pX->pNe
1810: 78 74 57 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20  xtWin!=0);.     
1820: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1830: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
1840: 77 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  w);.    }.#endif
1850: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63  .    if( p->pSrc
1860: 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   && p->pSrc->nSr
1870: 63 20 29 7b 0a 20 20 20 20 20 20 70 56 69 65 77  c ){.      pView
1880: 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69   = sqlite3TreeVi
1890: 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 28 6e  ewPush(pView, (n
18a0: 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20 73 71  --)>0);.      sq
18b0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
18c0: 65 28 70 56 69 65 77 2c 20 22 46 52 4f 4d 22 29  e(pView, "FROM")
18d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
18e0: 72 65 65 56 69 65 77 53 72 63 4c 69 73 74 28 70  reeViewSrcList(p
18f0: 56 69 65 77 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  View, p->pSrc);.
1900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1910: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
1920: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1930: 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1940: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1950: 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 57 48  wItem(pView, "WH
1960: 45 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  ERE", (n--)>0);.
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 28 70 56 69 65 77 2c  eViewExpr(pView,
1990: 20 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a   p->pWhere, 0);.
19a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
19b0: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
19c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19d0: 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
19e0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
19f0: 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65  iewExprList(pVie
1a00: 77 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  w, p->pGroupBy, 
1a10: 28 6e 2d 2d 29 3e 30 2c 20 22 47 52 4f 55 50 42  (n--)>0, "GROUPB
1a20: 59 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Y");.    }.    i
1a30: 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
1a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1a50: 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
1a60: 2c 20 22 48 41 56 49 4e 47 22 2c 20 28 6e 2d 2d  , "HAVING", (n--
1a70: 29 3e 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )>0);.      sqli
1a80: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1a90: 70 56 69 65 77 2c 20 70 2d 3e 70 48 61 76 69 6e  pView, p->pHavin
1aa0: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  g, 0);.      sql
1ab0: 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
1ac0: 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69  pView);.    }.#i
1ad0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae0: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
1af0: 20 69 66 28 20 70 2d 3e 70 57 69 6e 44 65 66 6e   if( p->pWinDefn
1b00: 20 29 7b 0a 20 20 20 20 20 20 57 69 6e 64 6f 77   ){.      Window
1b10: 20 2a 70 58 3b 0a 20 20 20 20 20 20 73 71 6c 69   *pX;.      sqli
1b20: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
1b30: 70 56 69 65 77 2c 20 22 57 49 4e 44 4f 57 22 2c  pView, "WINDOW",
1b40: 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20   (n--)>0);.     
1b50: 20 66 6f 72 28 70 58 3d 70 2d 3e 70 57 69 6e 44   for(pX=p->pWinD
1b60: 65 66 6e 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  efn; pX; pX=pX->
1b70: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20  pNextWin){.     
1b80: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1b90: 65 77 57 69 6e 64 6f 77 28 70 56 69 65 77 2c 20  ewWindow(pView, 
1ba0: 70 58 2c 20 70 58 2d 3e 70 4e 65 78 74 57 69 6e  pX, pX->pNextWin
1bb0: 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
1bc0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1bd0: 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
1be0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1bf0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1c00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c10: 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1c20: 28 70 56 69 65 77 2c 20 70 2d 3e 70 4f 72 64 65  (pView, p->pOrde
1c30: 72 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 4f  rBy, (n--)>0, "O
1c40: 52 44 45 52 42 59 22 29 3b 0a 20 20 20 20 7d 0a  RDERBY");.    }.
1c50: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69      if( p->pLimi
1c60: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1c70: 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70  e3TreeViewItem(p
1c80: 56 69 65 77 2c 20 22 4c 49 4d 49 54 22 2c 20 28  View, "LIMIT", (
1c90: 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20 73  n--)>0);.      s
1ca0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1cb0: 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4c 69  pr(pView, p->pLi
1cc0: 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 70 2d 3e 70  mit->pLeft, p->p
1cd0: 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 21 3d 30  Limit->pRight!=0
1ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1cf0: 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 29  pLimit->pRight )
1d00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d10: 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56  3TreeViewItem(pV
1d20: 69 65 77 2c 20 22 4f 46 46 53 45 54 22 2c 20 28  iew, "OFFSET", (
1d30: 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 20 20 20  n--)>0);.       
1d40: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d50: 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70  Expr(pView, p->p
1d60: 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 30  Limit->pRight, 0
1d70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d80: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
1d90: 69 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iew);.      }.  
1da0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1db0: 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
1dc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1dd0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20  pPrior ){.      
1de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1df0: 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20 20 20 20  = "UNION";.     
1e00: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
1e10: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  {.        case T
1e20: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 20 20 7a  K_ALL:         z
1e30: 4f 70 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22  Op = "UNION ALL"
1e40: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
1e50: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
1e60: 45 43 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 4e  ECT:   zOp = "IN
1e70: 54 45 52 53 45 43 54 22 3b 20 20 62 72 65 61 6b  TERSECT";  break
1e80: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
1e90: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 20 20 7a  K_EXCEPT:      z
1ea0: 4f 70 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20  Op = "EXCEPT";  
1eb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ec0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
1ed0: 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65  reeViewItem(pVie
1ee0: 77 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 20 20  w, zOp, 1);.    
1ef0: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  }.    p = p->pPr
1f00: 69 6f 72 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ior;.  }while( p
1f10: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1f20: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
1f30: 77 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  w);.}..#ifndef S
1f40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
1f50: 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  WFUNC./*.** Gene
1f60: 72 61 74 65 20 61 20 64 65 73 63 72 69 70 74 69  rate a descripti
1f70: 6f 6e 20 6f 66 20 73 74 61 72 74 69 6e 67 20 6f  on of starting o
1f80: 72 20 73 74 6f 70 70 69 6e 67 20 62 6f 75 6e 64  r stopping bound
1f90: 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  s.*/.void sqlite
1fa0: 33 54 72 65 65 56 69 65 77 42 6f 75 6e 64 28 0a  3TreeViewBound(.
1fb0: 20 20 54 72 65 65 56 69 65 77 20 2a 70 56 69 65    TreeView *pVie
1fc0: 77 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 69 65  w,        /* Vie
1fd0: 77 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 75  w context */.  u
1fe0: 38 20 65 42 6f 75 6e 64 2c 20 20 20 20 20 20 20  8 eBound,       
1ff0: 20 20 20 20 20 20 20 2f 2a 20 55 4e 42 4f 55 4e         /* UNBOUN
2000: 44 45 44 2c 20 43 55 52 52 45 4e 54 2c 20 50 52  DED, CURRENT, PR
2010: 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49  ECEDING, FOLLOWI
2020: 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  NG */.  Expr *pE
2030: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
2040: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 50 52 45  /* Value for PRE
2050: 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57  CEDING or FOLLOW
2060: 49 4e 47 20 2a 2f 0a 20 20 75 38 20 6d 6f 72 65  ING */.  u8 more
2070: 54 6f 46 6f 6c 6c 6f 77 20 20 20 20 20 20 20 20  ToFollow        
2080: 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 6f 72 65   /* True if more
2090: 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 29 7b   to follow */.){
20a0: 0a 20 20 73 77 69 74 63 68 28 20 65 42 6f 75 6e  .  switch( eBoun
20b0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
20c0: 5f 55 4e 42 4f 55 4e 44 45 44 3a 20 7b 0a 20 20  _UNBOUNDED: {.  
20d0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
20e0: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
20f0: 55 4e 42 4f 55 4e 44 45 44 22 2c 20 6d 6f 72 65  UNBOUNDED", more
2100: 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20  ToFollow);.     
2110: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2120: 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20  Pop(pView);.    
2130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2140: 20 20 20 63 61 73 65 20 54 4b 5f 43 55 52 52 45     case TK_CURRE
2150: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NT: {.      sqli
2160: 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
2170: 70 56 69 65 77 2c 20 22 43 55 52 52 45 4e 54 22  pView, "CURRENT"
2180: 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
2190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
21a0: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
21b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21d0: 5f 50 52 45 43 45 44 49 4e 47 3a 20 7b 0a 20 20  _PRECEDING: {.  
21e0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
21f0: 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
2200: 50 52 45 43 45 44 49 4e 47 22 2c 20 6d 6f 72 65  PRECEDING", more
2210: 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20  ToFollow);.     
2220: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2230: 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
2240: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
2250: 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
2260: 70 56 69 65 77 29 3b 0a 20 20 20 20 20 20 62 72  pView);.      br
2270: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2280: 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  ase TK_FOLLOWING
2290: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
22a0: 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56  3TreeViewItem(pV
22b0: 69 65 77 2c 20 22 46 4f 4c 4c 4f 57 49 4e 47 22  iew, "FOLLOWING"
22c0: 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
22d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
22e0: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
22f0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
2300: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2310: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
2320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2330: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
2340: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
2350: 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 23 69 66 6e  DOWFUNC */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 57 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a  WINDOWFUNC./*.**
2380: 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
2390: 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
23a0: 6e 61 74 69 6f 6e 20 66 6f 72 20 61 20 57 69 6e  nation for a Win
23b0: 64 6f 77 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  dow object.*/.vo
23c0: 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  id sqlite3TreeVi
23d0: 65 77 57 69 6e 64 6f 77 28 54 72 65 65 56 69 65  ewWindow(TreeVie
23e0: 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20  w *pView, const 
23f0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 75 38  Window *pWin, u8
2400: 20 6d 6f 72 65 29 7b 0a 20 20 69 6e 74 20 6e 45   more){.  int nE
2410: 6c 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66  lement = 0;.  if
2420: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
2430: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2440: 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
2450: 2c 20 22 46 49 4c 54 45 52 22 2c 20 31 29 3b 0a  , "FILTER", 1);.
2460: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2470: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
2480: 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29  Win->pFilter, 0)
2490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
24a0: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
24b0: 0a 20 20 7d 0a 20 20 70 56 69 65 77 20 3d 20 73  .  }.  pView = s
24c0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
24d0: 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 29 3b  sh(pView, more);
24e0: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 4e 61  .  if( pWin->zNa
24f0: 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
2500: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
2510: 69 65 77 2c 20 22 4f 56 45 52 20 25 73 20 28 25  iew, "OVER %s (%
2520: 70 29 22 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  p)", pWin->zName
2530: 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  , pWin);.  }else
2540: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
2550: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
2560: 20 22 4f 56 45 52 20 28 25 70 29 22 2c 20 70 57   "OVER (%p)", pW
2570: 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  in);.  }.  if( p
2580: 57 69 6e 2d 3e 7a 42 61 73 65 20 29 20 20 20 20  Win->zBase )    
2590: 6e 45 6c 65 6d 65 6e 74 2b 2b 3b 0a 20 20 69 66  nElement++;.  if
25a0: 28 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  ( pWin->pOrderBy
25b0: 20 29 20 6e 45 6c 65 6d 65 6e 74 2b 2b 3b 0a 20   ) nElement++;. 
25c0: 20 69 66 28 20 70 57 69 6e 2d 3e 65 46 72 6d 54   if( pWin->eFrmT
25d0: 79 70 65 20 29 20 6e 45 6c 65 6d 65 6e 74 2b 2b  ype ) nElement++
25e0: 3b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 65 45  ;.  if( pWin->eE
25f0: 78 63 6c 75 64 65 20 29 20 6e 45 6c 65 6d 65 6e  xclude ) nElemen
2600: 74 2b 2b 3b 0a 20 20 69 66 28 20 70 57 69 6e 2d  t++;.  if( pWin-
2610: 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 73 71  >zBase ){.    sq
2620: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73  lite3TreeViewPus
2630: 68 28 70 56 69 65 77 2c 20 28 2d 2d 6e 45 6c 65  h(pView, (--nEle
2640: 6d 65 6e 74 29 3e 30 29 3b 0a 20 20 20 20 73 71  ment)>0);.    sq
2650: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
2660: 65 28 70 56 69 65 77 2c 20 22 77 69 6e 64 6f 77  e(pView, "window
2670: 3a 20 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 42 61  : %s", pWin->zBa
2680: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
2690: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
26a0: 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57  w);.  }.  if( pW
26b0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
26c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
26d0: 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
26e0: 69 65 77 2c 20 70 57 69 6e 2d 3e 70 50 61 72 74  iew, pWin->pPart
26f0: 69 74 69 6f 6e 2c 20 6e 45 6c 65 6d 65 6e 74 3e  ition, nElement>
2700: 30 2c 22 50 41 52 54 49 54 49 4f 4e 2d 42 59 22  0,"PARTITION-BY"
2710: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 69  );.  }.  if( pWi
2720: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  n->pOrderBy ){. 
2730: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2740: 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
2750: 2c 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  , pWin->pOrderBy
2760: 2c 20 28 2d 2d 6e 45 6c 65 6d 65 6e 74 29 3e 30  , (--nElement)>0
2770: 2c 20 22 4f 52 44 45 52 2d 42 59 22 29 3b 0a 20  , "ORDER-BY");. 
2780: 20 7d 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 65   }.  if( pWin->e
2790: 46 72 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63  FrmType ){.    c
27a0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
27b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
27c0: 72 6d 54 79 70 65 20 3d 20 22 52 4f 57 53 22 3b  rmType = "ROWS";
27d0: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65  .    if( pWin->e
27e0: 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  FrmType==TK_RANG
27f0: 45 20 29 20 7a 46 72 6d 54 79 70 65 20 3d 20 22  E ) zFrmType = "
2800: 52 41 4e 47 45 22 3b 0a 20 20 20 20 69 66 28 20  RANGE";.    if( 
2810: 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d  pWin->eFrmType==
2820: 54 4b 5f 47 52 4f 55 50 53 20 29 20 7a 46 72 6d  TK_GROUPS ) zFrm
2830: 54 79 70 65 20 3d 20 22 47 52 4f 55 50 53 22 3b  Type = "GROUPS";
2840: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2850: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
2860: 66 29 2c 7a 42 75 66 2c 22 25 73 25 73 22 2c 7a  f),zBuf,"%s%s",z
2870: 46 72 6d 54 79 70 65 2c 0a 20 20 20 20 20 20 20  FrmType,.       
2880: 20 70 57 69 6e 2d 3e 62 49 6d 70 6c 69 63 69 74   pWin->bImplicit
2890: 46 72 61 6d 65 20 3f 20 22 20 28 69 6d 70 6c 69  Frame ? " (impli
28a0: 65 64 29 22 20 3a 20 22 22 29 3b 0a 20 20 20 20  ed)" : "");.    
28b0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49  sqlite3TreeViewI
28c0: 74 65 6d 28 70 56 69 65 77 2c 20 7a 42 75 66 2c  tem(pView, zBuf,
28d0: 20 28 2d 2d 6e 45 6c 65 6d 65 6e 74 29 3e 30 29   (--nElement)>0)
28e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
28f0: 65 56 69 65 77 42 6f 75 6e 64 28 70 56 69 65 77  eViewBound(pView
2900: 2c 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 2c 20  , pWin->eStart, 
2910: 70 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 31 29  pWin->pStart, 1)
2920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2930: 65 56 69 65 77 42 6f 75 6e 64 28 70 56 69 65 77  eViewBound(pView
2940: 2c 20 70 57 69 6e 2d 3e 65 45 6e 64 2c 20 70 57  , pWin->eEnd, pW
2950: 69 6e 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20  in->pEnd, 0);.  
2960: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2970: 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
2980: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 65 45 78  .  if( pWin->eEx
2990: 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 63 68 61  clude ){.    cha
29a0: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
29b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 63  const char *zExc
29c0: 6c 75 64 65 3b 0a 20 20 20 20 73 77 69 74 63 68  lude;.    switch
29d0: 28 20 70 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65  ( pWin->eExclude
29e0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
29f0: 4b 5f 4e 4f 3a 20 20 20 20 20 20 7a 45 78 63 6c  K_NO:      zExcl
2a00: 75 64 65 20 3d 20 22 4e 4f 20 4f 54 48 45 52 53  ude = "NO OTHERS
2a10: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
2a20: 20 20 63 61 73 65 20 54 4b 5f 43 55 52 52 45 4e    case TK_CURREN
2a30: 54 3a 20 7a 45 78 63 6c 75 64 65 20 3d 20 22 43  T: zExclude = "C
2a40: 55 52 52 45 4e 54 20 52 4f 57 22 3b 20 62 72 65  URRENT ROW"; bre
2a50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54  ak;.      case T
2a60: 4b 5f 47 52 4f 55 50 3a 20 20 20 7a 45 78 63 6c  K_GROUP:   zExcl
2a70: 75 64 65 20 3d 20 22 47 52 4f 55 50 22 3b 20 20  ude = "GROUP";  
2a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a90: 20 20 63 61 73 65 20 54 4b 5f 54 49 45 53 3a 20    case TK_TIES: 
2aa0: 20 20 20 7a 45 78 63 6c 75 64 65 20 3d 20 22 54     zExclude = "T
2ab0: 49 45 53 22 3b 20 20 20 20 20 20 20 20 62 72 65  IES";        bre
2ac0: 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
2ad0: 74 3a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t:.        sqlit
2ae0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2af0: 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 69  of(zBuf),zBuf,"i
2b00: 6e 76 61 6c 69 64 28 25 64 29 22 2c 20 70 57 69  nvalid(%d)", pWi
2b10: 6e 2d 3e 65 45 78 63 6c 75 64 65 29 3b 0a 20 20  n->eExclude);.  
2b20: 20 20 20 20 20 20 7a 45 78 63 6c 75 64 65 20 3d        zExclude =
2b30: 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 62   zBuf;.        b
2b40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2b50: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
2b60: 75 73 68 28 70 56 69 65 77 2c 20 30 29 3b 0a 20  ush(pView, 0);. 
2b70: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2b80: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 45  ewLine(pView, "E
2b90: 58 43 4c 55 44 45 20 25 73 22 2c 20 7a 45 78 63  XCLUDE %s", zExc
2ba0: 6c 75 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  lude);.    sqlit
2bb0: 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
2bc0: 69 65 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  iew);.  }.  sqli
2bd0: 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
2be0: 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  View);.}.#endif 
2bf0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
2c00: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 23 69  INDOWFUNC */..#i
2c10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c20: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a  T_WINDOWFUNC./*.
2c30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
2c40: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70  man-readable exp
2c50: 6c 61 6e 61 74 69 6f 6e 20 66 6f 72 20 61 20 57  lanation for a W
2c60: 69 6e 64 6f 77 20 46 75 6e 63 74 69 6f 6e 20 6f  indow Function o
2c70: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
2c80: 6c 69 74 65 33 54 72 65 65 56 69 65 77 57 69 6e  lite3TreeViewWin
2c90: 46 75 6e 63 28 54 72 65 65 56 69 65 77 20 2a 70  Func(TreeView *p
2ca0: 56 69 65 77 2c 20 63 6f 6e 73 74 20 57 69 6e 64  View, const Wind
2cb0: 6f 77 20 2a 70 57 69 6e 2c 20 75 38 20 6d 6f 72  ow *pWin, u8 mor
2cc0: 65 29 7b 0a 20 20 70 56 69 65 77 20 3d 20 73 71  e){.  pView = sq
2cd0: 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73  lite3TreeViewPus
2ce0: 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 29 3b 0a  h(pView, more);.
2cf0: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2d00: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 57 49  wLine(pView, "WI
2d10: 4e 46 55 4e 43 20 25 73 28 25 64 29 22 2c 0a 20  NFUNC %s(%d)",. 
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 46 75 6e        pWin->pFun
2d40: 63 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e  c->zName, pWin->
2d50: 70 46 75 6e 63 2d 3e 6e 41 72 67 29 3b 0a 20 20  pFunc->nArg);.  
2d60: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 57  sqlite3TreeViewW
2d70: 69 6e 64 6f 77 28 70 56 69 65 77 2c 20 70 57 69  indow(pView, pWi
2d80: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
2d90: 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
2da0: 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  w);.}.#endif /* 
2db0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2dc0: 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OWFUNC */../*.**
2dd0: 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
2de0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
2df0: 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70  nation of an exp
2e00: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
2e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65  .void sqlite3Tre
2e20: 65 56 69 65 77 45 78 70 72 28 54 72 65 65 56 69  eViewExpr(TreeVi
2e30: 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74  ew *pView, const
2e40: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38   Expr *pExpr, u8
2e50: 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a   moreToFollow){.
2e60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
2e70: 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42  inOp = 0;   /* B
2e80: 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a  inary operator *
2e90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2ea0: 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a  zUniOp = 0;   /*
2eb0: 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20   Unary operator 
2ec0: 2a 2f 0a 20 20 63 68 61 72 20 7a 46 6c 67 73 5b  */.  char zFlgs[
2ed0: 36 30 5d 3b 0a 20 20 70 56 69 65 77 20 3d 20 73  60];.  pView = s
2ee0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
2ef0: 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f  sh(pView, moreTo
2f00: 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70  Follow);.  if( p
2f10: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Expr==0 ){.    s
2f20: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
2f30: 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 22 29  ne(pView, "nil")
2f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2f50: 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
2f60: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2f70: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
2f80: 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ags ){.    if( E
2f90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2fa0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
2fb0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
2fc0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2fd0: 65 6f 66 28 7a 46 6c 67 73 29 2c 7a 46 6c 67 73  eof(zFlgs),zFlgs
2fe0: 2c 22 20 20 66 6c 61 67 73 3d 30 78 25 78 20 69  ,"  flags=0x%x i
2ff0: 52 4a 54 3d 25 64 22 2c 0a 20 20 20 20 20 20 20  RJT=%d",.       
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 70 45 78 70 72 2d 3e 66 6c 61 67 73 2c 20 70 45  pExpr->flags, pE
3020: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
3030: 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
3040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3050: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3060: 7a 46 6c 67 73 29 2c 7a 46 6c 67 73 2c 22 20 20  zFlgs),zFlgs,"  
3070: 66 6c 61 67 73 3d 30 78 25 78 22 2c 70 45 78 70  flags=0x%x",pExp
3080: 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  r->flags);.    }
3090: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
30a0: 6c 67 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a  lgs[0] = 0;.  }.
30b0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
30c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
30d0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
30e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
30f0: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
3100: 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 25 73 22  , "AGG{%d:%d}%s"
3110: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ,.            pE
3120: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
3130: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c  pr->iColumn, zFl
3140: 67 73 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  gs);.      break
3150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3160: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
3170: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
3180: 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
3190: 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
31a0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
31b0: 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
31c0: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
31d0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31e0: 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c  Line(pView, "COL
31f0: 55 4d 4e 28 25 64 29 25 73 22 2c 20 70 45 78 70  UMN(%d)%s", pExp
3200: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c 67  r->iColumn, zFlg
3210: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
3220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3230: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3240: 65 77 2c 20 22 7b 25 64 3a 25 64 7d 25 73 22 2c  ew, "{%d:%d}%s",
3250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3270: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
3280: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7a 46 6c  pr->iColumn, zFl
3290: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
32a0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
32b0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
32c0: 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20  _FixedCol) ){.  
32d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
32e0: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
32f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
3300: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3320: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
3330: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
3340: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
3350: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
3360: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
3370: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
3380: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
3390: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65  Value);.      }e
33a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
33b0: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
33c0: 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 70 45  (pView, "%s", pE
33d0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
33e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
33f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
3400: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
3410: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
3420: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
3430: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3440: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3450: 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ew,"%s", pExpr->
3460: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
3470: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3480: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
3490: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
34a0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
34b0: 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 51 22 2c  Line(pView,"%Q",
34c0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
34d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
34e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
34f0: 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
3500: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
3510: 69 6e 65 28 70 56 69 65 77 2c 22 4e 55 4c 4c 22  ine(pView,"NULL"
3520: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3530: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
3540: 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20  K_TRUEFALSE: {. 
3550: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
3560: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 0a  ViewLine(pView,.
3570: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3580: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
3590: 45 78 70 72 29 20 3f 20 22 54 52 55 45 22 20 3a  Expr) ? "TRUE" :
35a0: 20 22 46 41 4c 53 45 22 29 3b 0a 20 20 20 20 20   "FALSE");.     
35b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
35c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35d0: 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
35e0: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
35f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3600: 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
3610: 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ew,"%s", pExpr->
3620: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
3630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3640: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
3650: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
3660: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
3670: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 56 41  ewLine(pView,"VA
3680: 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a  RIABLE(%s,%d)",.
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
36b0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72  >u.zToken, pExpr
36c0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
36d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
36e0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
36f0: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
3700: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
3710: 28 70 56 69 65 77 2c 22 52 45 47 49 53 54 45 52  (pView,"REGISTER
3720: 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54  (%d)", pExpr->iT
3730: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
3740: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3750: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
3760: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
3770: 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 49 44 20  wLine(pView,"ID 
3780: 5c 22 25 77 5c 22 22 2c 20 70 45 78 70 72 2d 3e  \"%w\"", pExpr->
3790: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
37a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
37b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37c0: 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
37d0: 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
37e0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
37f0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
3800: 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
3810: 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  en) */.      sql
3820: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
3830: 28 70 56 69 65 77 2c 22 43 41 53 54 20 25 51 22  (pView,"CAST %Q"
3840: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
3850: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
3860: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
3870: 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  iew, pExpr->pLef
3880: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  t, 0);.      bre
3890: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
38a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
38b0: 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
38c0: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69   TK_LT:      zBi
38d0: 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  nOp = "LT";     
38e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
38f0: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_LE:      zBin
3900: 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62  Op = "LE";     b
3910: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3920: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GT:      zBinO
3930: 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72  p = "GT";     br
3940: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3950: 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _GE:      zBinOp
3960: 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72 65   = "GE";     bre
3970: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3980: 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  NE:      zBinOp 
3990: 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61  = "NE";     brea
39a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
39b0: 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  Q:      zBinOp =
39c0: 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b   "EQ";     break
39d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
39e0: 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
39f0: 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "IS";     break;
3a00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
3a10: 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  OT:   zBinOp = "
3a20: 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ISNOT";  break;.
3a30: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
3a40: 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41       zBinOp = "A
3a50: 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ND";    break;. 
3a60: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
3a70: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52      zBinOp = "OR
3a80: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
3a90: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
3aa0: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44     zBinOp = "ADD
3ab0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
3ac0: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20   case TK_STAR:  
3ad0: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22    zBinOp = "MUL"
3ae0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
3af0: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
3b00: 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b   zBinOp = "SUB";
3b10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3b20: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
3b30: 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20  zBinOp = "REM"; 
3b40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3b50: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a  se TK_BITAND:  z
3b60: 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22  BinOp = "BITAND"
3b70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3b80: 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42  e TK_BITOR:   zB
3b90: 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20  inOp = "BITOR"; 
3ba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3bb0: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69   TK_SLASH:   zBi
3bc0: 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  nOp = "DIV";    
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3be0: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_LSHIFT:  zBin
3bf0: 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62  Op = "LSHIFT"; b
3c00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3c10: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_RSHIFT:  zBinO
3c20: 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72  p = "RSHIFT"; br
3c30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3c40: 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70  _CONCAT:  zBinOp
3c50: 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65   = "CONCAT"; bre
3c60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3c70: 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  DOT:     zBinOp 
3c80: 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72 65 61  = "DOT";    brea
3c90: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
3ca0: 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20  UMINUS:  zUniOp 
3cb0: 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61  = "UMINUS"; brea
3cc0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
3cd0: 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d  PLUS:   zUniOp =
3ce0: 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b   "UPLUS";  break
3cf0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
3d00: 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  TNOT:  zUniOp = 
3d10: 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b  "BITNOT"; break;
3d20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
3d30: 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  :     zUniOp = "
3d40: 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NOT";    break;.
3d50: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
3d60: 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49  LL:  zUniOp = "I
3d70: 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20  SNULL"; break;. 
3d80: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
3d90: 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f  LL: zUniOp = "NO
3da0: 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
3db0: 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
3dc0: 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  H: {.      int x
3dd0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
3de0: 61 72 20 2a 61 7a 4f 70 5b 5d 20 3d 20 7b 0a 20  ar *azOp[] = {. 
3df0: 20 20 20 20 20 20 20 20 22 49 53 2d 46 41 4c 53          "IS-FALS
3e00: 45 22 2c 20 22 49 53 2d 54 52 55 45 22 2c 20 22  E", "IS-TRUE", "
3e10: 49 53 2d 4e 4f 54 2d 46 41 4c 53 45 22 2c 20 22  IS-NOT-FALSE", "
3e20: 49 53 2d 4e 4f 54 2d 54 52 55 45 22 0a 20 20 20  IS-NOT-TRUE".   
3e30: 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65     };.      asse
3e40: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  rt( pExpr->op2==
3e50: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
3e60: 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  op2==TK_ISNOT );
3e70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3e80: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a  Expr->pRight );.
3e90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
3ea0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3eb0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  late(pExpr->pRig
3ec0: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45  ht)->op==TK_TRUE
3ed0: 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 78  FALSE );.      x
3ee0: 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 32 3d 3d   = (pExpr->op2==
3ef0: 54 4b 5f 49 53 4e 4f 54 29 2a 32 20 2b 20 73 71  TK_ISNOT)*2 + sq
3f00: 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
3f10: 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
3f20: 74 29 3b 0a 20 20 20 20 20 20 7a 55 6e 69 4f 70  t);.      zUniOp
3f30: 20 3d 20 61 7a 4f 70 5b 78 5d 3b 0a 20 20 20 20   = azOp[x];.    
3f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3f50: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
3f60: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3f70: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
3f80: 69 65 77 2c 20 22 53 50 41 4e 20 25 51 22 2c 20  iew, "SPAN %Q", 
3f90: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
3fa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
3fb0: 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
3fc0: 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
3fd0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
3fe0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3ff0: 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e TK_COLLATE: {.
4000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
4010: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
4020: 20 22 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 70   "COLLATE %Q", p
4030: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
4040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
4050: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
4060: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
4070: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4090: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
40a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
40b0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
40c0: 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
40d0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
40e0: 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
40f0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 69  ents */.      Wi
4100: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
4110: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4120: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
4130: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
4140: 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
4150: 0a 20 20 20 20 20 20 20 20 70 57 69 6e 20 3d 20  .        pWin = 
4160: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
4170: 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
4180: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
4190: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
41a0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
41b0: 20 20 20 20 20 20 20 70 57 69 6e 20 3d 20 70 45         pWin = pE
41c0: 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a 23 65 6c  xpr->y.pWin;.#el
41d0: 73 65 0a 20 20 20 20 20 20 20 20 70 57 69 6e 20  se.        pWin 
41e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 20 0a 20 20 20  = 0;.#endif .   
41f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4200: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
4210: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
4220: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
4230: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
4240: 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64 20  "AGG_FUNCTION%d 
4250: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %Q",.           
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45    pExpr->op2, pE
4280: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
4290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
42a0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
42b0: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
42c0: 22 46 55 4e 43 54 49 4f 4e 20 25 51 22 2c 20 70  "FUNCTION %Q", p
42d0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
42e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
42f0: 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
4300: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4310: 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65  iewExprList(pVie
4320: 77 2c 20 70 46 61 72 67 2c 20 70 57 69 6e 21 3d  w, pFarg, pWin!=
4330: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
4340: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4350: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
4360: 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a      if( pWin ){.
4370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
4380: 72 65 65 56 69 65 77 57 69 6e 64 6f 77 28 70 56  reeViewWindow(pV
4390: 69 65 77 2c 20 70 57 69 6e 2c 20 30 29 3b 0a 20  iew, pWin, 0);. 
43a0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
43b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
43c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
43d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
43e0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
43f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4400: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
4410: 69 65 77 2c 20 22 45 58 49 53 54 53 2d 65 78 70  iew, "EXISTS-exp
4420: 72 20 66 6c 61 67 73 3d 30 78 25 78 22 2c 20 70  r flags=0x%x", p
4430: 45 78 70 72 2d 3e 66 6c 61 67 73 29 3b 0a 20 20  Expr->flags);.  
4440: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4450: 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c  iewSelect(pView,
4460: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
4470: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  t, 0);.      bre
4480: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4490: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
44a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
44b0: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
44c0: 20 22 53 45 4c 45 43 54 2d 65 78 70 72 20 66 6c   "SELECT-expr fl
44d0: 61 67 73 3d 30 78 25 78 22 2c 20 70 45 78 70 72  ags=0x%x", pExpr
44e0: 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ->flags);.      
44f0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
4500: 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45 78  elect(pView, pEx
4510: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30  pr->x.pSelect, 0
4520: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4530: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4540: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_IN: {.      sq
4550: 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
4560: 65 28 70 56 69 65 77 2c 20 22 49 4e 20 66 6c 61  e(pView, "IN fla
4570: 67 73 3d 30 78 25 78 22 2c 20 70 45 78 70 72 2d  gs=0x%x", pExpr-
4580: 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73  >flags);.      s
4590: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
45a0: 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
45b0: 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20  >pLeft, 1);.    
45c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
45d0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
45e0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
4600: 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65  eViewSelect(pVie
4610: 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  w, pExpr->x.pSel
4620: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ect, 0);.      }
4630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4640: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
4650: 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 45 78  rList(pView, pEx
4660: 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pr->x.pList, 0, 
4670: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4690: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
46a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
46b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
46c0: 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
46d0: 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
46e0: 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
46f0: 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
4700: 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
4710: 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
4720: 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
4730: 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
4740: 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
4750: 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
4760: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
4770: 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
4780: 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
4790: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
47a0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
47b0: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
47c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
47d0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
47e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 59 20 3d        Expr *pY =
47f0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
4800: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
4810: 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20 70 45     Expr *pZ = pE
4820: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
4830: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
4840: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
4850: 69 6e 65 28 70 56 69 65 77 2c 20 22 42 45 54 57  ine(pView, "BETW
4860: 45 45 4e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  EEN");.      sql
4870: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
4880: 28 70 56 69 65 77 2c 20 70 58 2c 20 31 29 3b 0a  (pView, pX, 1);.
4890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
48a0: 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
48b0: 20 70 59 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   pY, 1);.      s
48c0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
48d0: 70 72 28 70 56 69 65 77 2c 20 70 5a 2c 20 30 29  pr(pView, pZ, 0)
48e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
48f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
4900: 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
4910: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
4920: 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
4930: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
4940: 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
4950: 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
4960: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
4970: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
4980: 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
4990: 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
49a0: 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
49b0: 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
49c0: 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
49d0: 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
49e0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
49f0: 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
4a00: 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
4a10: 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
4a20: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
4a30: 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
4a40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
4a50: 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
4a60: 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
4a70: 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
4a80: 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
4a90: 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
4aa0: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
4ab0: 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25  ewLine(pView, "%
4ac0: 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20  s(%d)", .       
4ad0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4ae0: 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22   ? "NEW" : "OLD"
4af0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
4b00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4b20: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
4b30: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
4b40: 69 6e 65 28 70 56 69 65 77 2c 20 22 43 41 53 45  ine(pView, "CASE
4b50: 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
4b60: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
4b70: 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  iew, pExpr->pLef
4b80: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
4b90: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
4ba0: 4c 69 73 74 28 70 56 69 65 77 2c 20 70 45 78 70  List(pView, pExp
4bb0: 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  r->x.pList, 0, 0
4bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4bd0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4be0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4bf0: 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
4c00: 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ISE: {.      con
4c10: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
4c20: 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77   "unk";.      sw
4c30: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61 66 66  itch( pExpr->aff
4c40: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
4c50: 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
4c60: 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22 72 6f  k:   zType = "ro
4c70: 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b  llback";  break;
4c80: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
4c90: 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a 54 79  _Abort:      zTy
4ca0: 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20 20 20  pe = "abort";   
4cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4cc0: 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20   case OE_Fail:  
4cd0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 66 61       zType = "fa
4ce0: 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  il";      break;
4cf0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
4d00: 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79  _Ignore:     zTy
4d10: 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20  pe = "ignore";  
4d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
4d40: 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
4d50: 2c 20 22 52 41 49 53 45 20 25 73 28 25 51 29 22  , "RAISE %s(%Q)"
4d60: 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72 2d 3e  , zType, pExpr->
4d70: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
4d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4d90: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
4da0: 5f 4d 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  _MATCH: {.      
4db0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
4dc0: 69 6e 65 28 70 56 69 65 77 2c 20 22 4d 41 54 43  ine(pView, "MATC
4dd0: 48 20 7b 25 64 3a 25 64 7d 25 73 22 2c 0a 20 20  H {%d:%d}%s",.  
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4e00: 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
4e10: 6f 6c 75 6d 6e 2c 20 7a 46 6c 67 73 29 3b 0a 20  olumn, zFlgs);. 
4e20: 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
4e30: 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
4e40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
4e50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4e60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4e70: 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
4e80: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
4e90: 77 42 61 72 65 45 78 70 72 4c 69 73 74 28 70 56  wBareExprList(pV
4ea0: 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  iew, pExpr->x.pL
4eb0: 69 73 74 2c 20 22 56 45 43 54 4f 52 22 29 3b 0a  ist, "VECTOR");.
4ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ed0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
4ee0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
4ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
4f00: 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
4f10: 20 22 53 45 4c 45 43 54 2d 43 4f 4c 55 4d 4e 20   "SELECT-COLUMN 
4f20: 25 64 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  %d", pExpr->iCol
4f30: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
4f40: 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
4f50: 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  t(pView, pExpr->
4f60: 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63 74  pLeft->x.pSelect
4f70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4f80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4f90: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
4fa0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4fb0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
4fc0: 69 65 77 2c 20 22 49 46 2d 4e 55 4c 4c 2d 52 4f  iew, "IF-NULL-RO
4fd0: 57 20 25 64 22 2c 20 70 45 78 70 72 2d 3e 69 54  W %d", pExpr->iT
4fe0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
4ff0: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
5000: 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70  (pView, pExpr->p
5010: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
5020: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5030: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5040: 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
5050: 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 6f 70  wLine(pView, "op
5060: 3d 25 64 22 2c 20 70 45 78 70 72 2d 3e 6f 70 29  =%d", pExpr->op)
5070: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5080: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
5090: 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  BinOp ){.    sql
50a0: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
50b0: 28 70 56 69 65 77 2c 20 22 25 73 25 73 22 2c 20  (pView, "%s%s", 
50c0: 7a 42 69 6e 4f 70 2c 20 7a 46 6c 67 73 29 3b 0a  zBinOp, zFlgs);.
50d0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
50e0: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
50f0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b  Expr->pLeft, 1);
5100: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
5110: 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
5120: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
5130: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
5140: 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  UniOp ){.    sql
5150: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
5160: 28 70 56 69 65 77 2c 20 22 25 73 25 73 22 2c 20  (pView, "%s%s", 
5170: 7a 55 6e 69 4f 70 2c 20 7a 46 6c 67 73 29 3b 0a  zUniOp, zFlgs);.
5180: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
5190: 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
51a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  Expr->pLeft, 0);
51b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 72  .  }.  sqlite3Tr
51c0: 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
51d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
51e0: 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
51f0: 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f  dable explanatio
5200: 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  n of an expressi
5210: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
5220: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
5230: 42 61 72 65 45 78 70 72 4c 69 73 74 28 0a 20 20  BareExprList(.  
5240: 54 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c  TreeView *pView,
5250: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  .  const ExprLis
5260: 74 20 2a 70 4c 69 73 74 2c 0a 20 20 63 6f 6e 73  t *pList,.  cons
5270: 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 0a 29  t char *zLabel.)
5280: 7b 0a 20 20 69 66 28 20 7a 4c 61 62 65 6c 3d 3d  {.  if( zLabel==
5290: 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b 30 5d 3d 3d  0 || zLabel[0]==
52a0: 30 20 29 20 7a 4c 61 62 65 6c 20 3d 20 22 4c 49  0 ) zLabel = "LI
52b0: 53 54 22 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ST";.  if( pList
52c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
52d0: 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
52e0: 56 69 65 77 2c 20 22 25 73 20 28 65 6d 70 74 79  View, "%s (empty
52f0: 29 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d  )", zLabel);.  }
5300: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
5310: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
5320: 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
5330: 22 25 73 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20  "%s", zLabel);. 
5340: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
5350: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
5360: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
5370: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  pList->a[i].u.x.
5380: 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20 20 20  iOrderByCol;.   
5390: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
53a0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
53b0: 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 6f  me;.      int mo
53c0: 72 65 54 6f 46 6f 6c 6c 6f 77 20 3d 20 69 3c 70  reToFollow = i<p
53d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 3b  List->nExpr - 1;
53e0: 0a 20 20 20 20 20 20 69 66 28 20 6a 20 7c 7c 20  .      if( j || 
53f0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
5400: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
5410: 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65  Push(pView, more
5420: 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 20 20 20  ToFollow);.     
5430: 20 20 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 20     moreToFollow 
5440: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
5450: 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
5460: 28 70 56 69 65 77 2c 20 30 29 3b 0a 20 20 20 20  (pView, 0);.    
5470: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
5480: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
5490: 74 66 28 73 74 64 6f 75 74 2c 20 22 41 53 20 25  tf(stdout, "AS %
54a0: 73 20 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  s ", zName);.   
54b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
54c0: 66 28 20 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( j ){.        
54d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
54e0: 2c 20 22 69 4f 72 64 65 72 42 79 43 6f 6c 3d 25  , "iOrderByCol=%
54f0: 64 22 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  d", j);.        
5500: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
5510: 66 28 73 74 64 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(stdout, "\n");
5520: 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28  .        fflush(
5530: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d  stdout);.      }
5540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
5550: 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
5560: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
5570: 78 70 72 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f  xpr, moreToFollo
5580: 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20  w);.      if( j 
5590: 7c 7c 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  || zName ){.    
55a0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
55b0: 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
55c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
55d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  .}.void sqlite3T
55e0: 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
55f0: 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70 56 69  .  TreeView *pVi
5600: 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70 72  ew,.  const Expr
5610: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20 75  List *pList,.  u
5620: 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c 0a  8 moreToFollow,.
5630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
5640: 61 62 65 6c 0a 29 7b 0a 20 20 70 56 69 65 77 20  abel.){.  pView 
5650: 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
5660: 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72  wPush(pView, mor
5670: 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71  eToFollow);.  sq
5680: 6c 69 74 65 33 54 72 65 65 56 69 65 77 42 61 72  lite3TreeViewBar
5690: 65 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  eExprList(pView,
56a0: 20 70 4c 69 73 74 2c 20 7a 4c 61 62 65 6c 29 3b   pList, zLabel);
56b0: 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  .  sqlite3TreeVi
56c0: 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a  ewPop(pView);.}.
56d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
56e0: 45 5f 44 45 42 55 47 20 2a 2f 0a                 E_DEBUG */.