/ Hex Artifact Content
Login

Artifact 6e84ac2be582382a4d9a81b9594456bb46babb1c:


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 38 20  select.c,v 1.88 
0200: 32 30 30 32 2f 30 35 2f 32 37 20 31 32 3a 32 34  2002/05/27 12:24
0210: 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :48 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 26 26 20 70 45 4c 69 73 74 20 26 26  >=0 && pEList &&
2710: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
2720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
2730: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
2740: 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e  Null, -pEList->n
2750: 45 78 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65  Expr, sqliteVdbe
2760: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
2770: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2780: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
2790: 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  eKey, pEList->nE
27a0: 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  xpr, 1);.    sql
27b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
27c0: 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69 73  OP_Distinct, dis
27d0: 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 56 64 62  tinct, sqliteVdb
27e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
27f0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  3);.    sqliteVd
2800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
2810: 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p, pEList->nExpr
2820: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
2830: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
2840: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
2850: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
2860: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2870: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
2880: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2890: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
28a0: 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  Key, distinct, 0
28b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
28c0: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
28d0: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
28e0: 6e 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  n store the resu
28f0: 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 73 6f  lts.  ** in a so
2900: 72 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rter..  */.  if(
2910: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
2920: 20 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65   char *zSortOrde
2930: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  r;.    sqliteVdb
2940: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2950: 74 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d  tMakeRec, nColum
2960: 6e 2c 20 30 29 3b 0a 20 20 20 20 7a 53 6f 72 74  n, 0);.    zSort
2970: 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Order = sqliteMa
2980: 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79 2d 3e  lloc( pOrderBy->
2990: 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20 20 20  nExpr + 1 );.   
29a0: 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d   if( zSortOrder=
29b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
29c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
29d0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
29e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 6f 72 74  ++){.      zSort
29f0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
2a00: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2a10: 64 65 72 20 3f 20 27 2d 27 20 3a 20 27 2b 27 3b  der ? '-' : '+';
2a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
2a30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f  rCode(pParse, pO
2a40: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2a50: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  pr);.    }.    z
2a60: 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65 72  SortOrder[pOrder
2a70: 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a  By->nExpr] = 0;.
2a80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2a90: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
2aa0: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
2ab0: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
2ac0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
2ad0: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
2ae0: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
2af0: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 20 20 73  rtOrder));.    s
2b00: 71 6c 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f  qliteFree(zSortO
2b10: 72 64 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rder);.    sqlit
2b20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2b30: 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 29 3b  _SortPut, 0, 0);
2b40: 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20  .  }else ..  /* 
2b50: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
2b60: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
2b70: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
2b80: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
2b90: 79 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61  y.  ** table iPa
2ba0: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  rm..  */.  if( e
2bb0: 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
2bc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
2bd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
2be0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
2bf0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
2c00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2c10: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
2c20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2c30: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
2c40: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
2c50: 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 53 74   }else ..  /* St
2c60: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
2c70: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
2c80: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 2a 2f 0a  nique key..  */.
2c90: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
2ca0: 5f 54 61 62 6c 65 20 7c 7c 20 65 44 65 73 74 3d  _Table || eDest=
2cb0: 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
2cc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
2cd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
2ce0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
2cf0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
2d00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
2d10: 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20  ewRecno, iParm, 
2d20: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
2d30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
2d40: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  ll, 1, 0);.    s
2d50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2d60: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
2d70: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c  iParm, 0);.  }el
2d80: 73 65 20 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  se ..  /* Constr
2d90: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
2da0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
2db0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
2dc0: 6f 66 0a 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  of.  ** saving t
2dd0: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
2de0: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
2df0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
2e00: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d  rom.  ** the tem
2e10: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
2e20: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  rm..  */.  if( e
2e30: 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
2e40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
2e50: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
2e60: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
2e70: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 31 29  ord, nColumn, 1)
2e80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
2e90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
2ea0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
2eb0: 72 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r+3);.    sqlite
2ec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ed0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
2ee0: 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f  );.  }else ..  /
2ef0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
2f00: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
2f10: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
2f20: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
2f30: 63 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ct,.  ** then th
2f40: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
2f50: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
2f60: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
2f70: 20 74 68 69 73 0a 20 20 2a 2a 20 69 74 65 6d 20   this.  ** item 
2f80: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
2f90: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
2fa0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ta..  */.  if( e
2fb0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b  Dest==SRT_Set ){
2fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f  .    assert( nCo
2fd0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73  lumn==1 );.    s
2fe0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2ff0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c  , OP_IsNull, -1,
3000: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
3010: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
3020: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3030: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
3040: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
3050: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3060: 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72  _PutStrKey, iPar
3070: 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  m, 0);.  }else .
3080: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
3090: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
30a0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
30b0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
30c0: 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74 6f 72 65   then.  ** store
30d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
30e0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
30f0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
3100: 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a 2a 20 6f  break out.  ** o
3110: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
3120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
3130: 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
3140: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
3150: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  n==1 );.    sqli
3160: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3170: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
3180: 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 1);.    sqlit
3190: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
31a0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b  _Goto, 0, iBreak
31b0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
31c0: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
31d0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
31e0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
31f0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
3200: 0a 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f  .  ** the body o
3210: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
3220: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
3230: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
3240: 63 61 6c 6c 0a 20 20 2a 2a 20 75 73 65 72 2d 64  call.  ** user-d
3250: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
3260: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
3270: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
3280: 6e 6f 74 20 63 61 72 65 0a 20 20 2a 2a 20 61 62  not care.  ** ab
3290: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
32a0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
32b0: 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
32c0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
32d0: 61 72 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ard ){.    sqlit
32e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
32f0: 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  _Pop, nColumn, 0
3300: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
3310: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
3320: 61 62 6f 76 65 2c 20 73 65 6e 64 20 74 68 65 20  above, send the 
3330: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
3340: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  back function.. 
3350: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69   */.  {.    sqli
3360: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3370: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
3380: 75 6d 6e 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  umn, iBreak);.  
3390: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
33a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
33b0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
33c0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
33d0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
33e0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
33f0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
3400: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
3410: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
3420: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
3430: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
3440: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
3450: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
3460: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
3470: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
3480: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
3490: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
34a0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
34b0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
34c0: 74 65 53 6f 72 74 54 61 69 6c 28 56 64 62 65 20  teSortTail(Vdbe 
34d0: 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 29  *v, int nColumn)
34e0: 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71  {.  int end = sq
34f0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
3500: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
3510: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
3520: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  dOp(v, OP_Sort, 
3530: 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20  0, 0);.  addr = 
3540: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3550: 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20  v, OP_SortNext, 
3560: 30 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74  0, end);.  sqlit
3570: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3580: 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e  _SortCallback, n
3590: 43 6f 6c 75 6d 6e 2c 20 65 6e 64 29 3b 0a 20 20  Column, end);.  
35a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
35b0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
35c0: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  ddr);.  sqliteVd
35d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
35e0: 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65  , end);.  sqlite
35f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3600: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
3610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
3620: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
3630: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
3640: 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e   how many column
3650: 73 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 69  s there.** are i
3660: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  n the result and
3670: 20 74 68 65 20 6e 61 6d 65 20 66 6f 72 20 65 61   the name for ea
3680: 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73  ch column.  This
3690: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
36a0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
36b0: 64 65 20 22 61 72 67 63 22 20 61 6e 64 20 22 61  de "argc" and "a
36c0: 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65 73 20 69  zCol[]" values i
36d0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
36e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
36f0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
3700: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
3720: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3730: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
3740: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
3750: 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  sor correspondin
3760: 67 20 74 6f 20 66 69 72 73 74 20 65 6e 74 72 79  g to first entry
3770: 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
3780: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3790: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
37a0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
37b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
37c0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
37d0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
37e0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
37f0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3800: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
3810: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3820: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
3830: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  ==0 || sqlite_ma
3840: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
3850: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
3860: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
3870: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
3880: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43  Op(v, OP_ColumnC
3890: 6f 75 6e 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ount, pEList->nE
38a0: 78 70 72 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  xpr, 0);.  for(i
38b0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
38c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
38d0: 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20  xpr *p;.    int 
38e0: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20  showFullNames;. 
38f0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
3900: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
3910: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
3920: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
3930: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
3940: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3950: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
3960: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
3970: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3980: 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  -1, zName, strle
3990: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
39a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
39b0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
39c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
39d0: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
39e0: 69 6e 75 65 3b 0a 20 20 20 20 73 68 6f 77 46 75  inue;.    showFu
39f0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73  llNames = (pPars
3a00: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
3a10: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
3a20: 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  es)!=0;.    if( 
3a30: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
3a40: 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68  span.z[0] && !sh
3a50: 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  owFullNames ){. 
3a60: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
3a70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3a80: 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  v,OP_ColumnName,
3a90: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
3aa0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
3ab0: 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e  (v, -1, p->span.
3ac0: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
3ae0: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
3af0: 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  addr);.    }else
3b00: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3b10: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
3b20: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
3b30: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73   *pTab = pTabLis
3b40: 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d  t->a[p->iTable -
3b50: 20 62 61 73 65 5d 2e 70 54 61 62 3b 0a 20 20 20   base].pTab;.   
3b60: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
3b70: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
3b80: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
3b90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
3ba0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
3bb0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
3bc0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
3bd0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
3be0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
3bf0: 20 20 20 7a 43 6f 6c 20 3d 20 69 43 6f 6c 3c 30     zCol = iCol<0
3c00: 20 3f 20 22 5f 52 4f 57 49 44 5f 22 20 3a 20 70   ? "_ROWID_" : p
3c10: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
3c20: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
3c30: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
3c40: 31 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d  1 || showFullNam
3c50: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
3c60: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
3c70: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
3c80: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
3c90: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
3ca0: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
3cb0: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
3cc0: 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61    if( showFullNa
3cd0: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
3ce0: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
3cf0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
3d00: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
3d10: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
3d20: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
3d30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3d40: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
3d50: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
3d60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
3d70: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61  ngeP3(v, -1, zNa
3d80: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
3d90: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
3da0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3db0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3dc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3dd0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
3de0: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
3df0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
3e00: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
3e10: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
3e20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
3e30: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
3e40: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
3e50: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
3e60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
3e70: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
3e80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
3e90: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
3ea0: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
3eb0: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
3ec0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
3ed0: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
3ee0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
3ef0: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
3f00: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
3f10: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
3f20: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
3f30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
3f40: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
3f50: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
3f60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f70: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
3f80: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
3f90: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
3fa0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
3fb0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
3fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
3fd0: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
3fe0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
3ff0: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
4000: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
4010: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
4020: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
4030: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
4040: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
4050: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
4060: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
4070: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
4080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4090: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
40a0: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
40b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
40c0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
40d0: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
40e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
40f0: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
4100: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
4110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
4120: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
4130: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
4140: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
4150: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
4160: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
4170: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
4180: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
4190: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
41a0: 6c 65 20 2a 73 71 6c 69 74 65 52 65 73 75 6c 74  le *sqliteResult
41b0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
41c0: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
41d0: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
41e0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
41f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
4200: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
4210: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 61 74 69  *pEList;.  stati
4220: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
4230: 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53  mnList(Parse*, S
4240: 65 6c 65 63 74 2a 29 3b 0a 0a 20 20 69 66 28 20  elect*);..  if( 
4250: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
4260: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
4270: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4280: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
4290: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
42a0: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
42b0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
42c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
42d0: 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  }.  pTab->zName 
42e0: 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c  = zTabName ? sql
42f0: 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61  iteStrDup(zTabNa
4300: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
4310: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
4320: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
4330: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4340: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
4350: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
4360: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  Tab->aCol = sqli
4370: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4380: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
4390: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
43a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
43b0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
43c0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 66   Expr *p;.    if
43d0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
43e0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 70 54  Name ){.      pT
43f0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
4400: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
4410: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  (pEList->a[i].zN
4420: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
4430: 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61  if( (p=pEList->a
4440: 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
4450: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
4460: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
4470: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54  teSetNString(&pT
4480: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
4490: 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  e, p->span.z, p-
44a0: 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  >span.n, 0);.   
44b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
44c0: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 2d 3e 70  ==TK_DOT && p->p
44d0: 52 69 67 68 74 20 26 26 20 70 2d 3e 70 52 69 67  Right && p->pRig
44e0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 0a 20  ht->token.z &&. 
44f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69            p->pRi
4500: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20  ght->token.z[0] 
4510: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
4520: 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d  etNString(&pTab-
4530: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  .           p->p
4550: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Right->token.z, 
4560: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
4570: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  .n, 0);.    }els
4580: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42  e{.      char zB
4590: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70  uf[30];.      sp
45a0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c  rintf(zBuf, "col
45b0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
45c0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
45d0: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
45e0: 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a 20 20  StrDup(zBuf);.  
45f0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
4600: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
4610: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
4620: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65  .** For the give
4630: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
4640: 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69  nt, do three thi
4650: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs..**.**    (1
4660: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
4670: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
4680: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
4690: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
46a0: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
46b0: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
46c0: 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  es that should b
46d0: 65 20 73 63 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a  e scanned. .**.*
46e0: 2a 20 20 20 20 28 32 29 20 20 41 64 64 20 74 65  *    (2)  Add te
46f0: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
4700: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
4710: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
4720: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
4730: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
4740: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
4750: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
4760: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ns..**.**    (3)
4770: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
4780: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
4790: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
47a0: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
47b0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
47c0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
47d0: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
47e0: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
47f0: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
4800: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
4810: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
4820: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
4830: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
4840: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
4850: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
4860: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
4870: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
4880: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
4890: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
48a0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
48b0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
48c0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
48d0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
48e0: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
48f0: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20  olumnList(Parse 
4900: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
4910: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
4920: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
4930: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
4940: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
4950: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
4960: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
4970: 2d 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->pSrc==0 ) retu
4980: 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74  rn 1;.  pTabList
4990: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
49a0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
49b0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
49c0: 65 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74  every table in t
49d0: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20  he table list.. 
49e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
49f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
4a00: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4a10: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
4a20: 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ab ){.      /* T
4a30: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
4a40: 72 75 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20  run before!  No 
4a50: 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65  need to continue
4a60: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
4a70: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
4a80: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
4a90: 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
4aa0: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
4ab0: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
4ac0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
4ad0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
4ae0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
4af0: 2e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  .pSelect!=0 );. 
4b00: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
4b10: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d  t->a[i].zAlias==
4b20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
4b30: 72 20 7a 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b  r zFakeName[60];
4b40: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
4b50: 28 7a 46 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c  (zFakeName, "sql
4b60: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
4b70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76  ",.           (v
4b80: 6f 69 64 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61  oid*)pTabList->a
4b90: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
4ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
4bb0: 74 72 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d  tring(&pTabList-
4bc0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46  >a[i].zAlias, zF
4bd0: 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  akeName, 0);.   
4be0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c     }.      pTabL
4bf0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  ist->a[i].pTab =
4c00: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
4c10: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
4c20: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
4c30: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
4c40: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
4c80: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
4c90: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
4ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
4cc0: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
4cd0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
4ce0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
4cf0: 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
4d00: 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
4d10: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4d20: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
4d30: 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  i].pTab = pTab =
4d40: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
4d50: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
4d60: 2d 3e 64 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e  ->db, pTabList->
4d70: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
4d80: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
4d90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4da0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4db0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
4dc0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a  such table: ", .
4dd0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
4de0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
4df0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
4e00: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4e10: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4e30: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
4e40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
4e50: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
4e60: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
4e70: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
4e80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
4ea0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
4eb0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c  lect = sqliteSel
4ec0: 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65  ectDup(pTab->pSe
4ed0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
4ee0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
4ef0: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
4f00: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
4f10: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
4f20: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
4f30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
4f40: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
4f50: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
4f60: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
4f70: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
4f80: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
4f90: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
4fa0: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
4fb0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
4fc0: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
4fd0: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
4fe0: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
4ff0: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
5000: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
5010: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
5020: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
5030: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
5040: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
5050: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
5060: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
5070: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
5080: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
5090: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
50a0: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
50b0: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
50c0: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
50d0: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
50e0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
50f0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
5100: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
5110: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
5120: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
5130: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
5140: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
5150: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
5160: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
5170: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
5180: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5190: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
51a0: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
51b0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
51c0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
51d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
51e0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
51f0: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
5200: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
5210: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
5220: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
5230: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
5240: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
5250: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
5260: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
5270: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
5280: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
5290: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
52a0: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
52b0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
52c0: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
52d0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
52e0: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
52f0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
5300: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
5310: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
5320: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
5330: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
5340: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
5350: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
5360: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
5370: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
5380: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f  pNew = 0;.    fo
5390: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
53a0: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
53b0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61      Expr *pE = a
53c0: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
53d0: 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
53e0: 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20  ALL &&.         
53f0: 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f    (pE->op!=TK_DO
5400: 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d  T || pE->pRight=
5410: 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  =0 || pE->pRight
5420: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
5430: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
5440: 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
5450: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
5460: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
5470: 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
5480: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
5490: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
54a0: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
54b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
54c0: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
54d0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
54e0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
54f0: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
5500: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
5510: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
5520: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5530: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
5540: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
5550: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
5560: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
5570: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
5580: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
5590: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
55a0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
55b0: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
55c0: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  hes */.        T
55d0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
55e0: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
55f0: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
5600: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
5610: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
5620: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
5630: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
5640: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
5650: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
5660: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
5670: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
5680: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5690: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
56a0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
56b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
56c0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
56d0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
56e0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
56f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
5700: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
5710: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
5720: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
5730: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
5740: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
5750: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
5760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5770: 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20     if( pName && 
5780: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
5790: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
57a0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
57b0: 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43      sqliteStrNIC
57c0: 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61  mp(pName->z, zTa
57d0: 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29  bName, pName->n)
57e0: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
57f0: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
5800: 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29  [pName->n]!=0) )
5810: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
5820: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5830: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
5840: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
5850: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
5860: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
5870: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
5880: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
5890: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
58a0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
58b0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
58c0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
58d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
58e0: 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  0 && (pTabList->
58f0: 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  a[i-1].jointype 
5900: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
5910: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
5920: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
5930: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
5940: 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  .pTab, zName)>=0
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5960: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
5970: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
5980: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
5990: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
59a0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
59b0: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
59d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
59e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
59f0: 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69   if( i>0 && sqli
5a00: 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54  teIdListIndex(pT
5a10: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70  abList->a[i-1].p
5a20: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
5a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5a40: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
5a50: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
5a60: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
5a70: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
5a80: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
5a90: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
5aa0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
5ab0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
5ac0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
5ad0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5ae0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
5af0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
5b00: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
5b10: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
5b20: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
5b40: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e  ht->token.z = zN
5b50: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
5b60: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
5b70: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
5b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
5b90: 28 20 7a 54 61 62 4e 61 6d 65 20 29 7b 0a 20 20  ( zTabName ){.  
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
5bb0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
5bc0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5be0: 28 20 70 4c 65 66 74 3d 3d 30 20 29 20 62 72 65  ( pLeft==0 ) bre
5bf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
5c00: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a    pLeft->token.z
5c10: 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20   = zTabName;.   
5c20: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
5c30: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c  ->token.n = strl
5c40: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  en(zTabName);.  
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
5c60: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  r = sqliteExpr(T
5c70: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
5c80: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
5c90: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
5ca0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
5cb0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
5cd0: 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
5cf0: 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72  pr->span = pExpr
5d00: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
5d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5d20: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
5d30: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
5d40: 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  New, pExpr, 0);.
5d50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
5d70: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
5d80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5d90: 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( pName!=0 );.  
5da0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
5db0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
5dc0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
5dd0: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31  uch table: ", -1
5de0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
5df0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
5e00: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
5e10: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
5e20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5e30: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
5e40: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
5e50: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
5e60: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
5e70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5e80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5e90: 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69  recursively unli
5ea0: 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70  nks the Select.p
5eb0: 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69  Src.a[].pTab poi
5ec0: 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65  nters.** in a se
5ed0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
5ee0: 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68   It just sets th
5ef0: 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55  e pointers to NU
5f00: 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  LL.  This.** rou
5f10: 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76  tine is recursiv
5f20: 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  e in the sense t
5f30: 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63  hat if the Selec
5f40: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65  t.pSrc.a[].pSele
5f50: 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73  ct.** pointer is
5f60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20   not NULL, this 
5f70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5f80: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
5f90: 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a   that pointer..*
5fa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5fb0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  e is called on t
5fc0: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
5fd0: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
5fe0: 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72   a.** VIEW in or
5ff0: 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20  der to undo any 
6000: 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c  bindings to tabl
6010: 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  es.  This is nec
6020: 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73  essary.** becaus
6030: 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d  e those tables m
6040: 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62  ight be DROPed b
6050: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53  y a subsequent S
6060: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76  QL command..*/.v
6070: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
6080: 55 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70  Unbind(Select *p
6090: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  ){.  int i;.  Sr
60a0: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
60b0: 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a  >pSrc;.  Table *
60c0: 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pTab;.  if( p==0
60d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
60e0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
60f0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rc; i++){.    if
6100: 28 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  ( (pTab = pSrc->
6110: 61 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b  a[i].pTab)!=0 ){
6120: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
6130: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
6140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
6150: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
6160: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
6170: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
6180: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
6190: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63  t);.        pSrc
61a0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
61b0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
61c0: 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61    pSrc->a[i].pTa
61d0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
61e0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
61f0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
6200: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
6210: 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  d(pSrc->a[i].pSe
6220: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
6230: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6240: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6250: 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65  ssociates entrie
6260: 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s in an ORDER BY
6270: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
6280: 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   with.** columns
6290: 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46   in a result.  F
62a0: 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59  or each ORDER BY
62b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
62c0: 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68   opcode of.** th
62d0: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
62e0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
62f0: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
6300: 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f   iColumn value o
6310: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
6320: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
6330: 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e  d in with column
6340: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
6350: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
6360: 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
6370: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
6380: 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61  with iTable para
6390: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
63a0: 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20  there are prior 
63b0: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20  SELECT clauses, 
63c0: 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73  they are process
63d0: 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74  ed first.  A mat
63e0: 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c  ch.** in an earl
63f0: 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73  ier SELECT takes
6400: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
6410: 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e   a later SELECT.
6420: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79  .**.** Any entry
6430: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
6440: 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20  atch is flagged 
6450: 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  as an error.  Th
6460: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
6470: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
6480: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
6490: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
64a0: 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
64b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
64c0: 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c   /* A place to l
64d0: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
64e0: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
64f0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
6500: 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73   /* Match to res
6510: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ult columns of t
6520: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
6530: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
6540: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
6550: 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74  RDER BY values t
6560: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
6570: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
6580: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
6590: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74       /* Insert t
65a0: 68 69 73 20 74 68 69 73 20 76 61 6c 75 65 20 69  his this value i
65b0: 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  n iTable */.  in
65c0: 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20  t mustComplete  
65d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45        /* If TRUE
65e0: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d   all ORDER BYs m
65f0: 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  ust match */.){.
6600: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
6610: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
6620: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
6630: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
6640: 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 || pOrderBy==0
6650: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6660: 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  f( mustComplete 
6670: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6680: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
6690: 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42  r; i++){ pOrderB
66a0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
66b0: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  ; }.  }.  if( fi
66c0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
66d0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
66e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
66f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
6700: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
6710: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
6720: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
6730: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
6740: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
6750: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
6760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6770: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
6780: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
6790: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
67a0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
67b0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
67c0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
67d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
67e0: 6e 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20  nt match = 0;.  
67f0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
6800: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
6810: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
6820: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
6830: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
6840: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  if( pEList->a[j]
6850: 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f  .zName && (pE->o
6860: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e  p==TK_ID || pE->
6870: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29  op==TK_STRING) )
6880: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
6890: 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a  zName, *zLabel;.
68a0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
68b0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
68c0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  me;.        asse
68d0: 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20  rt( pE->token.z 
68e0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65  );.        zLabe
68f0: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
6900: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
6910: 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  E->token.n);.   
6920: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
6930: 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  te(zLabel);.    
6940: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
6950: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
6960: 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20  bel)==0 ){ .    
6970: 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31 3b        match = 1;
6980: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
6990: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
69a0: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
69b0: 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 3d        if( match=
69c0: 3d 30 20 26 26 20 73 71 6c 69 74 65 45 78 70 72  =0 && sqliteExpr
69d0: 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69  Compare(pE, pELi
69e0: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20  st->a[j].pExpr) 
69f0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68  ){.        match
6a00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
6a10: 20 20 20 20 69 66 28 20 6d 61 74 63 68 20 29 7b      if( match ){
6a20: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  .        pE->op 
6a30: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
6a40: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
6a50: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45   = j;.        pE
6a60: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
6a70: 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  e;.        pOrde
6a80: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
6a90: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
6aa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6ab0: 0a 20 20 20 20 69 66 28 20 21 6d 61 74 63 68 20  .    if( !match 
6ac0: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
6ad0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42  ){.      char zB
6ae0: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70  uf[30];.      sp
6af0: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c  rintf(zBuf,"%d",
6b00: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1);.      sqli
6b10: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
6b20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f  rse->zErrMsg, "O
6b30: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
6b40: 62 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20  ber ", zBuf, .  
6b50: 20 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f 74        " does not
6b60: 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c   match any resul
6b70: 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  t column", 0);. 
6b80: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
6b90: 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  r++;.      nErr+
6ba0: 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
6bb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6bc0: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
6bd0: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
6be0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
6bf0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
6c00: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
6c10: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
6c20: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6c30: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
6c40: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
6c50: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
6c60: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65  /.Vdbe *sqliteGe
6c70: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
6c80: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
6c90: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6ca0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
6cb0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
6cc0: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62  Vdbe = sqliteVdb
6cd0: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
6ce0: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
6cf0: 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a  n v;.}.    ../*.
6d00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6d10: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
6d20: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
6d30: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
6d40: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
6d50: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
6d60: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
6d70: 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   queries..*/.sta
6d80: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
6d90: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
6da0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
6db0: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
6dc0: 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  rm){.  int rc;  
6dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
6de0: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
6df0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
6e00: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
6e10: 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  ;     /* Another
6e20: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
6e30: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
6e40: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
6e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6e60: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
6e70: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
6e80: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
6e90: 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c 75  /* Baseline valu
6ea0: 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54  e for pParse->nT
6eb0: 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ab */..  /* Make
6ec0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
6ed0: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
6ee0: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
6ef0: 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20  Ts.  Only the . 
6f00: 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20   ** last SELECT 
6f10: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
6f20: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
6f30: 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  BY..  */.  if( p
6f40: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
6f50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6f60: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
6f70: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
6f80: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
6f90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
6fa0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6fb0: 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20 63  rMsg,"ORDER BY c
6fc0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
6fd0: 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20 20  e after ",.     
6fe0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
6ff0: 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66 6f  >op), " not befo
7000: 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  re", 0);.    pPa
7010: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7020: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
7030: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
7040: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
7050: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
7060: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
7070: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
7080: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
7090: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
70a0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  v==0 ) return 1;
70b0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
70c0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
70d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
70e0: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
70f0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7100: 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
7110: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7120: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
7130: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
7140: 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62   eDest = SRT_Tab
7150: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72  le;.  }..  /* Pr
7160: 6f 63 65 73 73 20 74 68 65 20 55 4e 49 4f 4e 20  ocess the UNION 
7170: 6f 72 20 49 4e 54 45 52 53 45 43 54 49 4f 4e 0a  or INTERSECTION.
7180: 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70 50    */.  base = pP
7190: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 77  arse->nTab;.  sw
71a0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
71b0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 0a     case TK_ALL:.
71c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
71d0: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
71e0: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
71f0: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
7200: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
7210: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
7220: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
7230: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
7240: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
7250: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
7260: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
7270: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
7280: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
7290: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
72a0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
72b0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
72c0: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 0a 20 20  r selects */..  
72d0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
72e0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
72f0: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
7300: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ion;.      if( e
7310: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest==priorOp ){
7320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
7330: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
7340: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
7350: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
7360: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
7370: 2a 2a 20 72 69 67 68 74 2e 20 20 54 68 69 73 20  ** right.  This 
7380: 61 6c 73 6f 20 6d 65 61 6e 73 20 77 65 20 61 72  also means we ar
7390: 65 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  e not the right-
73a0: 6d 6f 73 74 20 73 65 6c 65 63 74 20 61 6e 64 20  most select and 
73b0: 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
73c0: 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e 20   cannot have an 
73d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
73e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
73f0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50     unionTab = iP
7400: 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  arm;.        ass
7410: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
7420: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ==0 );.      }el
7430: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
7440: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
7450: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
7460: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
7470: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
7480: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
7490: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
74a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
74b0: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
74c0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
74d0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
74e0: 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74   .        && mat
74f0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
7500: 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  n(pParse, p, p->
7510: 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54  pOrderBy, unionT
7520: 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  ab, 1) ){.      
7530: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7550: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  if( p->op!=TK_AL
7560: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  L ){.          s
7570: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7580: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75  , OP_OpenTemp, u
7590: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
75a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
75b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
75c0: 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62  AsData, unionTab
75d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
75e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
75f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7600: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75  , OP_OpenTemp, u
7610: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
7620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7630: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
7640: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7650: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
7660: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
7670: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
7680: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
7690: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
76a0: 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ab, 0, 0, 0);.  
76b0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
76c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
76d0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
76e0: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
76f0: 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
7700: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
7710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73   ){.         cas
7720: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70  e TK_EXCEPT:  op
7730: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20   = SRT_Except;  
7740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7750: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
7760: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
7770: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
7780: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
7790: 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54  :     op = SRT_T
77a0: 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a  able;    break;.
77b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
77c0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
77d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
77e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
77f0: 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  op, unionTab, 0,
7800: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
7810: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
7820: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
7830: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
7840: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
7850: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
7860: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
7870: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
7880: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
7890: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
78a0: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
78b0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
78c0: 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20   eDest!=priorOp 
78d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
78e0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
78f0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
7900: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
7910: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
7920: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
7930: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
7940: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
7950: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  mes(pParse, p->b
7960: 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  ase, 0, p->pELis
7970: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
7980: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
7990: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
79a0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
79b0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
79c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
79d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
79e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
79f0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
7a00: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
7a10: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
7a20: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7a30: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
7a40: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
7a50: 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69 6f 6e  pParse, 0, union
7a60: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
7a70: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
7aa0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
7ab0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
7ae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
7af0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
7b00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
7b10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
7b20: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
7b30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7b40: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
7b50: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
7b60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
7b70: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
7b80: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
7b90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7ba0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
7bb0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
7bc0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
7bd0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
7be0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
7bf0: 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  (v, p->pEList->n
7c00: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
7c10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7c30: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
7c40: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
7c50: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
7c60: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
7c70: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20 20 20  ak, iStart;..   
7c80: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
7c90: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
7ca0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
7cb0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
7cc0: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
7cd0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
7ce0: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
7cf0: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
7d00: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
7d10: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
7d20: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
7d30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7d40: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
7d50: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
7d60: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
7d70: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
7d80: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74  >pOrderBy && mat
7d90: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
7da0: 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f  n(pParse,p,p->pO
7db0: 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29  rderBy,tab1,1) )
7dc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7dd0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7de0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7df0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
7e00: 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20  , tab1, 1);.    
7e10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7e20: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
7e30: 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20  a, tab1, 1);..  
7e40: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
7e50: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
7e60: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
7e70: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
7e80: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7e90: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
7ea0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
7eb0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
7ec0: 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
7ed0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
7ee0: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
7ef0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
7f00: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
7f10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
7f20: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
7f30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7f40: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
7f50: 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20  mp, tab2, 1);.  
7f60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7f70: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
7f80: 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20  ata, tab2, 1);. 
7f90: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
7fa0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
7fb0: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
7fc0: 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e  se, p, SRT_Union
7fd0: 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 29  , tab2, 0, 0, 0)
7fe0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
7ff0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
8000: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8010: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
8020: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
8030: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
8040: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
8050: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
8060: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
8070: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
8080: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
8090: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
80a0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
80b0: 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  {.        genera
80c0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
80d0: 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30  arse, p->base, 0
80e0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
80f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
8100: 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  ak = sqliteVdbeM
8110: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
8120: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
8130: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
8140: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8150: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
8160: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
8170: 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61  eak);.      iSta
8180: 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  rt = sqliteVdbeA
8190: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b  ddOp(v, OP_FullK
81a0: 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ey, tab1, 0);.  
81b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
81c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
81d0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
81e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
81f0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
8200: 72 73 65 2c 20 30 2c 20 74 61 62 31 2c 20 70 2d  rse, 0, tab1, p-
8210: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
8240: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
8250: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
8280: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
8290: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
82a0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  1;.      sqliteV
82b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
82c0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
82d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
82e0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
82f0: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
8300: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
8310: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
8320: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
8330: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8340: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
8350: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8360: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
8370: 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
8380: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
8390: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
83a0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
83b0: 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  (v, p->pEList->n
83c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
83d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
83e0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
83f0: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
8400: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
8410: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
8420: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
8430: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
8440: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
8450: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8460: 72 4d 73 67 2c 20 22 53 45 4c 45 43 54 73 20 74  rMsg, "SELECTs t
8470: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
8480: 69 67 68 74 20 6f 66 20 22 2c 0a 20 20 20 20 20  ight of ",.     
8490: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
84a0: 3e 6f 70 29 2c 20 22 20 64 6f 20 6e 6f 74 20 68  >op), " do not h
84b0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
84c0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
84d0: 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20 20 20 20  lumns", 0);.    
84e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
84f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8500: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
8510: 20 3d 20 62 61 73 65 3b 0a 20 20 72 65 74 75 72   = base;.  retur
8520: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
8530: 63 75 72 73 69 76 65 6c 79 20 73 63 61 6e 20 74  cursively scan t
8540: 68 72 6f 75 67 68 20 61 6e 20 65 78 70 72 65 73  hrough an expres
8550: 73 69 6f 6e 20 74 72 65 65 2e 20 20 46 6f 72 20  sion tree.  For 
8560: 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 0a  every reference.
8570: 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
8580: 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
8590: 46 72 6f 6d 2c 20 63 68 61 6e 67 65 20 74 68 61  From, change tha
85a0: 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  t reference to t
85b0: 68 65 0a 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  he.** same colum
85c0: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
85d0: 72 20 69 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  r iTo..*/.static
85e0: 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c   void changeTabl
85f0: 65 73 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  es(Expr *pExpr, 
8600: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
8610: 54 6f 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  To){.  if( pExpr
8620: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8630: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
8640: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
8650: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 46 72 6f 6d  r->iTable==iFrom
8660: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
8670: 54 61 62 6c 65 20 3d 20 69 54 6f 3b 0a 20 20 7d  Table = iTo;.  }
8680: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
8690: 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c   void changeTabl
86a0: 65 73 49 6e 4c 69 73 74 28 45 78 70 72 4c 69 73  esInList(ExprLis
86b0: 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 20  t*, int, int);. 
86c0: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28     changeTables(
86d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 46  pExpr->pLeft, iF
86e0: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63  rom, iTo);.    c
86f0: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70  hangeTables(pExp
8700: 72 2d 3e 70 52 69 67 68 74 2c 20 69 46 72 6f 6d  r->pRight, iFrom
8710: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e  , iTo);.    chan
8720: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 70  geTablesInList(p
8730: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 46 72  Expr->pList, iFr
8740: 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d 0a 7d 0a  om, iTo);.  }.}.
8750: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
8760: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45  geTablesInList(E
8770: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8780: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
8790: 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  To){.  if( pList
87a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
87b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
87c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
87d0: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
87e0: 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  bles(pList->a[i]
87f0: 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d 2c 20 69  .pExpr, iFrom, i
8800: 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
8810: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
8820: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
8830: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
8840: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
8850: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
8860: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
8870: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
8880: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72   copy of the cor
8890: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 6e  responding.** en
88a0: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
88b0: 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
88c0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
88d0: 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
88e0: 63 68 61 6e 67 65 64 2e 29 20 20 57 68 65 6e 20  changed.)  When 
88f0: 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
8900: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
8910: 6e 20 70 45 4c 69 73 74 2c 20 63 68 61 6e 67 65  n pEList, change
8920: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74  .** references t
8930: 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
8940: 6c 65 20 69 53 75 62 20 69 6e 74 6f 20 72 65 66  le iSub into ref
8950: 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
8960: 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   iTable..**.** T
8970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
8980: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
8990: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
89a0: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
89b0: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
89c0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
89d0: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
89e0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
89f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
8a00: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
8a10: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
8a20: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
8a30: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
8a40: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
8a50: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
8a60: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
8a70: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
8a80: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
8a90: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
8aa0: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
8ab0: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
8ac0: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
8ad0: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
8ae0: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
8af0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
8b00: 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72  d substExpr(Expr
8b10: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61   *pExpr, int iTa
8b20: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
8b30: 45 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29  EList, int iSub)
8b40: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
8b50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8b60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
8b70: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
8b80: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
8b90: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
8ba0: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  >=0 ){.    Expr 
8bb0: 2a 70 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72  *pNew;.    asser
8bc0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
8bd0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
8be0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
8bf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
8c00: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
8c10: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
8c20: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  && pExpr->pList=
8c30: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  =0 );.    pNew =
8c40: 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
8c50: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
8c60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
8c70: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78  ew!=0 );.    pEx
8c80: 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
8c90: 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  p;.    pExpr->pL
8ca0: 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  eft = sqliteExpr
8cb0: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
8cc0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
8cd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ght = sqliteExpr
8ce0: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
8cf0: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  );.    pExpr->pL
8d00: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
8d10: 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
8d20: 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ist);.    pExpr-
8d30: 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
8d40: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45 78 70  iTable;.    pExp
8d50: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65  r->iColumn = pNe
8d60: 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  w->iColumn;.    
8d70: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
8d80: 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 70 45  ew->iAgg;.    pE
8d90: 78 70 72 2d 3e 74 6f 6b 65 6e 20 3d 20 70 4e 65  xpr->token = pNe
8da0: 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  w->token;.    if
8db0: 28 20 69 53 75 62 21 3d 69 54 61 62 6c 65 20 29  ( iSub!=iTable )
8dc0: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
8dd0: 62 6c 65 73 28 70 45 78 70 72 2c 20 69 53 75 62  bles(pExpr, iSub
8de0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d  , iTable);.    }
8df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
8e00: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
8e10: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
8e20: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 2c  *,int,ExprList*,
8e30: 69 6e 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  int);.    substE
8e40: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
8e50: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
8e60: 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62  , iSub);.    sub
8e70: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52  stExpr(pExpr->pR
8e80: 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
8e90: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20  List, iSub);.   
8ea0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
8eb0: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
8ec0: 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75  ble, pEList, iSu
8ed0: 62 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  b);.  }.}.static
8ee0: 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72   void .substExpr
8ef0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
8f00: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
8f10: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
8f20: 73 74 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a 20  st, int iSub){. 
8f30: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
8f40: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
8f50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
8f60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8f70: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
8f80: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
8f90: 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
8fa0: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a  t, iSub);.  }.}.
8fb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8fc0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
8fd0: 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
8fe0: 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
8ff0: 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
9000: 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
9010: 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
9020: 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
9030: 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
9040: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
9050: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
9060: 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
9070: 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
9080: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
9090: 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
90a0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
90b0: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
90c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
90d0: 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
90e0: 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
90f0: 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
9100: 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
9110: 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
9120: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
9130: 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
9140: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
9150: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
9160: 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
9170: 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
9180: 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
9190: 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
91a0: 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
91b0: 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
91c0: 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
91d0: 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
91e0: 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
91f0: 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
9200: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
9210: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
9220: 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
9230: 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
9240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
9250: 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
9260: 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
9270: 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
9280: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
9290: 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
92a0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
92b0: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
92c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
92d0: 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
92e0: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
92f0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
9300: 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
9310: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
9320: 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
9330: 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
9340: 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
9350: 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
9360: 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
9370: 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
9380: 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
9390: 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
93a0: 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
93b0: 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
93c0: 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
93d0: 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
93e0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
93f0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
9400: 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
9410: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
9420: 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
9430: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
9440: 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
9450: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
9460: 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
9470: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
9480: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
9490: 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
94a0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
94b0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34  join..**.**   (4
94c0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
94d0: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
94e0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
94f0: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
9500: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
9510: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
9520: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
9530: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
9540: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
9550: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
9560: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
9570: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
9580: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
9590: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
95a0: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
95b0: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
95c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
95d0: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
95e0: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
95f0: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
9600: 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
9610: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
9620: 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
9630: 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
9640: 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
9650: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
9660: 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
9670: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
9680: 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
9690: 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
96a0: 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
96b0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
96c0: 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
96d0: 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
96e0: 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
96f0: 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
9700: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
9710: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 49 66   return 0..** If
9720: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
9730: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
9740: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
9750: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
9760: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
9770: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
9780: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
9790: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
97a0: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
97b0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
97c0: 20 72 75 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 66 6c   runs..*/.int fl
97d0: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 53 65  attenSubquery(Se
97e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 46 72  lect *p, int iFr
97f0: 6f 6d 2c 20 69 6e 74 20 69 73 41 67 67 2c 20 69  om, int isAgg, i
9800: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
9810: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
9820: 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
9830: 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
9840: 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
9850: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
9860: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
9870: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
9880: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
9890: 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
98a0: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
98b0: 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
98c0: 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
98d0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
98e0: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
98f0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
9900: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  ry */.  int i;. 
9910: 20 69 6e 74 20 69 50 61 72 65 6e 74 2c 20 69 53   int iParent, iS
9920: 75 62 3b 0a 20 20 45 78 70 72 20 2a 70 57 68 65  ub;.  Expr *pWhe
9930: 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  re;..  /* Check 
9940: 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
9950: 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
9960: 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
9970: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
9980: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
9990: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
99a0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
99b0: 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
99c0: 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
99d0: 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  c );.  pSub = pS
99e0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65  rc->a[iFrom].pSe
99f0: 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
9a00: 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
9a10: 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
9a20: 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
9a30: 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   0;.  if( subque
9a40: 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
9a50: 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
9a60: 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20   0;.  pSubSrc = 
9a70: 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
9a80: 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
9a90: 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
9aa0: 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
9ab0: 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   0;.  if( pSub->
9ac0: 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 70 53  isDistinct && pS
9ad0: 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
9ae0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
9af0: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  b->isDistinct &&
9b00: 20 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20   isAgg ) return 
9b10: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69  0;.  if( p->isDi
9b20: 73 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65  stinct && subque
9b30: 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
9b40: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   0;..  /* If we 
9b50: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
9b60: 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74  , it means flatt
9b70: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
9b80: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
9b90: 69 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  i-th entry of th
9ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
9bb0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
9bc0: 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
9bd0: 20 3d 20 70 2d 3e 62 61 73 65 20 2b 20 69 46 72   = p->base + iFr
9be0: 6f 6d 3b 0a 20 20 69 53 75 62 20 3d 20 70 53 75  om;.  iSub = pSu
9bf0: 62 2d 3e 62 61 73 65 3b 0a 20 20 73 75 62 73 74  b->base;.  subst
9c00: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
9c10: 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
9c20: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
9c30: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  ;.  pList = p->p
9c40: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
9c50: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
9c60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9c70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
9c80: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  e==0 ){.      Ex
9c90: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
9ca0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
9cb0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
9cc0: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
9cd0: 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70  trNDup(pExpr->sp
9ce0: 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
9cf0: 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
9d00: 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
9d10: 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
9d20: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  (p->pGroupBy, iP
9d30: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
9d40: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
9d50: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
9d60: 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
9d70: 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75  Sub->pEList, iSu
9d80: 62 29 3b 0a 20 20 7d 0a 20 20 73 75 62 73 74 45  b);.  }.  substE
9d90: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
9da0: 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
9db0: 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62  ub->pEList, iSub
9dc0: 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  );.  if( pSub->p
9dd0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
9de0: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
9df0: 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
9e00: 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  );.    if( iPare
9e10: 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20 20  nt!=iSub ){.    
9e20: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
9e30: 57 68 65 72 65 2c 20 69 53 75 62 2c 20 69 50 61  Where, iSub, iPa
9e40: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
9e50: 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65  else{.    pWhere
9e60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
9e70: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
9e80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9e90: 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
9ea0: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
9eb0: 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d  ->pWhere;.    p-
9ec0: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
9ed0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
9ee0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
9ef0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
9f00: 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 69 66  t, iSub);.    if
9f10: 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20  ( pSub->pHaving 
9f20: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
9f30: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45  Having = sqliteE
9f40: 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
9f50: 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ving);.      if(
9f60: 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29   iParent!=iSub )
9f70: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  {.        change
9f80: 54 61 62 6c 65 73 28 70 48 61 76 69 6e 67 2c 20  Tables(pHaving, 
9f90: 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a  iSub, iParent);.
9fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9fb0: 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
9fc0: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
9fd0: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ng = sqliteExpr(
9fe0: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69  TK_AND, p->pHavi
9ff0: 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b  ng, pHaving, 0);
a000: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a010: 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67        p->pHaving
a020: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20   = pHaving;.    
a030: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
a040: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
a050: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
a060: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
a070: 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
a080: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
a090: 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53   if( iParent!=iS
a0a0: 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 6e  ub ){.      chan
a0b0: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 70  geTablesInList(p
a0c0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 53 75 62  ->pGroupBy, iSub
a0d0: 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , iParent);.    
a0e0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  }.  }else if( p-
a0f0: 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20  >pWhere==0 ){.  
a100: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
a110: 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  here;.  }else{. 
a120: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
a130: 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
a140: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
a150: 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Sub);.    if( pW
a160: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  here ){.      p-
a170: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
a180: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e  Expr(TK_AND, p->
a190: 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c 20  pWhere, pWhere, 
a1a0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
a1b0: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
a1c0: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
a1d0: 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
a1e0: 74 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  t;.  if( pSrc->a
a1f0: 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20  [iFrom].pTab && 
a200: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
a210: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
a220: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   ){.    sqliteDe
a230: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72  leteTable(0, pSr
a240: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
a250: 29 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 61  );.  }.  pSrc->a
a260: 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20 70  [iFrom].pTab = p
a270: 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  SubSrc->a[0].pTa
a280: 62 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b  b;.  pSubSrc->a[
a290: 30 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 70  0].pTab = 0;.  p
a2a0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53  Src->a[iFrom].pS
a2b0: 65 6c 65 63 74 20 3d 20 70 53 75 62 53 72 63 2d  elect = pSubSrc-
a2c0: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
a2d0: 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70   pSubSrc->a[0].p
a2e0: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71  Select = 0;.  sq
a2f0: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
a300: 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pSub);.  return
a310: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
a320: 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
a330: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
a340: 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
a350: 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
a360: 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
a370: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
a380: 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
a390: 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
a3a0: 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
a3b0: 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
a3c0: 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
a3d0: 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
a3e0: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
a3f0: 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
a400: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
a410: 4c 45 43 54 20 72 65 74 75 72 6e 20 31 2e 20 20  LECT return 1.  
a420: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
a430: 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
a440: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
a450: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
a460: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
a470: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
a480: 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
a490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
a4a0: 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
a4b0: 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
a4c0: 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
a4d0: 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
a4e0: 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
a4f0: 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
a500: 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
a510: 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
a520: 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
a530: 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
a540: 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
a550: 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
a560: 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
a570: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
a580: 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
a590: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
a5a0: 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
a5b0: 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
a5c0: 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
a5d0: 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
a5e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
a5f0: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
a600: 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
a610: 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
a620: 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53  teSelect()..** S
a630: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
a640: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
a650: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
a660: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
a670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a680: 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
a690: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
a6a0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
a6b0: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
a6c0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
a6d0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
a6e0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
a6f0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
a700: 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a  t base;.  Vdbe *
a710: 76 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b  v;.  int openOp;
a720: 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20  .  int seekOp;. 
a730: 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70   int cont;.  Exp
a740: 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20 20 73  rList eList;.  s
a750: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
a760: 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a  tem eListItem;..
a770: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
a780: 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  e if this query 
a790: 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
a7a0: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
a7b0: 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a  .  Return.  ** z
a7c0: 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f  ero if it is  no
a7d0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
a7e0: 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e  >pGroupBy || p->
a7f0: 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57  pHaving || p->pW
a800: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
a810: 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e  .  if( p->pSrc->
a820: 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
a830: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   0;.  if( p->pEL
a840: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
a850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
a860: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
a870: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
a880: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
a890: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
a8a0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
a8b0: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c  xpr->pList==0 ||
a8c0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
a8d0: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
a8e0: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
a8f0: 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
a900: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
a910: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78  liteStrNICmp(pEx
a920: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
a930: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
a940: 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
a950: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
a960: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45  qliteStrNICmp(pE
a970: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
a980: 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
a990: 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
a9a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
a9b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
a9c0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
a9d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
a9e0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
a9f0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
aa00: 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
aa10: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
aa20: 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
aa30: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  c->a[0].pTab;.. 
aa40: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   /* If we get to
aa50: 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20   here, it means 
aa60: 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
aa70: 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d  the correct form
aa80: 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ..  ** Check to 
aa90: 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  make sure we hav
aaa0: 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d  e an index and m
aab0: 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74  ake pIdx point t
aac0: 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f  o the.  ** appro
aad0: 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49  priate index.  I
aae0: 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  f the min() or m
aaf0: 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e  ax() is on an IN
ab00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20  TEGER PRIMARY.  
ab10: 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e  ** key column, n
ab20: 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73  o index is neces
ab30: 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78  sary so set pIdx
ab40: 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f   to NULL.  If no
ab50: 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64  .  ** usable ind
ab60: 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  ex is found, ret
ab70: 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
ab80: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
ab90: 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pIdx = 0;.  }els
aba0: 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
abb0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
abc0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
abd0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
abe0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
abf0: 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
ac00: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
ac10: 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65  n[0]==iCol ) bre
ac20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
ac30: 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
ac40: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
ac50: 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
ac60: 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
ac70: 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
ac80: 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
ac90: 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
aca0: 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
acb0: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
acc0: 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
acd0: 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20   cell..  */.  v 
ace0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
acf0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
ad00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ad10: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
ad20: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
ad30: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
ad40: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ames(pParse, p->
ad50: 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70  base, p->pSrc, p
ad60: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
ad70: 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
ad80: 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
ad90: 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
ada0: 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
adb0: 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
adc0: 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
add0: 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
ade0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
adf0: 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
ae00: 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
ae10: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
ae20: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
ae30: 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
ae40: 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
ae50: 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
ae60: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
ae70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
ae80: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
ae90: 69 65 64 20 26 26 20 28 70 50 61 72 73 65 2d 3e  ied && (pParse->
aea0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
aeb0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
aec0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
aed0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
aee0: 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65  fyCookie, pParse
aef0: 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  ->db->schema_coo
af00: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  kie, 0);.    pPa
af10: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
af20: 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6f  ied = 1;.  }.  o
af30: 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73  penOp = pTab->is
af40: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75  Temp ? OP_OpenAu
af50: 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20 62  x : OP_Open;.  b
af60: 61 73 65 20 3d 20 70 2d 3e 62 61 73 65 3b 0a 20  ase = p->base;. 
af70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
af80: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65  (v, openOp, base
af90: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
afa0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
afb0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
afc0: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
afd0: 43 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  C);.  if( pIdx==
afe0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
aff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
b000: 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
b010: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b020: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
b030: 65 6e 4f 70 2c 20 62 61 73 65 2b 31 2c 20 70 49  enOp, base+1, pI
b040: 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73  dx->tnum);.    s
b050: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b060: 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a  3(v, -1, pIdx->z
b070: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
b080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
b090: 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
b0a0: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
b0b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b0c0: 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c  (v, OP_IdxRecno,
b0d0: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
b0e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b0f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
b100: 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  se+1, 0);.    sq
b110: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b120: 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65   OP_MoveTo, base
b130: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73  , 0);.  }.  eLis
b140: 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d  t.nExpr = 1;.  m
b150: 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d  emset(&eListItem
b160: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73  , 0, sizeof(eLis
b170: 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74  tItem));.  eList
b180: 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b  .a = &eListItem;
b190: 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45  .  eList.a[0].pE
b1a0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 63  xpr = pExpr;.  c
b1b0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
b1c0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
b1d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
b1e0: 70 50 61 72 73 65 2c 20 26 65 4c 69 73 74 2c 20  pParse, &eList, 
b1f0: 62 61 73 65 2c 20 31 2c 20 30 2c 20 2d 31 2c 20  base, 1, 0, -1, 
b200: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f  eDest, iParm, co
b210: 6e 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  nt, cont);.  sql
b220: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b230: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
b240: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b250: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
b260: 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  e, 0);.  return 
b270: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  1;.}../*.** Gene
b280: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
b290: 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
b2a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
b2b0: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
b2c0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
b2d0: 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
b2e0: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
b2f0: 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
b300: 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
b310: 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
b320: 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
b330: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
b340: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
b370: 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
b380: 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
b390: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
b3a0: 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
b3b0: 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
b3c0: 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
b3d0: 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
b3e0: 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
b3f0: 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
b400: 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
b410: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
b420: 20 61 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61   as keys of a ta
b430: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
b440: 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
b450: 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
b460: 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
b470: 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
b480: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
b490: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
b4a0: 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
b4b0: 76 65 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20  ve results form 
b4c0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
b4d0: 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
b4e0: 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
b4f0: 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
b500: 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
b510: 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
b520: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b530: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
b540: 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
b550: 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
b560: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
b570: 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
b580: 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
b590: 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
b5a0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
b5b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b5c0: 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
b5d0: 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
b5e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
b5f0: 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
b600: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
b610: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
b620: 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
b630: 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
b640: 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
b650: 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
b660: 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
b670: 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
b680: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
b690: 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
b6a0: 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
b6b0: 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
b6c0: 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
b6d0: 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
b6e0: 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
b6f0: 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
b700: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
b710: 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
b720: 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
b730: 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
b740: 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
b750: 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
b760: 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
b770: 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
b780: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
b790: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
b7a0: 74 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  teSelect(.  Pars
b7b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b7c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
b7d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b7e0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b7f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
b800: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
b810: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
b820: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
b830: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a        /* One of:
b840: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65   SRT_Callback Me
b850: 6d 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65  m Set Union Exce
b860: 70 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  pt */.  int iPar
b870: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
b880: 2a 20 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e  * Save result in
b890: 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63   this memory loc
b8a0: 61 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f  ation, if >=0 */
b8b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
b8c0: 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
b8d0: 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
b8e0: 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
b8f0: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
b900: 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
b910: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
b920: 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
b930: 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
b940: 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
b950: 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg        /* Tru
b960: 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
b970: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
b980: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tions */.){.  in
b990: 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
b9a0: 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
b9b0: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
b9c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
b9d0: 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
b9e0: 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
b9f0: 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
ba00: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
ba10: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
ba20: 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
ba30: 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
ba40: 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
ba50: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
ba60: 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
ba70: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
ba80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
ba90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
baa0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
bab0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
bac0: 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
bad0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
bae0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
baf0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
bb00: 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
bb10: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bb20: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
bb30: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
bb40: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
bb50: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
bb60: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
bb70: 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
bb80: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
bb90: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
bba0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
bbb0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
bbc0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
bbd0: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
bbe0: 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
bbf0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
bc00: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
bc10: 20 20 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f    /* First curso
bc20: 72 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  r available for 
bc30: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  use */.  int rc 
bc40: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
bc50: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
bc60: 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
bc70: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
bc80: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
bc90: 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
bca0: 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
bcb0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49  eturn 1;..  /* I
bcc0: 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
bcd0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
bce0: 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
bcf0: 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
bd00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
bd10: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
bd20: 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
bd30: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
bd40: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , iParm);.  }.. 
bd50: 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
bd60: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
bd70: 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
bd80: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
bd90: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
bda0: 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
bdb0: 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65  >pWhere;.  pOrde
bdc0: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
bdd0: 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  y;.  pGroupBy = 
bde0: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
bdf0: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
be00: 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  ing;.  isDistinc
be10: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
be20: 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
be30: 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42  e a block of VDB
be40: 45 20 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66  E cursors, one f
be50: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
be60: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
be70: 2e 0a 20 20 2a 2a 20 54 68 65 20 57 48 45 52 45  ..  ** The WHERE
be80: 20 70 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75   processing requ
be90: 69 72 65 73 20 74 68 61 74 20 74 68 65 20 63 75  ires that the cu
bea0: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61  rsors for the ta
beb0: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
bec0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 65 20   FROM clause be 
bed0: 63 6f 6e 73 65 63 75 74 69 76 65 2e 0a 20 20 2a  consecutive..  *
bee0: 2f 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61  /.  base = p->ba
bef0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  se = pParse->nTa
bf00: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
bf10: 62 20 2b 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e  b += pTabList->n
bf20: 53 72 63 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  Src;..  /* .  **
bf30: 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
bf40: 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
bf50: 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
bf60: 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
bf70: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
bf80: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
bf90: 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
bfa0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
bfb0: 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
bfc0: 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  t_end;..  /* Loo
bfd0: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
bfe0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
bff0: 73 74 20 61 6e 64 20 63 72 65 61 74 65 20 61 6e  st and create an
c000: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a   appropriate.  *
c010: 2a 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e 20  * columnlist in 
c020: 70 45 4c 69 73 74 20 69 66 20 74 68 65 72 65 20  pEList if there 
c030: 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 64  isn't one alread
c040: 79 2e 20 20 28 54 68 65 20 70 61 72 73 65 72 20  y.  (The parser 
c050: 6c 65 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e 55  leaves.  ** a NU
c060: 4c 4c 20 69 6e 20 74 68 65 20 70 2d 3e 70 45 4c  LL in the p->pEL
c070: 69 73 74 20 69 66 20 74 68 65 20 53 51 4c 20 73  ist if the SQL s
c080: 61 69 64 20 22 53 45 4c 45 43 54 20 2a 20 46 52  aid "SELECT * FR
c090: 4f 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20  OM ...").  */.  
c0a0: 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
c0b0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20  List(pParse, p) 
c0c0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
c0d0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57  ct_end;.  }.  pW
c0e0: 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
c0f0: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
c100: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
c110: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
c120: 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
c130: 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
c140: 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
c150: 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
c160: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
c170: 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
c180: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
c190: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
c1a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
c1b0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
c1c0: 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
c1d0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
c1e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e  se->zErrMsg, "on
c1f0: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
c200: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
c210: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
c220: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
c230: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
c240: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
c250: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
c260: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
c270: 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42   }..  /* ORDER B
c280: 59 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  Y is ignored if 
c290: 77 65 20 61 72 65 20 6e 6f 74 20 73 65 6e 64 69  we are not sendi
c2a0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f  ng the result to
c2b0: 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a   a callback..  *
c2c0: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 21 3d 53  /.  if( eDest!=S
c2d0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
c2e0: 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
c2f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
c300: 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f  is point, we sho
c310: 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74  uld have allocat
c320: 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f  ed all the curso
c330: 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  rs that we.  ** 
c340: 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73  need to handle s
c350: 75 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d  ubquerys and tem
c360: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
c370: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c  .  **.  ** Resol
c380: 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ve the column na
c390: 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d  mes and do a sem
c3a0: 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20  antics check on 
c3b0: 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
c3c0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
c3d0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
c3e0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c3f0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
c400: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
c410: 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c   base, pTabList,
c420: 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   0, pEList->a[i]
c430: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
c440: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
c450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c460: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
c470: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
c480: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26  a[i].pExpr, 1, &
c490: 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
c4a0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
c4b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c4c0: 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69   pWhere ){.    i
c4d0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
c4e0: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
c4f0: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
c500: 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65 29 20  pEList, pWhere) 
c510: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
c520: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
c530: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
c540: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
c550: 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b  pWhere, 0, 0) ){
c560: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
c570: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
c580: 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  }.  if( pOrderBy
c590: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c5a0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
c5b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
c5c0: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
c5d0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
c5e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c5f0: 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  eExprIsConstant(
c600: 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pE) ){.        s
c610: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c620: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
c630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22   .             "
c640: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
c650: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ions should not 
c660: 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30 29  be constant", 0)
c670: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
c680: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
c690: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
c6a0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c6b0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
c6c0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
c6d0: 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  , base, pTabList
c6e0: 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b  , pEList, pE) ){
c6f0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
c700: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c710: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
c720: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
c730: 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30  se, pE, isAgg, 0
c740: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
c750: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
c760: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c770: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
c780: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
c790: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
c7a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
c7b0: 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42  pr *pE = pGroupB
c7c0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
c7d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
c7e0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
c7f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
c800: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
c810: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a  arse->zErrMsg, .
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52               "GR
c830: 4f 55 50 20 42 59 20 65 78 70 72 65 73 73 69 6f  OUP BY expressio
c840: 6e 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ns should not be
c850: 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a   constant", 0);.
c860: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
c870: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
c880: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
c890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c8a0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
c8b0: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
c8c0: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
c8d0: 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
c8e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
c8f0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c900: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c910: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
c920: 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
c930: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c940: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
c960: 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
c970: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
c980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c990: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
c9a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61  rse->zErrMsg, "a
c9b0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
c9c0: 20 69 73 20 72 65 71 75 69 72 65 64 20 22 0a 20   is required ". 
c9d0: 20 20 20 20 20 20 20 20 22 62 65 66 6f 72 65 20          "before 
c9e0: 48 41 56 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  HAVING", 0);.   
c9f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
ca00: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  +;.      goto se
ca10: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
ca20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
ca30: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
ca40: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
ca50: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61  ist, pEList, pHa
ca60: 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
ca70: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
ca80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
ca90: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
caa0: 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 69  arse, pHaving, i
cab0: 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
cac0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
cad0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
cae0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
caf0: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
cb00: 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
cb10: 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74  ) function by it
cb20: 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65  self.  ** in the
cb30: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
cb40: 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  /.  if( simpleMi
cb50: 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
cb60: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
cb70: 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  m) ){.    rc = 0
cb80: 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
cb90: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
cba0: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
cbb0: 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
cbc0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
cbd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
cbe0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
cbf0: 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64  ct_end;..  /* Id
cc00: 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
cc10: 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
cc20: 65 20 75 73 69 6e 67 20 69 6e 20 74 68 65 20 63  e using in the c
cc30: 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
cc40: 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
cc50: 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
cc60: 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
cc70: 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72  table or a memor
cc80: 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  y cell..  */.  i
cc90: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
cca0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
ccb0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ccc0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
ccd0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
cce0: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
ccf0: 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 0a  Set the limiter.
cd00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
cd10: 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70  imit<=0 ){.    p
cd20: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
cd30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
cd40: 70 2d 3e 6e 4f 66 66 73 65 74 3c 30 20 29 20 70  p->nOffset<0 ) p
cd50: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
cd60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cd70: 4f 70 28 76 2c 20 4f 50 5f 4c 69 6d 69 74 2c 20  Op(v, OP_Limit, 
cd80: 70 2d 3e 6e 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4f  p->nLimit, p->nO
cd90: 66 66 73 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ffset);.  }..  /
cda0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cdb0: 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
cdc0: 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
cdd0: 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  clause.  */.  fo
cde0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
cdf0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
ce00: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
ce10: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
ce20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ce30: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
ce40: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
ce50: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
ce60: 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61 73  T_TempTable, bas
ce70: 65 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e+i,.           
ce80: 20 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73 41        p, i, &isA
ce90: 67 67 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  gg);.    pTabLis
cea0: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
ceb0: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
cec0: 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ere;.    if( eDe
ced0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
cee0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
cef0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
cf00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
cf10: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
cf20: 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
cf30: 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
cf40: 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
cf50: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
cf60: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
cf70: 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
cf80: 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  a subquery that 
cf90: 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65  can be "flattene
cfa0: 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  d" into its pare
cfb0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74  nt..  ** If flat
cfc0: 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73  tening is a poss
cfd0: 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e  iblity, do so an
cfe0: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
cff0: 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  tely.  .  */.  i
d000: 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
d010: 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
d020: 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
d030: 79 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  y(pParent, paren
d040: 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67  tTab, *pParentAg
d050: 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  g, isAgg) ){.   
d060: 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50   if( isAgg ) *pP
d070: 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20  arentAgg = 1;.  
d080: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d090: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
d0a0: 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
d0b0: 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
d0c0: 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
d0d0: 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
d0e0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
d0f0: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
d100: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d110: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
d120: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  iParm, 0);.  }..
d130: 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79    /* Do an analy
d140: 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65  sis of aggregate
d150: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
d160: 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65  */.  sqliteAggre
d170: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50  gateInfoReset(pP
d180: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41  arse);.  if( isA
d190: 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
d1a0: 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d  ( pParse->nAgg==
d1b0: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
d1c0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d1d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
d1e0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
d1f0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
d200: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
d210: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
d220: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
d230: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
d240: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
d250: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66  oupBy ){.      f
d260: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
d270: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
d280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
d290: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
d2a0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
d2b0: 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
d2c0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
d2d0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
d2e0: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
d2f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d300: 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20   if( pHaving && 
d310: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
d320: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
d330: 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  se, pHaving) ){.
d340: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
d350: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
d360: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
d370: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
d380: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
d390: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
d3a0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41   if( sqliteExprA
d3b0: 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
d3c0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
d3d0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
d3e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
d3f0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
d400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d410: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
d420: 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
d430: 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  tor.  */.  if( i
d440: 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  sAgg ){.    sqli
d450: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d460: 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20 70  P_AggReset, 0, p
d470: 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20  Parse->nAgg);.  
d480: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
d490: 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
d4a0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
d4b0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28  pFunc;.      if(
d4c0: 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65   (pFunc = pParse
d4d0: 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29  ->aAgg[i].pFunc)
d4e0: 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46  !=0 && pFunc->xF
d4f0: 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20  inalize!=0 ){.  
d500: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49  AddOp(v, OP_AggI
d520: 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20  nit, 0, i);.    
d530: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
d540: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
d550: 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50  har*)pFunc, P3_P
d560: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 7d  OINTER);.      }
d570: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d580: 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
d590: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d5a0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
d5b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
d5c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d5d0: 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
d5e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
d5f0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
d600: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
d610: 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20   to NULL.  */.  
d620: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
d630: 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  em ){.    sqlite
d640: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d650: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
d660: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d670: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
d680: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
d690: 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74  }..  /* Open a t
d6a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
d6b0: 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
d6c0: 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
d6d0: 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
d6e0: 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  t ){.    distinc
d6f0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
d700: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  ++;.    sqliteVd
d710: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
d720: 65 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74  enTemp, distinct
d730: 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
d740: 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
d750: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
d760: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
d770: 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  can.  */.  pWInf
d780: 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42  o = sqliteWhereB
d790: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 2d 3e  egin(pParse, p->
d7a0: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
d7b0: 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 69 66  pWhere, 0);.  if
d7c0: 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
d7d0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
d7e0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
d7f0: 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
d800: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
d810: 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
d820: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
d830: 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
d840: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
d850: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
d860: 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
d870: 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
d880: 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
d890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8a0: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
d8b0: 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
d8c0: 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20  iBreak) ){.     
d8d0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
d8e0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
d8f0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61  /* If we are dea
d900: 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67  ling with aggreg
d910: 61 74 65 73 2c 20 74 68 65 6e 20 74 6f 20 74 68  ates, then to th
d920: 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67  e special aggreg
d930: 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  ate.  ** process
d940: 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c  ing.  .  */.  el
d950: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  se{.    if( pGro
d960: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
d970: 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f  t lbl1;.      fo
d980: 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
d990: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
d9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
d9b0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d9c0: 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
d9d0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
d9e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d9f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
da00: 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  y, pGroupBy->nEx
da10: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62  pr, 0);.      lb
da20: 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l1 = sqliteVdbeM
da30: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
da40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
da50: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
da60: 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  s, 0, lbl1);.   
da70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
da80: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
da90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
daa0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
dab0: 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
dac0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
dad0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dae0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
daf0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
db00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
db10: 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20  , OP_AggSet, 0, 
db20: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
db30: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
db40: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31  lveLabel(v, lbl1
db50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
db60: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
db70: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
db80: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
db90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
dba0: 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67  f( !pParse->aAgg
dbb0: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
dbc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d  inue;.      pE =
dbd0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
dbe0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
dbf0: 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b  sert( pE->op==TK
dc00: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
dc10: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
dc20: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
dc30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70  for(j=0; j<pE->p
dc40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
dc50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
dc60: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
dc70: 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61  se, pE->pList->a
dc80: 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
dc90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dca0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dcb0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
dcc0: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
dcd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dce0: 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30  v, OP_AggFunc, 0
dcf0: 2c 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45  , pE->pList ? pE
dd00: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
dd10: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
dd20: 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  t( pParse->aAgg[
dd30: 69 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  i].pFunc!=0 );. 
dd40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
dd50: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
dd60: 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a  nc->xStep!=0 );.
dd70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
dd80: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
dd90: 28 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 61  (char*)pParse->a
dda0: 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33  Agg[i].pFunc, P3
ddb0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
ddc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  .  }..  /* End t
ddd0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
dde0: 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
ddf0: 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70 57 49  liteWhereEnd(pWI
de00: 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nfo);..  /* If w
de10: 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67  e are processing
de20: 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20   aggregates, we 
de30: 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61  need to set up a
de40: 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a   second loop.  *
de50: 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  * over all of th
de60: 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75  e aggregate valu
de70: 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  es and process t
de80: 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hem..  */.  if( 
de90: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74  isAgg ){.    int
dea0: 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65   endagg = sqlite
deb0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
dec0: 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61  ;.    int starta
ded0: 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67  gg;.    startagg
dee0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
def0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74  Op(v, OP_AggNext
df00: 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  , 0, endagg);.  
df10: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
df20: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48   = 1;.    if( pH
df30: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
df40: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
df50: 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
df60: 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b 0a  , startagg, 1);.
df70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65      }.    if( se
df80: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
df90: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30 2c  arse, pEList, 0,
dfa0: 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
dfb0: 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69  stinct, eDest, i
dfc0: 50 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  Parm,.          
dfd0: 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 61            starta
dfe0: 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20  gg, endagg) ){. 
dff0: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
e000: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
e010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e020: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
e030: 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71  tartagg);.    sq
e040: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
e050: 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b  abel(v, endagg);
e060: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
e070: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
e080: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72   0, 0);.    pPar
e090: 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
e0a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e0b0: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
e0c0: 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
e0d0: 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
e0e0: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
e0f0: 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
e100: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
e110: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
e120: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
e130: 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
e140: 74 54 61 69 6c 28 76 2c 20 70 45 4c 69 73 74 2d  tTail(v, pEList-
e150: 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 0a 20  >nExpr);.  }... 
e160: 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
e170: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
e180: 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
e190: 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
e1a0: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
e1b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e1c0: 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d  _NullCallback)!=
e1d0: 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f  0 && eDest==SRT_
e1e0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
e1f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e200: 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
e210: 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ck, pEList->nExp
e220: 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 0);.  }..  /*
e230: 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
e240: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
e250: 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
e260: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
e270: 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
e280: 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
e290: 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
e2a0: 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
e2b0: 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
e2c0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
e2d0: 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
e2e0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
e2f0: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
e300: 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
e310: 74 5f 65 6e 64 3a 0a 20 20 70 50 61 72 73 65 2d  t_end:.  pParse-
e320: 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20  >nTab = base;.  
e330: 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
e340: 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
e350: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e360: 0a                                               .