/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact bbf00ee2b4412c7249baf0ba737ba6a93fe82e78:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 38 35 20  select.c,v 1.85 
0200: 32 30 30 32 2f 30 35 2f 32 35 20 30 30 3a 31 38  2002/05/25 00:18
0210: 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :21 drh Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41  eInt.h"../*.** A
0240: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0250: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0260: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0270: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0280: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0290: 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63  ect *sqliteSelec
02a0: 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73 74  tNew(.  ExprList
02b0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
02c0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
02d0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
02e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63   result */.  Src
02f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
0300: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0310: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0320: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0330: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0340: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0370: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0380: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0390: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
03a0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
03b0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
03c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
03d0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
03e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
03f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0400: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0410: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0420: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0430: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
0440: 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  nLimit,         
0450: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0460: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
0470: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  used */.  int nO
0480: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
0490: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
04a0: 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20 75    -1 means not u
04b0: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  sed */.){.  Sele
04c0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04e0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
04f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
0510: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
0520: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  st);.    sqliteS
0530: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72  rcListDelete(pSr
0540: 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  c);.    sqliteEx
0550: 70 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29  prDelete(pWhere)
0560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72  ;.    sqliteExpr
0570: 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75  ListDelete(pGrou
0580: 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
0590: 45 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69  ExprDelete(pHavi
05a0: 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  ng);.    sqliteE
05b0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f  xprListDelete(pO
05c0: 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73 65  rderBy);.  }else
05d0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69  {.    pNew->pELi
05e0: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
05f0: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
0600: 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  rc;.    pNew->pW
0610: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0620: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
0630: 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
0640: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
0650: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70  = pHaving;.    p
0660: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0670: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e  pOrderBy;.    pN
0680: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
0690: 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20   isDistinct;.   
06a0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
06b0: 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d  ELECT;.    pNew-
06c0: 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74  >nLimit = nLimit
06d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66 66  ;.    pNew->nOff
06e0: 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20  set = nOffset;. 
06f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
0710: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0720: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0730: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0740: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0750: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0760: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0770: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0780: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0790: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
07a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
07b0: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
07c0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
07d0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
07e0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
07f0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0800: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0810: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0820: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0830: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0840: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0850: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0860: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0870: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0880: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0890: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
08a0: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
08b0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
08c0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
08d0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
08e0: 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50 61  qliteJoinType(Pa
08f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0900: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0910: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0920: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0930: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0940: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0950: 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
0960: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
0970: 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20 20  ar *zKeyword;.  
0980: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 20    int nChar;.   
0990: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20 6b   int code;.  } k
09a0: 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20  eywords[] = {.  
09b0: 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37    { "natural", 7
09c0: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a  , JT_NATURAL },.
09d0: 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20      { "left",   
09e0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
09f0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72  UTER },.    { "r
0a00: 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52  ight",   5, JT_R
0a10: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0a20: 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20  .    { "full",  
0a30: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0a40: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0a50: 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c  ,.    { "outer",
0a60: 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d     5, JT_OUTER }
0a70: 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c  ,.    { "inner",
0a80: 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d     5, JT_INNER }
0a90: 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c  ,.    { "cross",
0aa0: 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d     5, JT_INNER }
0ab0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
0ac0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
0ad0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
0ae0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
0af0: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
0b00: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
0b10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0b20: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
0b30: 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28  r(j=0; j<sizeof(
0b40: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0b50: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a  (keywords[0]); j
0b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
0b70: 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d  ->n==keywords[j]
0b80: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
0b90: 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49    && sqliteStrNI
0ba0: 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  Cmp(p->z, keywor
0bb0: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0bc0: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0bd0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0be0: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0bf0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0c10: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0c20: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0c30: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0c40: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0c50: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
0c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0c70: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
0c80: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
0c90: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
0ca0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
0cb0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
0cc0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
0cd0: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
0ce0: 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75 6d  static Token dum
0cf0: 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a 20  my = { 0, 0 };. 
0d00: 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20     char *zSp1 = 
0d10: 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20 22  " ", *zSp2 = " "
0d20: 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20  ;.    if( pB==0 
0d30: 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b 20  ){ pB = &dummy; 
0d40: 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20 20  zSp1 = 0; }.    
0d50: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43 20  if( pC==0 ){ pC 
0d60: 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20 3d  = &dummy; zSp2 =
0d70: 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65   0; }.    sqlite
0d80: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
0d90: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
0da0: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
0db0: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
0dc0: 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41 2d  ", 0,.       pA-
0dd0: 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31 2c  >z, pA->n, zSp1,
0de0: 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e 6e   1, pB->z, pB->n
0df0: 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e 7a  , zSp2, 1, pC->z
0e00: 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  , pC->n, 0);.   
0e10: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
0e20: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
0e30: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
0e40: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
0e50: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
0e60: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
0e70: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
0e80: 67 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  g, .      "RIGHT
0e90: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
0ea0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
0eb0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
0ec0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
0ed0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0ee0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
0ef0: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
0f00: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
0f10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0f20: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
0f30: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
0f40: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
0f50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
0f60: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
0f70: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
0f80: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
0f90: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
0fa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0fb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
0fc0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
0fd0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
0fe0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
0ff0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1000: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1010: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1020: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1030: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
1040: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
1050: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1060: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1070: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1080: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1090: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
10a0: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
10b0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
10c0: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
10d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10e0: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
10f0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1100: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1110: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1120: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1130: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1140: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1150: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1160: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1180: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
1190: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
11a0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f  ssion */.){.  To
11b0: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70  ken dummy;.  Exp
11c0: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
11d0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
11e0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
11f0: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
1200: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c    dummy.z = zCol
1210: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1220: 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 70 45  rlen(zCol);.  pE
1230: 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  1a = sqliteExpr(
1240: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
1250: 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  mmy);.  pE2a = s
1260: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
1270: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1280: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1290: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
12a0: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
12b0: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
12c0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
12d0: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
12e0: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
12f0: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b2->zName;.  dum
1300: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
1310: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d  mmy.z);.  pE2b =
1320: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
1330: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1340: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
1350: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
1360: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
1370: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78 70  pE2c = sqliteExp
1380: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  r(TK_DOT, pE2b, 
1390: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
13a0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 45   sqliteExpr(TK_E
13b0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
13c0: 29 3b 0a 20 20 69 66 28 20 2a 70 70 45 78 70 72  );.  if( *ppExpr
13d0: 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20   ){.    *ppExpr 
13e0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
13f0: 41 4e 44 2c 20 2a 70 70 45 78 70 72 2c 20 70 45  AND, *ppExpr, pE
1400: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1410: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 45 3b     *ppExpr = pE;
1420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1430: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
1440: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
1450: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
1460: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1470: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
1480: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
1490: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
14a0: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
14b0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
14c0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
14d0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
14e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
14f0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rms..**.** This 
1500: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1510: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1520: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
1530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1540: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
1550: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1560: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
1570: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1580: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72 63  int i, j;.  pSrc
1590: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f   = p->pSrc;.  fo
15a0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
15b0: 53 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  Src-1; i++){.   
15c0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
15d0: 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  item *pTerm = &p
15e0: 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  Src->a[i];.    s
15f0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1600: 65 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 53  em *pOther = &pS
1610: 72 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20  rc->a[i+1];..   
1620: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61 62   if( pTerm->pTab
1630: 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70  ==0 || pOther->p
1640: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
1650: 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  e;..    /* When 
1660: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
1670: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
1680: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
1690: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
16a0: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
16b0: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
16c0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
16d0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
16e0: 28 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70  ( pTerm->jointyp
16f0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
1700: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1710: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Tab;.      if( p
1720: 54 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65  Term->pOn || pTe
1730: 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  rm->pUsing ){.  
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
1750: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
1760: 45 72 72 4d 73 67 2c 20 22 61 20 4e 41 54 55 52  ErrMsg, "a NATUR
1770: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
1780: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
1790: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
17a0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
17b0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
17c0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72  Err++;.        r
17d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
17e0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
17f0: 65 72 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  erm->pTab;.     
1800: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1810: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1820: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
1830: 49 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54  Index(pOther->pT
1840: 61 62 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  ab, pTab->aCol[j
1850: 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  ].zName)>=0 ){. 
1860: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
1870: 65 54 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c  eTerm(pTab->aCol
1880: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c  [j].zName, pTab,
1890: 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 26   pOther->pTab, &
18a0: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
18b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
18d0: 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64  llow both ON and
18e0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69   USING clauses i
18f0: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a  n the same join.
1900: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1910: 54 65 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65  Term->pOn && pTe
1920: 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  rm->pUsing ){.  
1930: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
1940: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
1950: 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 68 61  rMsg, "cannot ha
1960: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
1970: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
1980: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
1990: 61 6d 65 20 6a 6f 69 6e 22 2c 20 30 29 3b 0a 20  ame join", 0);. 
19a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
19b0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
19c0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
19d0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
19e0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
19f0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1a00: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
1a10: 79 0a 20 20 20 20 2a 2a 20 61 6e 64 20 41 4e 44  y.    ** and AND
1a20: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
1a30: 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
1a40: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
1a50: 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29  ( p->pWhere==0 )
1a60: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1a70: 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e 70 4f 6e  ere = pTerm->pOn
1a80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a90: 20 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65         p->pWhere
1aa0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
1ab0: 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c  _AND, p->pWhere,
1ac0: 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b   pTerm->pOn, 0);
1ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ae0: 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  Term->pOn = 0;. 
1af0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
1b00: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
1b10: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
1b20: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
1b30: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
1b40: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
1b50: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
1b60: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
1b70: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
1b80: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
1b90: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
1ba0: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
1bb0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
1bc0: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
1bd0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
1be0: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
1bf0: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
1c00: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
1c10: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
1c20: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
1c30: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
1c40: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
1c50: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
1c60: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
1c70: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
1c80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c90: 54 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  Term->pUsing ){.
1ca0: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
1cb0: 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ist;.      int j
1cc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cd0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29  i<pSrc->nSrc-1 )
1ce0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
1cf0: 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20  pTerm->pUsing;. 
1d00: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1d10: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
1d20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1d30: 6c 75 6d 6e 49 6e 64 65 78 28 70 54 65 72 6d 2d  lumnIndex(pTerm-
1d40: 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  >pTab, pList->a[
1d50: 69 5d 2e 7a 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20  i].zName)<0 ||. 
1d60: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
1d70: 6e 49 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70  nIndex(pOther->p
1d80: 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Tab, pList->a[i]
1d90: 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20  .zName)<0 ){.   
1da0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
1db0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
1dc0: 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74  zErrMsg, "cannot
1dd0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
1de0: 6d 6e 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mn ",.          
1df0: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
1e00: 61 6d 65 2c 20 22 20 2d 20 63 6f 6c 75 6d 6e 20  ame, " - column 
1e10: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
1e20: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  oth tables", 0);
1e30: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1e40: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
1e50: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e70: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 4c   addWhereTerm(pL
1e80: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
1e90: 20 70 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f   pTerm->pTab, pO
1ea0: 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e  ther->pTab, &p->
1eb0: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
1ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ed0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1ee0: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
1ef0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
1f00: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
1f10: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
1f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65  */.void sqliteSe
1f30: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
1f40: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
1f50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
1f60: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
1f70: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
1f80: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
1f90: 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20  lete(p->pSrc);. 
1fa0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
1fb0: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
1fc0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
1fd0: 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  lete(p->pGroupBy
1fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44  );.  sqliteExprD
1ff0: 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69 6e 67  elete(p->pHaving
2000: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c  );.  sqliteExprL
2010: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72  istDelete(p->pOr
2020: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
2030: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
2040: 70 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74  pPrior);.  sqlit
2050: 65 46 72 65 65 28 70 2d 3e 7a 53 65 6c 65 63 74  eFree(p->zSelect
2060: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2070: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  p);.}../*.** Del
2080: 65 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ete the aggregat
2090: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
20a0: 6f 6d 20 74 68 65 20 70 61 72 73 65 20 73 74 72  om the parse str
20b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
20c0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67  c void sqliteAgg
20d0: 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28  regateInfoReset(
20e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
2100: 72 73 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50  rse->aAgg);.  pP
2110: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a  arse->aAgg = 0;.
2120: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
2130: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73   0;.  pParse->us
2140: 65 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eAgg = 0;.}../*.
2150: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2160: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
2170: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
2180: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
2190: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
21a0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  CT..**.** The pE
21b0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20  List is used to 
21c0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  determine the va
21d0: 6c 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  lues for each co
21e0: 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 72  lumn in the.** r
21f0: 65 73 75 6c 74 20 72 6f 77 2e 20 20 45 78 63 65  esult row.  Exce
2200: 70 74 20 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e  pt  if pEList==N
2210: 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20 6a 75 73  ULL, then we jus
2220: 74 20 72 65 61 64 20 6e 43 6f 6c 75 6d 6e 0a 2a  t read nColumn.*
2230: 2a 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20  * elements from 
2240: 74 68 65 20 73 72 63 54 61 62 20 74 61 62 6c 65  the srcTab table
2250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2260: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
2270: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2280: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2290: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
22a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
22b0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
22c0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
22d0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
22e0: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2300: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
2310: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2320: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
2330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2340: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2350: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
2360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2370: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
2380: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
2390: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
23a0: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
23b0: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
23c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
23d0: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
23e0: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
23f0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
2420: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
2430: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
2440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2450: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2460: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
2470: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
2480: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
2490: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
24a0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
24b0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
24c0: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
24d0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
24e0: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
24f0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
2500: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
2510: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2520: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 76 3d   int i;.  if( v=
2530: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
2540: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
2550: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
2560: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69  .  */.  if( pELi
2570: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
2580: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
2590: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
25a0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
25b0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
25c0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
25d0: 7d 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  }.    nColumn = 
25e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
25f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
2600: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
2610: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
2620: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
2630: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
2640: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
2650: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
2660: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
2670: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
2680: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2690: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
26a0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
26b0: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
26c0: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
26d0: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
26e0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
26f0: 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74  /.  if( distinct
2700: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  >=0 ){.    int l
2710: 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  bl = sqliteVdbeM
2720: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2730: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2740: 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
2750: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31  pEList->nExpr, 1
2760: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2770: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73  eAddOp(v, OP_Dis
2780: 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c  tinct, distinct,
2790: 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74   lbl);.    sqlit
27a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
27b0: 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  _Pop, pEList->nE
27c0: 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  xpr+1, 0);.    s
27d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
27e0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
27f0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
2800: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
2810: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
2820: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2830: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
2840: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
2850: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2860: 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74  _PutStrKey, dist
2870: 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  inct, 0);.  }.. 
2880: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2890: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
28a0: 73 65 2c 20 74 68 65 6e 20 73 74 6f 72 65 20 74  se, then store t
28b0: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
28c0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 0a 20 20 2a  in a sorter..  *
28d0: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
28e0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
28f0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 73 71  ortOrder;.    sq
2900: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2910: 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65 63 2c   OP_SortMakeRec,
2920: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
2930: 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73    zSortOrder = s
2940: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72  qliteMalloc( pOr
2950: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
2960: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 6f 72   );.    if( zSor
2970: 74 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75  tOrder==0 ) retu
2980: 72 6e 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 1;.    for(i=
2990: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
29a0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
29b0: 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20    zSortOrder[i] 
29c0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
29d0: 2e 73 6f 72 74 4f 72 64 65 72 20 3f 20 27 2d 27  .sortOrder ? '-'
29e0: 20 3a 20 27 2b 27 3b 0a 20 20 20 20 20 20 73 71   : '+';.      sq
29f0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
2a00: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2a10: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2a20: 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72  }.    zSortOrder
2a30: 5b 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  [pOrderBy->nExpr
2a40: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
2a50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2a60: 5f 53 6f 72 74 4d 61 6b 65 4b 65 79 2c 20 70 4f  _SortMakeKey, pO
2a70: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30  rderBy->nExpr, 0
2a80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2a90: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
2aa0: 20 7a 53 6f 72 74 4f 72 64 65 72 2c 20 73 74 72   zSortOrder, str
2ab0: 6c 65 6e 28 7a 53 6f 72 74 4f 72 64 65 72 29 29  len(zSortOrder))
2ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2ad0: 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  (zSortOrder);.  
2ae0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2af0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c  p(v, OP_SortPut,
2b00: 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   0, 0);.  }else 
2b10: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d  ..  /* In this m
2b20: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
2b30: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
2b40: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
2b50: 65 6d 70 6f 72 61 72 79 0a 20 20 2a 2a 20 74 61  emporary.  ** ta
2b60: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a  ble iParm..  */.
2b70: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
2b80: 5f 55 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71  _Union ){.    sq
2b90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2ba0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2bb0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
2bc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2bd0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 69  (v, OP_String, i
2be0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
2bf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2c00: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69   OP_PutStrKey, i
2c10: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Parm, 0);.  }els
2c20: 65 20 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  e ..  /* Store t
2c30: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
2c40: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
2c50: 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   key..  */.  if(
2c60: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
2c70: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
2c80: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
2c90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2ca0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
2cb0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
2cc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2cd0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
2ce0: 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  no, iParm, 0);. 
2cf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2d00: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
2d10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2d20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2d30: 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d  PutIntKey, iParm
2d40: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a  , 0);.  }else ..
2d50: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
2d60: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
2d70: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
2d80: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
2d90: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
2da0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
2db0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
2dc0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
2dd0: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
2de0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
2df0: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
2e00: 3d 53 52 54 5f 45 78 63 65 70 74 20 29 7b 0a 20  =SRT_Except ){. 
2e10: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
2e20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2e30: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2e40: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
2e50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2e60: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
2e70: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
2e80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
2e90: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
2ea0: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
2eb0: 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 49 66 20  }else ..  /* If 
2ec0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
2ed0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
2ee0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
2ef0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
2f00: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
2f10: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
2f20: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
2f30: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
2f40: 0a 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20  .  ** item into 
2f50: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
2f60: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
2f70: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
2f80: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
2f90: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
2fa0: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
2fb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2fc0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
2fd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2fe0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
2ff0: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
3000: 20 7d 65 6c 73 65 20 0a 0a 0a 20 20 2f 2a 20 49   }else ...  /* I
3010: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
3020: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
3030: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
3040: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
3050: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
3060: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
3070: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
3080: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
3090: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63  t.  ** of the sc
30a0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
30b0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
30c0: 65 6d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  em ){.    assert
30d0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
30e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
30f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
3100: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
3110: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3120: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
3130: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 65 6c  , iBreak);.  }el
3140: 73 65 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  se..  /* If none
3150: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 73   of the above, s
3160: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
3170: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
3180: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a  ction..  */.  {.
3190: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
31a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
31b0: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 69 42 72  ck, nColumn, iBr
31c0: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eak);.  }.  retu
31d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
31e0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
31f0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
3200: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
3210: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
3220: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
3230: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
3240: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
3250: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
3260: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
3270: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
3280: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
3290: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
32a0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
32b0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
32c0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
32d0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
32e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
32f0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
3300: 69 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  il(Vdbe *v, int 
3310: 6e 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20  nColumn){.  int 
3320: 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65  end = sqliteVdbe
3330: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
3340: 69 6e 74 20 61 64 64 72 3b 0a 20 20 73 71 6c 69  int addr;.  sqli
3350: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3360: 50 5f 53 6f 72 74 2c 20 30 2c 20 30 29 3b 0a 20  P_Sort, 0, 0);. 
3370: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
3380: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
3390: 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 29 3b  rtNext, 0, end);
33a0: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
33b0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43 61 6c  Op(v, OP_SortCal
33c0: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
33d0: 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  end);.  sqliteVd
33e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
33f0: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
3400: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
3410: 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a  eLabel(v, end);.
3420: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3430: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65  p(v, OP_SortRese
3440: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
3450: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
3460: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
3470: 74 68 65 20 56 44 42 45 20 68 6f 77 20 6d 61 6e  the VDBE how man
3480: 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 72 65 0a  y columns there.
3490: 2a 2a 20 61 72 65 20 69 6e 20 74 68 65 20 72 65  ** are in the re
34a0: 73 75 6c 74 20 61 6e 64 20 74 68 65 20 6e 61 6d  sult and the nam
34b0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
34c0: 6e 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  n.  This informa
34d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
34e0: 74 6f 20 70 72 6f 76 69 64 65 20 22 61 72 67 63  to provide "argc
34f0: 22 20 61 6e 64 20 22 61 7a 43 6f 6c 5b 5d 22 20  " and "azCol[]" 
3500: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
3510: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
3520: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
3530: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
3540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3550: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3560: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  ext */.  int bas
3570: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
3580: 56 44 42 45 20 63 75 72 73 6f 72 20 63 6f 72 72  VDBE cursor corr
3590: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66 69 72  esponding to fir
35a0: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 54 61 62  st entry in pTab
35b0: 4c 69 73 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  List */.  SrcLis
35c0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
35d0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
35e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
35f0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
3600: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
3610: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
3620: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3630: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3640: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
3650: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
3660: 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73  Set || v==0 || s
3670: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
3680: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
3690: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
36a0: 53 65 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  Set = 1;.  sqlit
36b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
36c0: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45  _ColumnCount, pE
36d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
36e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
36f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3700: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
3710: 20 20 20 20 69 6e 74 20 73 68 6f 77 46 75 6c 6c      int showFull
3720: 4e 61 6d 65 73 3b 0a 20 20 20 20 69 66 28 20 70  Names;.    if( p
3730: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
3740: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
3750: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
3760: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
3770: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3780: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
3790: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
37a0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
37b0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
37c0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
37d0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
37e0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  e;.    }.    p =
37f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
3800: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
3810: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
3820: 20 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20    showFullNames 
3830: 3d 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  = (pParse->db->f
3840: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
3850: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
3860: 20 20 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e      if( p->span.
3870: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
3880: 5d 20 26 26 20 21 73 68 6f 77 46 75 6c 6c 4e 61  ] && !showFullNa
3890: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  mes ){.      int
38a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
38b0: 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c  beAddOp(v,OP_Col
38c0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
38d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
38e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
38f0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
3900: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  an.n);.      sql
3910: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
3920: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
3930: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
3940: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
3950: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
3960: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
3970: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e   pTabList->a[p->
3980: 69 54 61 62 6c 65 20 2d 20 62 61 73 65 5d 2e 70  iTable - base].p
3990: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
39a0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
39b0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
39c0: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  mn;.      if( iC
39d0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
39e0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
39f0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
3a00: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
3a10: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
3a20: 29 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  ) );.      zCol 
3a30: 3d 20 69 43 6f 6c 3c 30 20 3f 20 22 5f 52 4f 57  = iCol<0 ? "_ROW
3a40: 49 44 5f 22 20 3a 20 70 54 61 62 2d 3e 61 43 6f  ID_" : pTab->aCo
3a50: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
3a60: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
3a70: 74 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 73 68 6f  t->nSrc>1 || sho
3a80: 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  wFullNames ){.  
3a90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3aa0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
3ab0: 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20  har *zTab;. .   
3ac0: 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62       zTab = pTab
3ad0: 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c  List->a[p->iTabl
3ae0: 65 20 2d 20 62 61 73 65 5d 2e 7a 41 6c 69 61 73  e - base].zAlias
3af0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68  ;.        if( sh
3b00: 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  owFullNames || z
3b10: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
3b20: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
3b30: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
3b40: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61  ring(&zName, zTa
3b50: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29  b, ".", zCol, 0)
3b60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3b70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3b80: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30  ColumnName, i, 0
3b90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3ba0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
3bb0: 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c   -1, zName, strl
3bc0: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  en(zName));.    
3bd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
3be0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
3bf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3c00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3c10: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
3c20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3c30: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
3c40: 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20 30 29 3b  v, -1, zCol, 0);
3c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
3c60: 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a  se if( p->span.z
3c70: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
3c80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
3c90: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
3ca0: 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e  ddOp(v,OP_Column
3cb0: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
3cc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
3cd0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
3ce0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
3cf0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
3d00: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
3d10: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
3d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
3d30: 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20  r zName[30];.   
3d40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
3d50: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
3d60: 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  TabList==0 );.  
3d70: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d      sprintf(zNam
3d80: 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  e, "column%d", i
3d90: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
3da0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3db0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
3dc0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
3dd0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3de0: 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  -1, zName, strle
3df0: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  n(zName));.    }
3e00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  .  }.}../*.** Na
3e10: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
3e20: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
3e30: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
3e40: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
3e50: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
3e60: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
3e70: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
3e80: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
3e90: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
3ea0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
3eb0: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
3ec0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
3ed0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
3ee0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
3ef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
3f00: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
3f10: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
3f20: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
3f30: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
3f40: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
3f50: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3f60: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  z;.}../*.** Give
3f70: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
3f80: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
3f90: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
3fa0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
3fb0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
3fc0: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
3fd0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
3fe0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
3ff0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
4000: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
4010: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
4020: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
4030: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ab;.  int i;.  E
4040: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
4050: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 66 69  .  static int fi
4060: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
4070: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
4080: 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  ..  if( fillInCo
4090: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
40a0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
40b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
40c0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61   pTab = sqliteMa
40d0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
40e0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
40f0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
4100: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
4110: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
4120: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
4130: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
4140: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
4150: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
4160: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
4170: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
4180: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
4190: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
41a0: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
41b0: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
41c0: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
41d0: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ol );.  for(i=0;
41e0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
41f0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
4200: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
4210: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
4220: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
4230: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
4240: 74 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d  teStrDup(pEList-
4250: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
4260: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70    }else if( (p=p
4270: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
4280: 72 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d  r)->span.z && p-
4290: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
42a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
42b0: 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c  ring(&pTab->aCol
42c0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70  [i].zName, p->sp
42d0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c  an.z, p->span.n,
42e0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   0);.    }else i
42f0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
4300: 20 26 26 20 70 2d 3e 70 52 69 67 68 74 20 26 26   && p->pRight &&
4310: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
4320: 6e 2e 7a 20 26 26 0a 20 20 20 20 20 20 20 20 20  n.z &&.         
4330: 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b    p->pRight->tok
4340: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
4350: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4360: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
4370: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
4380: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74      p->pRight->t
4390: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68  oken.z, p->pRigh
43a0: 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  t->token.n, 0);.
43b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
43c0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
43d0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
43e0: 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  uf, "column%d", 
43f0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62  i+1);.      pTab
4400: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20  ->aCol[i].zName 
4410: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
4420: 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
4430: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
4440: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
4450: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  b;.}../*.** For 
4460: 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
4470: 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74   statement, do t
4480: 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a  hree things..**.
4490: 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20  **    (1)  Fill 
44a0: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
44b0: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
44c0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
44d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
44e0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74   defines the set
44f0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
4500: 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65  should be scanne
4510: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  d. .**.**    (2)
4520: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
4530: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4540: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
4550: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
4560: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
4570: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
4580: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
4590: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
45a0: 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74  *    (3)  Scan t
45b0: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
45c0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
45d0: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
45e0: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
45f0: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
4600: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
4610: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
4620: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
4630: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
4640: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
4650: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
4660: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
4670: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
4680: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
4690: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
46a0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
46b0: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
46c0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
46d0: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
46e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
46f0: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
4700: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
4710: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
4720: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
4730: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
4740: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
4750: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
4760: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
4770: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
4780: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
4790: 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70   *pTab;..  if( p
47a0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
47b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
47c0: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
47d0: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
47e0: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
47f0: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
4800: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
4810: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
4820: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
4830: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
4840: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
4850: 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20  >a[i].pTab ){.  
4860: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
4870: 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
4880: 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  re!  No need to 
4890: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20  continue */.    
48a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
48b0: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
48c0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
48d0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
48e0: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
48f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
4900: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
4910: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
4920: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
4930: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
4940: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
4950: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
4960: 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e       char zFakeN
4970: 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20  ame[60];.       
4980: 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61   sprintf(zFakeNa
4990: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  me, "sqlite_subq
49a0: 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20  uery_%p_",.     
49b0: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61        (void*)pTa
49c0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
49d0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ect);.        sq
49e0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
49f0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
4a00: 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c  lias, zFakeName,
4a10: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4a20: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
4a30: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
4a40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
4a50: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
4a60: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
4a70: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a  t->a[i].zAlias,.
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
4ab0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
4ac0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
4ad0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
4ae0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
4af0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
4b00: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20  ansient = 1;.   
4b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
4b20: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
4b30: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
4b40: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
4b50: 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  se */.      pTab
4b60: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
4b70: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
4b80: 20 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c    sqliteFindTabl
4b90: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
4ba0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
4bb0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
4bc0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
4bd0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4be0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4bf0: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
4c00: 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  le: ", .        
4c10: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
4c20: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
4c30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4c40: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
4c50: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
4c60: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
4c70: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
4c80: 20 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77    if( sqliteView
4c90: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
4ca0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
4cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4cc0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
4cd0: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
4ce0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
4cf0: 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 70  qliteSelectDup(p
4d00: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
4d10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4d20: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
4d30: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
4d40: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
4d50: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
4d60: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
4d70: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
4d80: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
4d90: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
4da0: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
4db0: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
4dc0: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
4dd0: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
4de0: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
4df0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
4e00: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
4e10: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
4e20: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
4e30: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
4e40: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
4e50: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
4e60: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
4e70: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
4e80: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
4e90: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
4ea0: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
4eb0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
4ec0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4ed0: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
4ee0: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
4ef0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
4f00: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
4f10: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
4f20: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
4f30: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
4f40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
4f50: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
4f60: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
4f70: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
4f80: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
4f90: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
4fa0: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
4fb0: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
4fc0: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
4fd0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
4fe0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
4ff0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
5000: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
5010: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
5020: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
5030: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
5040: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
5050: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
5060: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
5070: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
5080: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
5090: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
50a0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
50b0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
50c0: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
50d0: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
50e0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
50f0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
5100: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
5110: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
5120: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
5130: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
5140: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
5150: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
5160: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
5170: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
5180: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
5190: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
51a0: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
51b0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
51c0: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
51d0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
51e0: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
51f0: 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
5200: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
5210: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
5220: 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
5230: 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
5240: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
5250: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
5260: 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
5270: 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
5280: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
5290: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
52a0: 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
52b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
52c0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70  pNew = sqliteExp
52d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
52e0: 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29  , a[k].pExpr, 0)
52f0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
5300: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
5310: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
5320: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  ame;.        a[k
5330: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
5340: 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
5350: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
5360: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
5370: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
5380: 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
5390: 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
53a0: 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
53b0: 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
53c0: 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
53d0: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
53e0: 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
53f0: 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
5400: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e         Token *pN
5410: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
5420: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
5430: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
5440: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
5450: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
5460: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
5470: 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65  pName = &pE->pLe
5480: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
5490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
54a0: 20 20 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20      pName = 0;. 
54b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
54c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
54d0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
54e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
54f0: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
5500: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
5510: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
5520: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69  TabName = pTabLi
5530: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b  st->a[i].zAlias;
5540: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
5550: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
5560: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
5570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
5580: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
5590: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
55a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
55b0: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
55c0: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
55d0: 5b 30 5d 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  [0]==0 ||.      
55e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
55f0: 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e  StrNICmp(pName->
5600: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61  z, zTabName, pNa
5610: 6d 65 2d 3e 6e 29 21 3d 30 29 20 29 7b 0a 20 20  me->n)!=0) ){.  
5620: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
5630: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
5640: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
5650: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
5660: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
5670: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
5680: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
5690: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
56a0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
56b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
56c0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
56d0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
56e0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
56f0: 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   (pTabList->a[i-
5700: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
5710: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  columnIndex(pTab
5740: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61  List->a[i-1].pTa
5750: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5770: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
5780: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
5790: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
57a0: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
57b0: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
57c0: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
57d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
57e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
57f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
5800: 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49 64   i>0 && sqliteId
5810: 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c 69  ListIndex(pTabLi
5820: 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e  st->a[i-1].pUsin
5830: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
5860: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
5870: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
5880: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
5890: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
58a0: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
58b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
58c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
58d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
58e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
58f0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
5900: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
5910: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
5920: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
5930: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
5940: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
5950: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b  token.z = zName;
5960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
5970: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  ght->token.n = s
5980: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
5990: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
59a0: 61 62 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  abName ){.      
59b0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
59c0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
59d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
59e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
59f0: 65 66 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eft==0 ) break;.
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
5a10: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  eft->token.z = z
5a20: 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  TabName;.       
5a30: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
5a40: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
5a50: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
5a60: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
5a70: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f  sqliteExpr(TK_DO
5a80: 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
5a90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
5aa0: 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
5ab0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5ac0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5ad0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
5ae0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
5af0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
5b00: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
5b10: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
5b20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
5b30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72  New = sqliteExpr
5b40: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
5b50: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
5b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5b70: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
5b80: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
5b90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
5ba0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ame!=0 );.      
5bb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
5bc0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
5bd0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
5be0: 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 20 0a 20  table: ", -1, . 
5bf0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65             pName
5c00: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
5c10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
5c20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
5c30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5c40: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
5c50: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
5c60: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
5c70: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
5c80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
5c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
5ca0: 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20  rsively unlinks 
5cb0: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e  the Select.pSrc.
5cc0: 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72  a[].pTab pointer
5cd0: 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74  s.** in a select
5ce0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
5cf0: 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f  just sets the po
5d00: 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20  inters to NULL. 
5d10: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5d20: 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e   is recursive in
5d30: 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
5d40: 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  if the Select.pS
5d50: 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a  rc.a[].pSelect.*
5d60: 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  * pointer is not
5d70: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74   NULL, this rout
5d80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
5d90: 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61  cursively on tha
5da0: 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  t pointer..**.**
5db0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5dc0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53   called on the S
5dd0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
5de0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a  that defines a.*
5df0: 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20  * VIEW in order 
5e00: 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64  to undo any bind
5e10: 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20  ings to tables. 
5e20: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
5e30: 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  ry.** because th
5e40: 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74  ose tables might
5e50: 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20   be DROPed by a 
5e60: 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63  subsequent SQL c
5e70: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ommand..*/.void 
5e80: 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69  sqliteSelectUnbi
5e90: 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  nd(Select *p){. 
5ea0: 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
5eb0: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
5ec0: 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  c;.  Table *pTab
5ed0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
5ee0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
5ef0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
5f00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  i++){.    if( (p
5f10: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  Tab = pSrc->a[i]
5f20: 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20  .pTab)!=0 ){.   
5f30: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
5f40: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
5f50: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
5f60: 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a  Table(0, pTab);.
5f70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
5f80: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 72 63 2d  lectDelete(pSrc-
5f90: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
5fa0: 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
5fb0: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  i].pSelect = 0;.
5fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
5fd0: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  rc->a[i].pTab = 
5fe0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  0;.      if( pSr
5ff0: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  c->a[i].pSelect 
6000: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6010: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  eSelectUnbind(pS
6020: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
6030: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6040: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6050: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63  is routine assoc
6060: 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e  iates entries in
6070: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
6080: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74  ression list wit
6090: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  h.** columns in 
60a0: 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65  a result.  For e
60b0: 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70  ach ORDER BY exp
60c0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63  ression, the opc
60d0: 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  ode of.** the to
60e0: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
60f0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
6100: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f  LUMN and the iCo
6110: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  lumn value of.**
6120: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
6130: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  ode is filled in
6140: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d   with column num
6150: 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62  ber and the iTab
6160: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  le.** value of t
6170: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
6180: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
6190: 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65   iTable paramete
61a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  r..**.** If ther
61b0: 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45  e are prior SELE
61c0: 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79  CT clauses, they
61d0: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
61e0: 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a  irst.  A match.*
61f0: 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20  * in an earlier 
6200: 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65  SELECT takes pre
6210: 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c  cedence over a l
6220: 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ater SELECT..**.
6230: 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61  ** Any entry tha
6240: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
6250: 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61   is flagged as a
6260: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75  n error.  The nu
6270: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
6280: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
6290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
62a0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
62b0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
62c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
62d0: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
62e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
62f0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
6300: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
6310: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
6320: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
6330: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
6340: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
6350: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
6360: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
6370: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
6380: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
6390: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
63a0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
63b0: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
63c0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
63d0: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
63e0: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
63f0: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
6400: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
6410: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
6420: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
6430: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
6440: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
6450: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
6460: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
6470: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
6480: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
6490: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
64a0: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
64b0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
64c0: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e    }.  if( fillIn
64d0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
64e0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
64f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
6500: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
6510: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
6520: 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  ( matchOrderbyTo
6530: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
6540: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20  Select->pPrior, 
6550: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
6560: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
6570: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
6580: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
6590: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
65a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
65b0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
65c0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
65d0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
65e0: 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 6d  pExpr;.    int m
65f0: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 66  atch = 0;.    if
6600: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
6610: 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  .done ) continue
6620: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
6630: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
6640: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
6650: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
6660: 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54  me && (pE->op==T
6670: 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d  K_ID || pE->op==
6680: 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20  TK_STRING) ){.  
6690: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
66a0: 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  e, *zLabel;.    
66b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
66c0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
66d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
66e0: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20  pE->token.z );. 
66f0: 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20         zLabel = 
6700: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
6710: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74  ->token.z, pE->t
6720: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  oken.n);.       
6730: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
6740: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
6750: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
6760: 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29  p(zName, zLabel)
6770: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
6780: 20 20 6d 61 74 63 68 20 3d 20 31 3b 20 0a 20 20    match = 1; .  
6790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
67a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65  sqliteFree(zLabe
67b0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
67c0: 20 20 69 66 28 20 6d 61 74 63 68 3d 3d 30 20 26    if( match==0 &
67d0: 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70  & sqliteExprComp
67e0: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
67f0: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
6800: 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31         match = 1
6810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6820: 69 66 28 20 6d 61 74 63 68 20 29 7b 0a 20 20 20  if( match ){.   
6830: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
6840: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
6850: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a   pE->iColumn = j
6860: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54  ;.        pE->iT
6870: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
6880: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
6890: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
68a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
68b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
68c0: 20 69 66 28 20 21 6d 61 74 63 68 20 26 26 20 6d   if( !match && m
68d0: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
68e0: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33       char zBuf[3
68f0: 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  0];.      sprint
6900: 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b 31 29  f(zBuf,"%d",i+1)
6910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
6920: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
6930: 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44 45 52  >zErrMsg, "ORDER
6940: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
6950: 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20 20 20  ", zBuf, .      
6960: 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74    " does not mat
6970: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
6980: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20  lumn", 0);.     
6990: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
69a0: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
69b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
69c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
69d0: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
69e0: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
69f0: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
6a00: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
6a10: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
6a20: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
6a30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6a40: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
6a50: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
6a60: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
6a70: 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62  be *sqliteGetVdb
6a80: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
6a90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6aa0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
6ab0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
6ac0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6ad0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65   = sqliteVdbeCre
6ae0: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
6af0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
6b00: 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  .}.    ../*.** T
6b10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6b20: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
6b30: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73   a query that is
6b40: 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f   really the unio
6b50: 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63  n.** or intersec
6b60: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d  tion of two or m
6b70: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
6b80: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
6b90: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
6ba0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
6bb0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44  elect *p, int eD
6bc0: 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b  est, int iParm){
6bd0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
6be0: 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73         /* Succes
6bf0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
6c00: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
6c10: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
6c20: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
6c30: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
6c40: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
6c50: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
6c60: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
6c70: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
6c80: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  BE */.  int base
6c90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
6ca0: 61 73 65 6c 69 6e 65 20 76 61 6c 75 65 20 66 6f  aseline value fo
6cb0: 72 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2a  r pParse->nTab *
6cc0: 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  /..  /* Make sur
6cd0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
6ce0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
6cf0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
6d00: 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20 2a 2a 20   Only the .  ** 
6d10: 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74  last SELECT in t
6d20: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
6d30: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  ve an ORDER BY..
6d40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
6d50: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
6d60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50  ) return 1;.  pP
6d70: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
6d80: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
6d90: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
6da0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
6db0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
6dc0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
6dd0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
6de0: 74 65 72 20 22 2c 0a 20 20 20 20 20 20 73 65 6c  ter ",.      sel
6df0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
6e00: 2c 20 22 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c  , " not before",
6e10: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
6e20: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
6e30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
6e40: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
6e50: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
6e60: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
6e70: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
6e80: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
6e90: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
6ea0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
6eb0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
6ec0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
6ed0: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
6ee0: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
6ef0: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
6f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
6f10: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
6f20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6f30: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
6f40: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65  arm, 0);.    eDe
6f50: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
6f60: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
6f70: 73 20 74 68 65 20 55 4e 49 4f 4e 20 6f 72 20 49  s the UNION or I
6f80: 4e 54 45 52 53 45 43 54 49 4f 4e 0a 20 20 2a 2f  NTERSECTION.  */
6f90: 0a 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65  .  base = pParse
6fa0: 2d 3e 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68  ->nTab;.  switch
6fb0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
6fc0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20 20 20  ase TK_ALL:.    
6fd0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
6fe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
6ff0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
7000: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
7010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
7020: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
7030: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
7040: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
7050: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
7060: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
7070: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
7080: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
7090: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
70a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
70b0: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
70c0: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
70d0: 6c 65 63 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  lects */..      
70e0: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
70f0: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
7100: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
7110: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
7120: 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
7130: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
7140: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
7150: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
7160: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
7170: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
7180: 69 67 68 74 2e 20 20 54 68 69 73 20 61 6c 73 6f  ight.  This also
7190: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 6e 6f   means we are no
71a0: 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
71b0: 20 73 65 6c 65 63 74 20 61 6e 64 20 73 6f 0a 20   select and so. 
71c0: 20 20 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e         ** we can
71d0: 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  not have an ORDE
71e0: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
71f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
7200: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
7210: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7220: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
7230: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7240: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
7250: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
7260: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
7270: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
7280: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7290: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
72a0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
72b0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
72c0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
72d0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
72e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20   p->pOrderBy .  
72f0: 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72        && matchOr
7300: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
7310: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
7320: 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  erBy, unionTab, 
7330: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
7340: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7350: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7360: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  p->op!=TK_ALL ){
7370: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7380: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7390: 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e  _OpenTemp, union
73a0: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
73b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
73c0: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
73d0: 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  ta, unionTab, 1)
73e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
73f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7410: 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e  _OpenTemp, union
7420: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
7430: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7440: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
7450: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
7460: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
7470: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
7480: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
7490: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69  rse, pPrior, pri
74a0: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  orOp, unionTab, 
74b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
74c0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
74d0: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  rc;..      /* Co
74e0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
74f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
7500: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
7510: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
7520: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
7530: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
7540: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
7550: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
7560: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
7570: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
7580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7590: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
75a0: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
75b0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
75c0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
75d0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ior = 0;.      r
75e0: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
75f0: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
7600: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
7610: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
7620: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
7630: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
7640: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
7650: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
7660: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
7670: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
7680: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
7690: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
76a0: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
76b0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
76c0: 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65    .      if( eDe
76d0: 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
76e0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
76f0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
7700: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7710: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
7720: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
7730: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
7740: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
7750: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
7760: 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c  pParse, p->base,
7770: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
7780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7790: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
77a0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
77b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
77c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
77d0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
77e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
77f0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
7800: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
7810: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
7820: 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  rt = sqliteVdbeC
7830: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
7840: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
7850: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
7860: 73 65 2c 20 30 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, 0, unionTab,
7870: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
7880: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
78b0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
78e0: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
78f0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
7900: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
7910: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
7920: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
7930: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7950: 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
7960: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
7970: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
7980: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
7990: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
79a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
79b0: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
79c0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
79d0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
79e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
79f0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20  rateSortTail(v, 
7a00: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
7a10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7a20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7a30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7a40: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
7a50: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
7a60: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
7a70: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
7a80: 69 53 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 2f  iStart;..      /
7a90: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
7aa0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
7ab0: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
7ac0: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
7ad0: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
7ae0: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
7af0: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
7b00: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
7b10: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
7b20: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
7b30: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
7b40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
7b50: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
7b60: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
7b70: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
7b80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
7b90: 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72  derBy && matchOr
7ba0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
7bb0: 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72  arse,p,p->pOrder
7bc0: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
7bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7bf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7c00: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
7c10: 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  b1, 1);.      sq
7c20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7c30: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
7c40: 61 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ab1, 1);..      
7c50: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
7c60: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
7c70: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
7c80: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
7c90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
7ca0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
7cb0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52  arse, pPrior, SR
7cc0: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30  T_Union, tab1, 0
7cd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
7ce0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7cf0: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  c;..      /* Cod
7d00: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
7d10: 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
7d20: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
7d30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7d40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7d50: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
7d60: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
7d70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7d80: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
7d90: 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20   tab2, 1);.     
7da0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
7db0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7dc0: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
7dd0: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
7de0: 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b2, 0, 0, 0);.  
7df0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
7e00: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
7e10: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7e20: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
7e30: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
7e40: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
7e50: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
7e60: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
7e70: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
7e80: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
7e90: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
7ea0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
7eb0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
7ec0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
7ed0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
7ee0: 2c 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70 2d  , p->base, 0, p-
7ef0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
7f00: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
7f10: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
7f20: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
7f30: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
7f40: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
7f50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7f60: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
7f70: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
7f80: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
7f90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7fa0: 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20  (v, OP_FullKey, 
7fb0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
7fc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7fd0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
7fe0: 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  tab2, iCont);.  
7ff0: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
8000: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
8010: 20 30 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c   0, tab1, p->pEL
8020: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
8050: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
8060: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
8090: 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eak);.      if( 
80a0: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
80b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
80c0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
80d0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
80e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
80f0: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
8100: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
8110: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
8120: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
8130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8140: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
8150: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
8160: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8170: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
8180: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
8190: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
81a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
81b0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20  rateSortTail(v, 
81c0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
81d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
81e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
81f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
8200: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
8210: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
8220: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
8230: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
8240: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
8250: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
8260: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
8270: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
8280: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
8290: 20 6f 66 20 22 2c 0a 20 20 20 20 20 20 73 65 6c   of ",.      sel
82a0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
82b0: 2c 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  , " do not have 
82c0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
82d0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
82e0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  s", 0);.    pPar
82f0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8300: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
8310: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62  pParse->nTab = b
8320: 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ase;.  return 0;
8330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8340: 69 76 65 6c 79 20 73 63 61 6e 20 74 68 72 6f 75  ively scan throu
8350: 67 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  gh an expression
8360: 20 74 72 65 65 2e 20 20 46 6f 72 20 65 76 65 72   tree.  For ever
8370: 79 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  y reference.** t
8380: 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  o a column in ta
8390: 62 6c 65 20 6e 75 6d 62 65 72 20 69 46 72 6f 6d  ble number iFrom
83a0: 2c 20 63 68 61 6e 67 65 20 74 68 61 74 20 72 65  , change that re
83b0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
83c0: 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 6e  * same column in
83d0: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
83e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
83f0: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 45  d changeTables(E
8400: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
8410: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
8420: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
8430: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
8440: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
8450: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
8460: 54 61 62 6c 65 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Table==iFrom ){.
8470: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8480: 65 20 3d 20 69 54 6f 3b 0a 20 20 7d 65 6c 73 65  e = iTo;.  }else
8490: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 76 6f 69  {.    static voi
84a0: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e  d changeTablesIn
84b0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 20  List(ExprList*, 
84c0: 69 6e 74 2c 20 69 6e 74 29 3b 0a 20 20 20 20 63  int, int);.    c
84d0: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70  hangeTables(pExp
84e0: 72 2d 3e 70 4c 65 66 74 2c 20 69 46 72 6f 6d 2c  r->pLeft, iFrom,
84f0: 20 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e 67   iTo);.    chang
8500: 65 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70  eTables(pExpr->p
8510: 52 69 67 68 74 2c 20 69 46 72 6f 6d 2c 20 69 54  Right, iFrom, iT
8520: 6f 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61  o);.    changeTa
8530: 62 6c 65 73 49 6e 4c 69 73 74 28 70 45 78 70 72  blesInList(pExpr
8540: 2d 3e 70 4c 69 73 74 2c 20 69 46 72 6f 6d 2c 20  ->pList, iFrom, 
8550: 69 54 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  iTo);.  }.}.stat
8560: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61  ic void changeTa
8570: 62 6c 65 73 49 6e 4c 69 73 74 28 45 78 70 72 4c  blesInList(ExprL
8580: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
8590: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
85a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
85b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
85c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
85d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
85e0: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
85f0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
8600: 70 72 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b  pr, iFrom, iTo);
8610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8620: 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
8630: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8640: 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
8650: 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
8660: 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
8670: 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
8680: 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
8690: 79 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  y of the corresp
86a0: 6f 6e 64 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20  onding.** entry 
86b0: 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
86c0: 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
86d0: 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
86e0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
86f0: 67 65 64 2e 29 20 20 57 68 65 6e 20 6d 61 6b 69  ged.)  When maki
8700: 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  ng a copy of an 
8710: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
8720: 4c 69 73 74 2c 20 63 68 61 6e 67 65 0a 2a 2a 20  List, change.** 
8730: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
8740: 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69  lumns in table i
8750: 53 75 62 20 69 6e 74 6f 20 72 65 66 65 72 65 6e  Sub into referen
8760: 63 65 73 20 74 6f 20 74 61 62 6c 65 20 69 54 61  ces to table iTa
8770: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
8780: 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
8790: 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
87a0: 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
87b0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
87c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
87d0: 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
87e0: 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
87f0: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
8800: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
8810: 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
8820: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
8830: 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
8840: 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
8850: 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
8860: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
8870: 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
8880: 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
8890: 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
88a0: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
88b0: 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
88c0: 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
88d0: 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
88e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
88f0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
8900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
8910: 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45  bstExpr(Expr *pE
8920: 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  xpr, int iTable,
8930: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8940: 74 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a 20 20  t, int iSub){.  
8950: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
8960: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
8970: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
8980: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
8990: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 45  le==iTable && pE
89a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
89b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
89c0: 77 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  w;.    assert( p
89d0: 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
89e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
89f0: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
8a00: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
8a10: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
8a20: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
8a30: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
8a40: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c  ;.    pNew = pEL
8a50: 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
8a60: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
8a70: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
8a80: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
8a90: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
8aa0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
8ab0: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
8ac0: 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
8ad0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
8ae0: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
8af0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
8b00: 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
8b10: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
8b20: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29  Dup(pNew->pList)
8b30: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
8b40: 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
8b50: 6c 65 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  le;.    pExpr->i
8b60: 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
8b70: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 45 78 70  Column;.    pExp
8b80: 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e  r->iAgg = pNew->
8b90: 69 41 67 67 3b 0a 20 20 20 20 70 45 78 70 72 2d  iAgg;.    pExpr-
8ba0: 3e 74 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 74  >token = pNew->t
8bb0: 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 69 53  oken;.    if( iS
8bc0: 75 62 21 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  ub!=iTable ){.  
8bd0: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
8be0: 28 70 45 78 70 72 2c 20 69 53 75 62 2c 20 69 54  (pExpr, iSub, iT
8bf0: 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  able);.    }.  }
8c00: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
8c10: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
8c20: 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
8c30: 74 2c 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 29  t,ExprList*,int)
8c40: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
8c50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
8c60: 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53  able, pEList, iS
8c70: 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ub);.    substEx
8c80: 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  pr(pExpr->pRight
8c90: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
8ca0: 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62  , iSub);.    sub
8cb0: 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
8cc0: 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
8cd0: 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a   pEList, iSub);.
8ce0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
8cf0: 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73 74  d .substExprList
8d00: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
8d10: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
8d20: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
8d30: 69 6e 74 20 69 53 75 62 29 7b 0a 20 20 69 6e 74  int iSub){.  int
8d40: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
8d50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
8d60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
8d70: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8d80: 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73    substExpr(pLis
8d90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
8da0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69  Table, pEList, i
8db0: 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Sub);.  }.}../*.
8dc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8dd0: 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
8de0: 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
8df0: 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
8e00: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
8e10: 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
8e20: 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
8e30: 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
8e40: 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
8e50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
8e60: 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
8e70: 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
8e80: 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
8e90: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
8ea0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
8eb0: 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
8ec0: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
8ed0: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
8ee0: 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
8ef0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
8f00: 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
8f10: 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
8f20: 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
8f30: 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
8f40: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
8f50: 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
8f60: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
8f70: 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
8f80: 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
8f90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
8fa0: 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
8fb0: 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
8fc0: 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
8fd0: 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
8fe0: 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
8ff0: 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
9000: 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
9010: 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
9020: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
9030: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
9040: 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
9050: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
9060: 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
9070: 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
9080: 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
9090: 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
90a0: 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
90b0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
90c0: 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
90d0: 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
90e0: 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
90f0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
9100: 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
9110: 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
9120: 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
9130: 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
9140: 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
9150: 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
9160: 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
9170: 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
9180: 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
9190: 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
91a0: 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
91b0: 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
91c0: 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
91d0: 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
91e0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
91f0: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
9200: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
9210: 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
9220: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
9230: 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
9240: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
9250: 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
9260: 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
9270: 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
9280: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
9290: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
92a0: 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
92b0: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
92c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ..**.**   (4)  T
92d0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
92e0: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
92f0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
9300: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
9310: 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
9320: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
9330: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
9340: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
9350: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
9360: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
9370: 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
9380: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
9390: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
93a0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
93b0: 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
93c0: 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
93d0: 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
93e0: 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
93f0: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
9400: 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
9410: 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
9420: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
9430: 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
9440: 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
9450: 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
9460: 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
9470: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
9480: 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
9490: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
94a0: 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
94b0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
94c0: 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
94d0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
94e0: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
94f0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
9500: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9510: 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
9520: 75 72 6e 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  urn 0..** If fla
9530: 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
9540: 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
9550: 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
9560: 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
9570: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
9580: 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
9590: 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
95a0: 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
95b0: 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
95c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
95d0: 73 2e 0a 2a 2f 0a 69 6e 74 20 66 6c 61 74 74 65  s..*/.int flatte
95e0: 6e 53 75 62 71 75 65 72 79 28 53 65 6c 65 63 74  nSubquery(Select
95f0: 20 2a 70 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20   *p, int iFrom, 
9600: 69 6e 74 20 69 73 41 67 67 2c 20 69 6e 74 20 73  int isAgg, int s
9610: 75 62 71 75 65 72 79 49 73 41 67 67 29 7b 0a 20  ubqueryIsAgg){. 
9620: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
9630: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
9640: 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
9650: 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
9660: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
9670: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
9680: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
9690: 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
96a0: 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
96b0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
96c0: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
96d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
96e0: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
96f0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9700: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
9710: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
9720: 20 69 50 61 72 65 6e 74 2c 20 69 53 75 62 3b 0a   iParent, iSub;.
9730: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a    Expr *pWhere;.
9740: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
9750: 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
9760: 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
9770: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
9780: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
9790: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
97a0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
97b0: 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
97c0: 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
97d0: 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
97e0: 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e  .  pSub = pSrc->
97f0: 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74  a[iFrom].pSelect
9800: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
9810: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
9820: 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
9830: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
9840: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
9850: 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
9860: 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  c>1 ) return 0;.
9870: 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
9880: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
9890: 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69  ( pSubSrc );.  i
98a0: 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
98b0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
98c0: 20 20 69 66 28 20 70 53 75 62 2d 3e 69 73 44 69    if( pSub->isDi
98d0: 73 74 69 6e 63 74 20 26 26 20 70 53 72 63 2d 3e  stinct && pSrc->
98e0: 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
98f0: 30 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69  0;.  if( pSub->i
9900: 73 44 69 73 74 69 6e 63 74 20 26 26 20 69 73 41  sDistinct && isA
9910: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  gg ) return 0;. 
9920: 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e   if( p->isDistin
9930: 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49 73  ct && subqueryIs
9940: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
9950: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
9960: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
9970: 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
9980: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
9990: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d 74 68  or the.  ** i-th
99a0: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
99b0: 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
99c0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
99d0: 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
99e0: 2d 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d 3b 0a  ->base + iFrom;.
99f0: 20 20 69 53 75 62 20 3d 20 70 53 75 62 2d 3e 62    iSub = pSub->b
9a00: 61 73 65 3b 0a 20 20 73 75 62 73 74 45 78 70 72  ase;.  substExpr
9a10: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
9a20: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
9a30: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
9a40: 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  pList = p->pELis
9a50: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
9a60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
9a70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  +){.    if( pLis
9a80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
9a90: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
9aa0: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
9ab0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
9ac0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
9ad0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
9ae0: 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  up(pExpr->span.z
9af0: 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
9b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9b10: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
9b20: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
9b30: 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
9b40: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
9b50: 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73   iSub);.    subs
9b60: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
9b70: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
9b80: 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a  >pEList, iSub);.
9b90: 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c    }.  substExprL
9ba0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
9bb0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
9bc0: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
9bd0: 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
9be0: 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
9bf0: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
9c00: 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
9c10: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
9c20: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68  iSub ){.      ch
9c30: 61 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72  angeTables(pWher
9c40: 65 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74  e, iSub, iParent
9c50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9c60: 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
9c70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
9c80: 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
9c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
9ca0: 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
9cb0: 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
9cc0: 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
9cd0: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
9ce0: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
9cf0: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
9d00: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
9d10: 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53  Sub);.    if( pS
9d20: 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20  ub->pHaving ){. 
9d30: 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69       Expr *pHavi
9d40: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ng = sqliteExprD
9d50: 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
9d60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61  );.      if( iPa
9d70: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
9d80: 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c        changeTabl
9d90: 65 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62  es(pHaving, iSub
9da0: 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , iParent);.    
9db0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
9dc0: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
9dd0: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
9de0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
9df0: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
9e00: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
9e10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e20: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
9e30: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
9e40: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9e50: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
9e60: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
9e70: 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  pBy = sqliteExpr
9e80: 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47  ListDup(pSub->pG
9e90: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28  roupBy);.    if(
9ea0: 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29   iParent!=iSub )
9eb0: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
9ec0: 62 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47  blesInList(p->pG
9ed0: 72 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50  roupBy, iSub, iP
9ee0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
9ef0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68  }else if( p->pWh
9f00: 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ere==0 ){.    p-
9f10: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
9f20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9f30: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
9f40: 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
9f50: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
9f60: 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65  ;.    if( pWhere
9f70: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68   ){.      p->pWh
9f80: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
9f90: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
9fa0: 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  re, pWhere, 0);.
9fb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69      }.  }.  p->i
9fc0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
9fd0: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
9fe0: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  b->isDistinct;. 
9ff0: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 46 72   if( pSrc->a[iFr
a000: 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53 72 63  om].pTab && pSrc
a010: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  ->a[iFrom].pTab-
a020: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
a030: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
a040: 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61  Table(0, pSrc->a
a050: 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20  [iFrom].pTab);. 
a060: 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46 72   }.  pSrc->a[iFr
a070: 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53 75 62 53  om].pTab = pSubS
a080: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
a090: 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70   pSubSrc->a[0].p
a0a0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 53 72 63 2d  Tab = 0;.  pSrc-
a0b0: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63  >a[iFrom].pSelec
a0c0: 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 30  t = pSubSrc->a[0
a0d0: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 53 75  ].pSelect;.  pSu
a0e0: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  bSrc->a[0].pSele
a0f0: 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ct = 0;.  sqlite
a100: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
a110: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
a120: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
a130: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
a140: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
a150: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
a160: 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
a170: 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
a180: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
a190: 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
a1a0: 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
a1b0: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
a1c0: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
a1d0: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
a1e0: 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
a1f0: 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
a200: 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
a210: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
a220: 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
a230: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
a240: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
a250: 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
a260: 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
a270: 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
a280: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
a290: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
a2a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
a2b0: 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
a2c0: 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
a2d0: 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
a2e0: 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
a2f0: 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
a300: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
a310: 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
a320: 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
a330: 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
a340: 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
a350: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
a360: 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
a370: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
a380: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
a390: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
a3a0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
a3b0: 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
a3c0: 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
a3d0: 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
a3e0: 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
a3f0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
a400: 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
a410: 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
a420: 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53 65   as for sqliteSe
a430: 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74  lect()..** See t
a440: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
a450: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
a460: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
a470: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
a480: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
a490: 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
a4a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
a4b0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
a4c0: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
a4d0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
a4e0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c  int iCol;.  Tabl
a4f0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
a500: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61   *pIdx;.  int ba
a510: 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  se;.  Vdbe *v;. 
a520: 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 69   int openOp;.  i
a530: 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74  nt seekOp;.  int
a540: 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73   cont;.  ExprLis
a550: 74 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  t eList;.  struc
a560: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a570: 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a  eListItem;..  /*
a580: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a590: 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61   this query is a
a5a0: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
a5b0: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52   max() query.  R
a5c0: 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20  eturn.  ** zero 
a5d0: 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20  if it is  not.. 
a5e0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   */.  if( p->pGr
a5f0: 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76  oupBy || p->pHav
a600: 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65  ing || p->pWhere
a610: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
a620: 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  f( p->pSrc->nSrc
a630: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
a640: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
a650: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
a660: 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20  rn 0;.  pExpr = 
a670: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
a680: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
a690: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
a6a0: 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
a6b0: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
a6c0: 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 78  >pList==0 || pEx
a6d0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
a6e0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
a6f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
a700: 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
a710: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
a720: 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
a730: 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
a740: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
a750: 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
a760: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
a770: 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  eStrNICmp(pExpr-
a780: 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
a790: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
a7a0: 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  Op = OP_Last;.  
a7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
a7c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
a7d0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
a7e0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
a7f0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
a800: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
a810: 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
a820: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
a830: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
a840: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
a850: 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72  If we get to her
a860: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  e, it means the 
a870: 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20  query is of the 
a880: 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20  correct form..  
a890: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
a8a0: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e   sure we have an
a8b0: 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20   index and make 
a8c0: 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  pIdx point to th
a8d0: 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61  e.  ** appropria
a8e0: 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  te index.  If th
a8f0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
a900: 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45   is on an INTEGE
a910: 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b  R PRIMARY.  ** k
a920: 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e  ey column, no in
a930: 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79  dex is necessary
a940: 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20   so set pIdx to 
a950: 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a  NULL.  If no.  *
a960: 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69  * usable index i
a970: 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  s found, return 
a980: 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43  0..  */.  if( iC
a990: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78  ol<0 ){.    pIdx
a9a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a9b0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
a9c0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
a9d0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
a9e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a9f0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
aa00: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
aa10: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
aa20: 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a  ==iCol ) break;.
aa30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
aa40: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  dx==0 ) return 0
aa50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
aa60: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
aa70: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
aa80: 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  using the callba
aa90: 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
aaa0: 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
aab0: 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
aac0: 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
aad0: 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
aae0: 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  l..  */.  v = sq
aaf0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
ab00: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
ab10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ab20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
ab30: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
ab40: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ab50: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
ab60: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
ab70: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
ab80: 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   Generating code
ab90: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e   to find the min
aba0: 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61   or the max.  Ba
abb0: 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68  sically all we h
abc0: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
abd0: 73 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  s find the first
abe0: 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74   or the last ent
abf0: 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e  ry in the chosen
ac00: 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a   index.  If.  **
ac10: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
ac20: 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e  x() is on the IN
ac30: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ac40: 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65  Y, then find the
ac50: 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c   first.  ** or l
ac60: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
ac70: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a   main table..  *
ac80: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
ac90: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
aca0: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
acb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
acc0: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
acd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ace0: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
acf0: 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62  okie, pParse->db
ad00: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
ad10: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
ad20: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
ad30: 3d 20 31 3b 0a 20 20 7d 0a 20 20 6f 70 65 6e 4f  = 1;.  }.  openO
ad40: 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70  p = pTab->isTemp
ad50: 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20   ? OP_OpenAux : 
ad60: 4f 50 5f 4f 70 65 6e 3b 0a 20 20 62 61 73 65 20  OP_Open;.  base 
ad70: 3d 20 70 2d 3e 62 61 73 65 3b 0a 20 20 73 71 6c  = p->base;.  sql
ad80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ad90: 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2c 20 70 54  openOp, base, pT
ada0: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
adb0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
adc0: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
add0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
ade0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
adf0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
ae00: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
ae10: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
ae20: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
ae30: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
ae40: 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e  , base+1, pIdx->
ae50: 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
ae60: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
ae70: 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
ae80: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
ae90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
aea0: 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
aeb0: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
aec0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
aed0: 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73  OP_IdxRecno, bas
aee0: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
aef0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
af00: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
af10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
af20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af30: 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29  MoveTo, base, 0)
af40: 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45  ;.  }.  eList.nE
af50: 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65  xpr = 1;.  memse
af60: 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c  t(&eListItem, 0,
af70: 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65   sizeof(eListIte
af80: 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d  m));.  eList.a =
af90: 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65   &eListItem;.  e
afa0: 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20  List.a[0].pExpr 
afb0: 3d 20 70 45 78 70 72 3b 0a 20 20 63 6f 6e 74 20  = pExpr;.  cont 
afc0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
afd0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 65 6c 65  Label(v);.  sele
afe0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
aff0: 73 65 2c 20 26 65 4c 69 73 74 2c 20 62 61 73 65  se, &eList, base
b000: 2c 20 31 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 1, 0, -1, eDes
b010: 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
b020: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56  cont);.  sqliteV
b030: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b040: 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
b050: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b060: 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30  P_Close, base, 0
b070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
b080: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
b090: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69   code for the gi
b0a0: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
b0b0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
b0c0: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
b0d0: 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f  ributed in vario
b0e0: 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e  us ways dependin
b0f0: 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  g on the.** valu
b100: 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69  e of eDest and i
b110: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
b120: 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20  eDest Value     
b130: 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
b180: 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
b190: 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
b1a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
b1b0: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
b1c0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
b1d0: 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
b1e0: 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
b1f0: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  in memory cell i
b200: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
b210: 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
b220: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
b230: 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20  keys of a table 
b240: 77 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72  with cursor iPar
b250: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
b260: 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
b270: 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
b280: 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
b290: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
b2a0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
b2b0: 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
b2c0: 65 73 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20  esults form the 
b2d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b2e0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
b2f0: 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
b300: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
b310: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
b320: 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
b330: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
b340: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
b350: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
b360: 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
b370: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
b380: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
b390: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
b3a0: 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
b3b0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
b3c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b3d0: 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
b3e0: 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
b3f0: 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
b400: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
b410: 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
b420: 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
b430: 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
b440: 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
b450: 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
b460: 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
b470: 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
b480: 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
b490: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
b4a0: 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
b4b0: 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
b4c0: 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
b4d0: 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
b4e0: 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
b4f0: 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
b500: 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
b510: 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
b520: 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
b530: 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
b540: 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
b550: 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
b560: 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
b570: 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
b580: 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
b590: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
b5a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 65  .*/.int sqliteSe
b5b0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
b5c0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
b5d0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
b5e0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
b5f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b600: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
b610: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
b620: 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
b630: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
b640: 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20 53 52 54    /* One of: SRT
b650: 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d 20 53 65  _Callback Mem Se
b660: 74 20 55 6e 69 6f 6e 20 45 78 63 65 70 74 20 2a  t Union Except *
b670: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
b680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
b690: 76 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68 69  ve result in thi
b6a0: 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
b6b0: 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 53  n, if >=0 */.  S
b6c0: 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
b6d0: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
b6e0: 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
b6f0: 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
b700: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
b710: 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
b720: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
b730: 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
b740: 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
b750: 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20  nt *pParentAgg  
b760: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b770: 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
b780: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b790: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
b7a0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
b7b0: 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
b7c0: 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30  .  int isAgg = 0
b7d0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
b7e0: 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
b7f0: 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
b800: 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
b810: 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
b820: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
b830: 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
b840: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
b850: 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
b860: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
b870: 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
b880: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
b890: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
b8a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
b8b0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
b8c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
b8d0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
b8e0: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
b8f0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
b900: 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
b910: 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
b920: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
b930: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
b940: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
b950: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
b960: 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
b970: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
b980: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
b990: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b9a0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
b9b0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
b9c0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
b9d0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
b9e0: 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
b9f0: 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
ba00: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b  t */.  int base;
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba20: 20 46 69 72 73 74 20 63 75 72 73 6f 72 20 61 76   First cursor av
ba30: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
ba40: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
ba60: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
ba70: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
ba80: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  n */..  if( sqli
ba90: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
baa0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
bab0: 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72   || p==0 ) retur
bac0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  n 1;..  /* If th
bad0: 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
bae0: 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
baf0: 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
bb00: 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
bb10: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
bb20: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
bb30: 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
bb40: 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
bb50: 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  arm);.  }..  /* 
bb60: 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
bb70: 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
bb80: 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
bb90: 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
bba0: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
bbb0: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
bbc0: 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  ere;.  pOrderBy 
bbd0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
bbe0: 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
bbf0: 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
bc00: 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
bc10: 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
bc20: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  p->isDistinct;..
bc30: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
bc40: 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45 20 63 75  block of VDBE cu
bc50: 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f 72 20 65  rsors, one for e
bc60: 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
bc70: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
bc80: 2a 2a 20 54 68 65 20 57 48 45 52 45 20 70 72 6f  ** The WHERE pro
bc90: 63 65 73 73 69 6e 67 20 72 65 71 75 69 72 65 73  cessing requires
bca0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
bcb0: 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73  s for the tables
bcc0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 46 52 4f   in the.  ** FRO
bcd0: 4d 20 63 6c 61 75 73 65 20 62 65 20 63 6f 6e 73  M clause be cons
bce0: 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  ecutive..  */.  
bcf0: 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65 20 3d  base = p->base =
bd00: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
bd10: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
bd20: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
bd30: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
bd40: 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
bd50: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
bd60: 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
bd70: 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
bd80: 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
bd90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
bda0: 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
bdb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
bdc0: 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
bdd0: 64 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  d;..  /* Look up
bde0: 20 65 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20   every table in 
bdf0: 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61  the table list a
be00: 6e 64 20 63 72 65 61 74 65 20 61 6e 20 61 70 70  nd create an app
be10: 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 63 6f  ropriate.  ** co
be20: 6c 75 6d 6e 6c 69 73 74 20 69 6e 20 70 45 4c 69  lumnlist in pELi
be30: 73 74 20 69 66 20 74 68 65 72 65 20 69 73 6e 27  st if there isn'
be40: 74 20 6f 6e 65 20 61 6c 72 65 61 64 79 2e 20 20  t one already.  
be50: 28 54 68 65 20 70 61 72 73 65 72 20 6c 65 61 76  (The parser leav
be60: 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c 20 69  es.  ** a NULL i
be70: 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20  n the p->pEList 
be80: 69 66 20 74 68 65 20 53 51 4c 20 73 61 69 64 20  if the SQL said 
be90: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e  "SELECT * FROM .
bea0: 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ..").  */.  if( 
beb0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
bec0: 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
bed0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
bee0: 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65  nd;.  }.  pWhere
bef0: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
bf00: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
bf10: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
bf20: 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
bf30: 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
bf40: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
bf50: 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
bf60: 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
bf70: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
bf80: 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
bf90: 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74   */.  if( (eDest
bfa0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
bfb0: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
bfc0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
bfd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
bfe0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
bff0: 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61  zErrMsg, "only a
c000: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
c010: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
c020: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
c030: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
c040: 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20 30 29   expression", 0)
c050: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
c060: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  rr++;.    goto s
c070: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
c080: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
c090: 20 69 67 6e 6f 72 65 64 20 69 66 20 77 65 20 61   ignored if we a
c0a0: 72 65 20 6e 6f 74 20 73 65 6e 64 69 6e 67 20 74  re not sending t
c0b0: 68 65 20 72 65 73 75 6c 74 20 74 6f 20 61 20 63  he result to a c
c0c0: 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  allback..  */.  
c0d0: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 43  if( eDest!=SRT_C
c0e0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  allback ){.    p
c0f0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
c100: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
c110: 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
c120: 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
c130: 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
c140: 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
c150: 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
c160: 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
c170: 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
c180: 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
c190: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
c1a0: 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
c1b0: 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
c1c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
c1d0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
c1e0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
c1f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
c200: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
c210: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
c220: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
c230: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
c240: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
c250: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
c260: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
c270: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
c280: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
c290: 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67  .pExpr, 1, &isAg
c2a0: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
c2b0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
c2c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68   }.  }.  if( pWh
c2d0: 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ere ){.    if( s
c2e0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
c2f0: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
c300: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
c310: 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20  st, pWhere) ){. 
c320: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
c330: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
c340: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
c350: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65  eck(pParse, pWhe
c360: 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  re, 0, 0) ){.   
c370: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
c380: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
c390: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
c3a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c3b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
c3c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
c3d0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
c3e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
c3f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
c400: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
c410: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c420: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
c430: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20  se->zErrMsg, .  
c440: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
c450: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73  R BY expressions
c460: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
c470: 6f 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20  onstant", 0);.  
c480: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
c490: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f  rr++;.        go
c4a0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
c4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c4c0: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
c4d0: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
c4e0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
c4f0: 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
c500: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
c510: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
c520: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
c530: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
c540: 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
c550: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
c560: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c570: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
c580: 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
c590: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
c5a0: 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
c5b0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
c5c0: 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61  pE = pGroupBy->a
c5d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
c5e0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
c5f0: 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
c600: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
c610: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
c620: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
c630: 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20           "GROUP 
c640: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73  BY expressions s
c650: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e  hould not be con
c660: 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20  stant", 0);.    
c670: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
c680: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ++;.        goto
c690: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
c6a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
c6b0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
c6c0: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
c6d0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
c6e0: 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  st, pE) ){.     
c6f0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
c700: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
c710: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
c720: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
c730: 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
c740: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
c750: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c760: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c770: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69  pHaving ){.    i
c780: 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
c790: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
c7a0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
c7b0: 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52 4f  >zErrMsg, "a GRO
c7c0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
c7d0: 72 65 71 75 69 72 65 64 20 22 0a 20 20 20 20 20  required ".     
c7e0: 20 20 20 20 22 62 65 66 6f 72 65 20 48 41 56 49      "before HAVI
c7f0: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  NG", 0);.      p
c800: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
c810: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
c820: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
c830: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
c840: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
c850: 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c   base, pTabList,
c860: 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67   pEList, pHaving
c870: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c880: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c890: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
c8a0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
c8b0: 2c 20 70 48 61 76 69 6e 67 2c 20 69 73 41 67 67  , pHaving, isAgg
c8c0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  , 0) ){.      go
c8d0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
c8e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
c8f0: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65  heck for the spe
c900: 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d  cial case of a m
c910: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
c920: 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66  nction by itself
c930: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  .  ** in the res
c940: 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ult set..  */.  
c950: 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  if( simpleMinMax
c960: 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
c970: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29   eDest, iParm) )
c980: 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
c990: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
c9a0: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  d;.  }..  /* Beg
c9b0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
c9c0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
c9d0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
c9e0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
c9f0: 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
ca00: 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
ca10: 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
ca20: 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
ca30: 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ing in the callb
ca40: 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
ca50: 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
ca60: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
ca70: 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
ca80: 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
ca90: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ll..  */.  if( e
caa0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
cab0: 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
cac0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
cad0: 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
cae0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
caf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
cb00: 74 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f  the limiter.  */
cb10: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  .  if( p->nLimit
cb20: 3c 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f  <=0 ){.    p->nO
cb30: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  ffset = 0;.  }el
cb40: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  se{.    if( p->n
cb50: 4f 66 66 73 65 74 3c 30 20 29 20 70 2d 3e 6e 4f  Offset<0 ) p->nO
cb60: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73  ffset = 0;.    s
cb70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cb80: 2c 20 4f 50 5f 4c 69 6d 69 74 2c 20 70 2d 3e 6e  , OP_Limit, p->n
cb90: 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4f 66 66 73 65  Limit, p->nOffse
cba0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  t);.  }..  /* Ge
cbb0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
cbc0: 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
cbd0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
cbe0: 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  se.  */.  for(i=
cbf0: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
cc00: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
cc10: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
cc20: 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
cc30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
cc40: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
cc50: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
cc60: 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65  .pSelect, SRT_Te
cc70: 6d 70 54 61 62 6c 65 2c 20 62 61 73 65 2b 69 2c  mpTable, base+i,
cc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc90: 20 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b    p, i, &isAgg);
cca0: 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
ccb0: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
ccc0: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
ccd0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
cce0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
ccf0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
cd00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
cd10: 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
cd20: 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
cd30: 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
cd40: 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
cd50: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
cd60: 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20  Distinct;.  }.. 
cd70: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
cd80: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
cd90: 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
cda0: 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
cdb0: 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
cdc0: 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
cdd0: 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
cde0: 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
cdf0: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
ce00: 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
ce10: 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
ce20: 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
ce30: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
ce40: 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
ce50: 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69  , *pParentAgg, i
ce60: 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28  sAgg) ){.    if(
ce70: 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e   isAgg ) *pParen
ce80: 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65  tAgg = 1;.    re
ce90: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cea0: 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
ceb0: 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
cec0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
ced0: 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
cee0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
cef0: 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
cf00: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
cf10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cf20: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
cf30: 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 0);.  }..  /*
cf40: 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
cf50: 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70  of aggregate exp
cf60: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
cf70: 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
cf80: 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
cf90: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  );.  if( isAgg )
cfa0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
cfb0: 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b  arse->nAgg==0 );
cfc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cfd0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cfe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
cff0: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
d000: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
d010: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
d020: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
d030: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
d040: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
d050: 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
d060: 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
d070: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
d080: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d090: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
d0a0: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
d0b0: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72  ates(pParse, pGr
d0c0: 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
d0d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
d0e0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
d0f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d100: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d110: 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69   pHaving && sqli
d120: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
d130: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
d140: 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
d150: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
d160: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
d170: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
d180: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
d190: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
d1a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d1b0: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
d1c0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
d1d0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
d1e0: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
d1f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
d200: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
d210: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
d230: 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a   the aggregator.
d240: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
d250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
d260: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
d270: 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73  gReset, 0, pPars
d280: 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f  e->nAgg);.    fo
d290: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
d2a0: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
d2b0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
d2c0: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46  c;.      if( (pF
d2d0: 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  unc = pParse->aA
d2e0: 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20  gg[i].pFunc)!=0 
d2f0: 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c  && pFunc->xFinal
d300: 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
d310: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d320: 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c  p(v, OP_AggInit,
d330: 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   0, i);.        
d340: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
d350: 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P3(v, -1, (char*
d360: 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54  )pFunc, P3_POINT
d370: 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ER);.      }.   
d380: 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75   }.    if( pGrou
d390: 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
d3a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d3b0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d3c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d3d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d3e0: 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30 29  _AggFocus, 0, 0)
d3f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d400: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d410: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
d420: 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
d430: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
d440: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
d450: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
d460: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
d470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d480: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
d490: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
d4a0: 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f   /* Open a tempo
d4b0: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
d4c0: 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
d4d0: 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
d4e0: 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
d4f0: 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
d500: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d510: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d520: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
d530: 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 31 29  mp, distinct, 1)
d540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
d550: 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
d560: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  }..  /* Begin th
d570: 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
d580: 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20    */.  pWInfo = 
d590: 73 71 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e  sqliteWhereBegin
d5a0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
d5b0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
d5c0: 72 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 57  re, 0);.  if( pW
d5d0: 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
d5e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
d5f0: 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
d600: 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
d610: 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
d620: 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
d630: 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
d640: 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
d650: 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
d660: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45 4c  Loop(pParse, pEL
d670: 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
d680: 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
d690: 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20  Dest, iParm,.   
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
d6c0: 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
d6d0: 61 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ak) ){.       go
d6e0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
d6f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d700: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
d710: 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65 73   with aggregates
d720: 2c 20 74 68 65 6e 20 74 6f 20 74 68 65 20 73 70  , then to the sp
d730: 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a  ecial aggregate.
d740: 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e    ** processing.
d750: 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a    .  */.  else{.
d760: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
d770: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62   ){.      int lb
d780: 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  l1;.      for(i=
d790: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
d7a0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
d7b0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
d7c0: 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
d7d0: 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
d7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d7f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d800: 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
d810: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
d820: 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  0);.      lbl1 =
d830: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
d840: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
d850: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d860: 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
d870: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66  , lbl1);.      f
d880: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
d890: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
d8a0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
d8b0: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
d8c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d8d0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
d8e0: 64 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  de(pParse, pPars
d8f0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
d900: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d910: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d920: 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a  _AggSet, 0, i);.
d930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d940: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
d950: 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20  abel(v, lbl1);. 
d960: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
d970: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
d980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
d990: 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e  pr *pE;.      in
d9a0: 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21  t j;.      if( !
d9b0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
d9c0: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
d9d0: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61  ;.      pE = pPa
d9e0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
d9f0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
da00: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
da10: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
da20: 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74     if( pE->pList
da30: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
da40: 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74  j=0; j<pE->pList
da50: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
da60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
da70: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
da80: 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  pE->pList->a[j].
da90: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
daa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
dab0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dac0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
dad0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
dae0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
daf0: 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45  P_AggFunc, 0, pE
db00: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c  ->pList ? pE->pL
db10: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
db20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
db30: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
db40: 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  Func!=0 );.     
db50: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
db60: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e  >aAgg[i].pFunc->
db70: 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20  xStep!=0 );.    
db80: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
db90: 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
dba0: 72 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  r*)pParse->aAgg[
dbb0: 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49  i].pFunc, P3_POI
dbc0: 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NTER);.    }.  }
dbd0: 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
dbe0: 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
dbf0: 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
dc00: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
dc10: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
dc20: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
dc30: 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
dc40: 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
dc50: 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
dc60: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
dc70: 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
dc80: 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
dc90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
dca0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
dcb0: 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
dcc0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
dcd0: 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
dce0: 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
dcf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dd00: 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
dd10: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
dd20: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
dd30: 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
dd40: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
dd50: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
dd60: 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
dd70: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20  artagg);.    }. 
dd80: 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
dd90: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
dda0: 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
ddb0: 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
ddc0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20   eDest, iParm,. 
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64     startagg, end
ddf0: 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  agg) ){.      go
de00: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
de10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
de20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
de30: 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67  oto, 0, startagg
de40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
de50: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
de60: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
de70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
de80: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b   OP_Noop, 0, 0);
de90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
dea0: 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
deb0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
dec0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
ded0: 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
dee0: 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
def0: 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
df00: 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
df10: 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
df20: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
df30: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
df40: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76  nerateSortTail(v
df50: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
df60: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73  ;.  }...  /* Iss
df70: 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61  ue a null callba
df80: 63 6b 20 69 66 20 74 68 61 74 20 69 73 20 77 68  ck if that is wh
df90: 61 74 20 74 68 65 20 75 73 65 72 20 77 61 6e 74  at the user want
dfa0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  s..  */.  if( (p
dfb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
dfc0: 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61   & SQLITE_NullCa
dfd0: 6c 6c 62 61 63 6b 29 21 3d 30 20 26 26 20 65 44  llback)!=0 && eD
dfe0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
dff0: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  k ){.    sqliteV
e000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e010: 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c  ullCallback, pEL
e020: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
e030: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45    }..  /* The SE
e040: 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
e050: 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
e060: 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
e070: 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
e080: 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
e090: 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
e0a0: 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
e0b0: 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
e0c0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
e0d0: 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
e0e0: 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
e0f0: 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
e100: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
e110: 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
e120: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
e130: 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 41   base;.  sqliteA
e140: 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
e150: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
e160: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.