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

Artifact 3eadcde4c74341d8ee7db69948cbcb16df9ae9fc:


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 39 35 20  select.c,v 1.95 
0200: 32 30 30 32 2f 30 36 2f 32 30 20 30 33 3a 33 38  2002/06/20 03:38
0210: 3a 32 36 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :26 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 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
2160: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
2170: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
2180: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
2190: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
21a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
21b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
21c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73  hOntoSorter(Pars
21d0: 65 20 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20  e *pParse, Vdbe 
21e0: 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *v, ExprList *pO
21f0: 72 64 65 72 42 79 29 7b 0a 20 20 63 68 61 72 20  rderBy){.  char 
2200: 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 69  *zSortOrder;.  i
2210: 6e 74 20 69 3b 0a 20 20 7a 53 6f 72 74 4f 72 64  nt i;.  zSortOrd
2220: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
2230: 63 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  c( pOrderBy->nEx
2240: 70 72 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  pr + 1 );.  if( 
2250: 7a 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20  zSortOrder==0 ) 
2260: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2270: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
2280: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2290: 7a 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  zSortOrder[i] = 
22a0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
22b0: 6f 72 74 4f 72 64 65 72 20 3f 20 27 2d 27 20 3a  ortOrder ? '-' :
22c0: 20 27 2b 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   '+';.    sqlite
22d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
22e0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
22f0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 7a 53  pExpr);.  }.  zS
2300: 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65 72 42  ortOrder[pOrderB
2310: 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20  y->nExpr] = 0;. 
2320: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2330: 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b  (v, OP_SortMakeK
2340: 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ey, pOrderBy->nE
2350: 78 70 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  xpr, 0);.  sqlit
2360: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2370: 20 2d 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72 2c   -1, zSortOrder,
2380: 20 73 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72 64   strlen(zSortOrd
2390: 65 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  er));.  sqliteFr
23a0: 65 65 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b 0a  ee(zSortOrder);.
23b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
23c0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c  p(v, OP_SortPut,
23d0: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
23e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
23f0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2400: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2410: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2420: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 4c 69  ..**.** The pELi
2440: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
2450: 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
2460: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
2470: 6d 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65 73  mn in the.** res
2480: 75 6c 74 20 72 6f 77 2e 20 20 45 78 63 65 70 74  ult row.  Except
2490: 20 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c    if pEList==NUL
24a0: 4c 2c 20 74 68 65 6e 20 77 65 20 6a 75 73 74 20  L, then we just 
24b0: 72 65 61 64 20 6e 43 6f 6c 75 6d 6e 0a 2a 2a 20  read nColumn.** 
24c0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  elements from th
24d0: 65 20 73 72 63 54 61 62 20 74 61 62 6c 65 2e 0a  e srcTab table..
24e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
24f0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2500: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2510: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2520: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2530: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2550: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2560: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2570: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2590: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
25a0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
25b0: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
25c0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
25d0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
25e0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
25f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2600: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2610: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2620: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2630: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2640: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2650: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2660: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2670: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2680: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2690: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
26a0: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
26b0: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
26c0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
26d0: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
26e0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
26f0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2700: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2710: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2720: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2730: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2740: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2750: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2760: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2770: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2780: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2790: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
27a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
27b0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
27c0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
27d0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
27e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
27f0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2800: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
2810: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
2820: 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49  there was a LIMI
2830: 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  T clause on the 
2840: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2850: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68  , then do the ch
2860: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
2870: 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75  if this row shou
2880: 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ld be output..  
2890: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
28a0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  y==0 ){.    if( 
28b0: 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a  p->nOffset>0 ){.
28c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
28d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 6d 69  AddOp(v, OP_Limi
28e0: 74 43 6b 2c 20 31 2c 20 69 43 6f 6e 74 69 6e 75  tCk, 1, iContinu
28f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2900: 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 30 20 29 7b  ( p->nLimit>0 ){
2910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
2920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 6d  eAddOp(v, OP_Lim
2930: 69 74 43 6b 2c 20 30 2c 20 69 42 72 65 61 6b 29  itCk, 0, iBreak)
2940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2950: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
2960: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
2970: 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  */.  if( pEList 
2980: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
2990: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
29a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
29b0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
29c0: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
29d0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
29e0: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c     nColumn = pEL
29f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65  ist->nExpr;.  }e
2a00: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
2a10: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
2a20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
2a30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
2a40: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
2a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2a60: 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e  /* If the DISTIN
2a70: 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70  CT keyword was p
2a80: 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45  resent on the SE
2a90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
2aa0: 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77   ** and this row
2ab0: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62   has been seen b
2ac0: 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e  efore, then do n
2ad0: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77  ot make this row
2ae0: 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  .  ** part of th
2af0: 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
2b00: 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d 30   if( distinct>=0
2b10: 20 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45   && pEList && pE
2b20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
2b30: 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  .#if NULL_ALWAYS
2b40: 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 73 71  _DISTINCT.    sq
2b50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2b60: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c   OP_IsNull, -pEL
2b70: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c 69  ist->nExpr, sqli
2b80: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
2b90: 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a  r(v)+7);.#endif.
2ba0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2bb0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
2bc0: 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  y, pEList->nExpr
2bd0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
2be0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2bf0: 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e  Distinct, distin
2c00: 63 74 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75  ct, sqliteVdbeCu
2c10: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
2c20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
2c30: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
2c40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c  pEList->nExpr+1,
2c50: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
2c60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
2c70: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
2c80: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  e);.    sqliteVd
2c90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
2ca0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
2cb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2cc0: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
2cd0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a  , distinct, 0);.
2ce0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
2cf0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
2d00: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
2d10: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
2d20: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
2d30: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
2d40: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
2d50: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
2d60: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
2d70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
2d80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
2d90: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
2da0: 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  n, NULL_ALWAYS_D
2db0: 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20  ISTINCT);.      
2dc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2dd0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
2de0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2df0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2e00: 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72  _PutStrKey, iPar
2e10: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
2e20: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
2e30: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
2e40: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
2e50: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
2e60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
2e70: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
2e80: 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  se SRT_TempTable
2e90: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
2ea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2eb0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
2ec0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
2ed0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
2ee0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
2ef0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
2f00: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
2f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2f30: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
2f40: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
2f50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2f60: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
2f70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
2f80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2f90: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
2fa0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
2fb0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
2fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
2fd0: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
2fe0: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
2ff0: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
3000: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
3010: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
3020: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
3030: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
3040: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
3050: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
3060: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3070: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3080: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
3090: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
30a0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
30b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
30c0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
30d0: 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  , NULL_ALWAYS_DI
30e0: 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73  STINCT);.      s
30f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3100: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
3110: 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20  Parm, addr+3);. 
3120: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3130: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
3140: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
3150: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3160: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
3170: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
3180: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
3190: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
31a0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
31b0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
31c0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
31d0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
31e0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
31f0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
3200: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
3210: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
3220: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3230: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
3240: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
3250: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
3260: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3270: 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  P_IsNull, -1, sq
3280: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
3290: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
32a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
32b0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
32c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
32d0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
32e0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
32f0: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3300: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3320: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3330: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69   OP_PutStrKey, i
3340: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3350: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3360: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3370: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
3380: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
3390: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
33a0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
33b0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
33c0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
33d0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
33e0: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
33f0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
3400: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
3410: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
3420: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3430: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3440: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3450: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3460: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3470: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3480: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3490: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
34b0: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
34c0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
34d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
34e0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
34f0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3510: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
3520: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
3530: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
3540: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
3550: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
3560: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
3570: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
3580: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
3590: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
35a0: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
35b0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
35c0: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
35d0: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
35e0: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
35f0: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
3600: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
3610: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
3620: 73 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a 20  se SRT_Discard: 
3630: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
3640: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3650: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
3660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3670: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20   }..    /* Send 
3680: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
3690: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
36a0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  n..    */.    de
36b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
36c0: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
36d0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  T_Callback );.  
36e0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
36f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3700: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3710: 50 5f 53 6f 72 74 4d 61 6b 65 52 65 63 2c 20 6e  P_SortMakeRec, n
3720: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
3730: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3740: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3750: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3770: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3780: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43   OP_Callback, nC
3790: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
37a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
37b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
37c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
37d0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
37e0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
37f0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
3800: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
3810: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
3820: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
3830: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
3840: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
3850: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
3860: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
3870: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
3880: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
3890: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
38a0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
38b0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
38c0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
38d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
38e0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
38f0: 69 6c 28 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  il(.  Select *p,
3900: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
3910: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
3920: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
3930: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3940: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3950: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
3960: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75  olumn,     /* Nu
3970: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3980: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  of data */.  int
3990: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a   eDest,       /*
39a0: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
39b0: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
39c0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20  /.  int iParm   
39d0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
39e0: 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63   parameter assoc
39f0: 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73 74  iated with eDest
3a00: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64   */.){.  int end
3a10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
3a20: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
3a30: 20 61 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 56   addr;.  sqliteV
3a40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3a50: 6f 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64  ort, 0, 0);.  ad
3a60: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
3a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e  ddOp(v, OP_SortN
3a80: 65 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20  ext, 0, end);.  
3a90: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
3aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
3ab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69  beAddOp(v, OP_Li
3ac0: 6d 69 74 43 6b 2c 20 31 2c 20 61 64 64 72 29 3b  mitCk, 1, addr);
3ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  .  }.  if( p->nL
3ae0: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  imit>0 ){.    sq
3af0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3b00: 20 4f 50 5f 4c 69 6d 69 74 43 6b 2c 20 30 2c 20   OP_LimitCk, 0, 
3b10: 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  end);.  }.  swit
3b20: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
3b30: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
3b40: 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck: {.      sqli
3b50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3b60: 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20  P_SortCallback, 
3b70: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3b90: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
3ba0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
3bb0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
3bc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3bd0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
3be0: 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  no, iParm, 0);. 
3bf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3c00: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
3c10: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
3c20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3c30: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
3c40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3c60: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
3c70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
3c80: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
3c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3ca0: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
3cb0: 20 2d 31 2c 20 73 71 6c 69 74 65 56 64 62 65 43   -1, sqliteVdbeC
3cc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
3cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3ce0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3cf0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
3d00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3d10: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
3d20: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
3d30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d40: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
3d50: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3d60: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3d70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3d80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
3d90: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
3da0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
3dc0: 6f 74 6f 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20  oto, 0, end);.  
3dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3de0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3df0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
3e00: 64 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 6e 6e 6f  d==0 ); /* Canno
3e10: 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  t happen */.    
3e20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3e30: 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41   }.  sqliteVdbeA
3e40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3e50: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
3e60: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
3e70: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73  bel(v, end);.  s
3e80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3e90: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
3ea0: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
3eb0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
3ec0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
3ed0: 20 56 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63   VDBE how many c
3ee0: 6f 6c 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20  olumns there.** 
3ef0: 61 72 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  are in the resul
3f00: 74 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66  t and the name f
3f10: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20  or each column. 
3f20: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
3f30: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20  n.** is used to 
3f40: 70 72 6f 76 69 64 65 20 22 61 72 67 63 22 20 61  provide "argc" a
3f50: 6e 64 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c  nd "azCol[]" val
3f60: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
3f70: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
3f80: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
3f90: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
3fa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
3fb0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42            /* VDB
3fe0: 45 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  E cursor corresp
3ff0: 6f 6e 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20  onding to first 
4000: 65 6e 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73  entry in pTabLis
4010: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
4020: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
4030: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
4040: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
4050: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
4060: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
4070: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
4080: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4090: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
40a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
40b0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
40c0: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69   || v==0 || sqli
40d0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
40e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
40f0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
4100: 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 56 64   = 1;.  sqliteVd
4110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4120: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69 73  lumnCount, pELis
4130: 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->nExpr, 0);.  
4140: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
4150: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
4160: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
4170: 20 69 6e 74 20 73 68 6f 77 46 75 6c 6c 4e 61 6d   int showFullNam
4180: 65 73 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  es;.    if( pELi
4190: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
41a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
41b0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
41c0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
41d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
41e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
41f0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
4200: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
4210: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
4220: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
4230: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4240: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 45      }.    p = pE
4250: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
4260: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
4270: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
4280: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  howFullNames = (
4290: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
42a0: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
42b0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 20  olNames)!=0;.   
42c0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
42d0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26  & p->span.z[0] &
42e0: 26 20 21 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73  & !showFullNames
42f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
4300: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
4310: 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e  ddOp(v,OP_Column
4320: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
4330: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
4340: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
4350: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
4360: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
4370: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
4380: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
4390: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
43a0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54  =TK_COLUMN && pT
43b0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
43c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
43d0: 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61  abList->a[p->iTa
43e0: 62 6c 65 20 2d 20 62 61 73 65 5d 2e 70 54 61 62  ble - base].pTab
43f0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
4400: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
4410: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
4420: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
4430: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
4440: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
4450: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
4460: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
4470: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
4480: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 69  ;.      zCol = i
4490: 43 6f 6c 3c 30 20 3f 20 22 5f 52 4f 57 49 44 5f  Col<0 ? "_ROWID_
44a0: 22 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  " : pTab->aCol[i
44b0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
44c0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
44d0: 6e 53 72 63 3e 31 20 7c 7c 20 73 68 6f 77 46 75  nSrc>1 || showFu
44e0: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
44f0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
4500: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
4510: 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20   *zTab;. .      
4520: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
4530: 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d  t->a[p->iTable -
4540: 20 62 61 73 65 5d 2e 7a 41 6c 69 61 73 3b 0a 20   base].zAlias;. 
4550: 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 46         if( showF
4560: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62  ullNames || zTab
4570: 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61  ==0 ) zTab = pTa
4580: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
4590: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
45a0: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
45b0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  ".", zCol, 0);. 
45c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
45d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
45e0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
45f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4600: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
4610: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
4620: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
4630: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4640: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
4650: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4670: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29  olumnName, i, 0)
4680: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4690: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
46a0: 2d 31 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  -1, zCol, 0);.  
46b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
46c0: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
46d0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
46e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
46f0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
4700: 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  p(v,OP_ColumnNam
4710: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
4720: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
4730: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61  P3(v, -1, p->spa
4740: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
4750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4760: 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76  eCompressSpace(v
4770: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c  , addr);.    }el
4780: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
4790: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
47a0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
47b0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
47c0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
47d0: 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20   sprintf(zName, 
47e0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
47f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4810: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
4820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4830: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
4840: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
4850: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
4860: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  }.}../*.** Name 
4870: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
4880: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
4890: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
48a0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
48b0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
48c0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
48d0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
48e0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
48f0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
4900: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
4910: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
4920: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
4930: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
4940: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
4950: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
4960: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
4970: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
4980: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
4990: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
49a0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
49b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
49d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
49e0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
49f0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
4a00: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
4a10: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
4a20: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
4a30: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 52  /.Table *sqliteR
4a40: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
4a50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4a60: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
4a70: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
4a80: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
4a90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
4aa0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
4ab0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
4ac0: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73  nColumnList(Pars
4ad0: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 20  e*, Select*);.. 
4ae0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
4af0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
4b00: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
4b10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
4b20: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
4b30: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
4b40: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
4b50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4b60: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a  0;.  }.  pTab->z
4b70: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
4b80: 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  ? sqliteStrDup(z
4b90: 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20  TabName) : 0;.  
4ba0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
4bb0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62  ->pEList;.  pTab
4bc0: 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ->nCol = pEList-
4bd0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
4be0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
4bf0: 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d  ;.  pTab->aCol =
4c00: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
4c10: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
4c20: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
4c30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4c40: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
4c50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
4c60: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
4c70: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
4c80: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
4c90: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
4ca0: 74 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  trDup(pEList->a[
4cb0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
4cc0: 65 6c 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69  else if( (p=pELi
4cd0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
4ce0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
4cf0: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
4d00: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4d10: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
4d20: 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e  .zName, p->span.
4d30: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29  z, p->span.n, 0)
4d40: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d50: 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  p->op==TK_DOT &&
4d60: 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20 70 2d   p->pRight && p-
4d70: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
4d80: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 70   &&.           p
4d90: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
4da0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
4db0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
4dc0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
4dd0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
4de0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
4df0: 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  n.z, p->pRight->
4e00: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
4e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
4e20: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
4e30: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
4e40: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
4e50: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
4e60: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  Col[i].zName = s
4e70: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42 75 66  qliteStrDup(zBuf
4e80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
4e90: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
4ea0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
4eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
4ec0: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
4ed0: 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65  atement, do thre
4ee0: 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  e things..**.** 
4ef0: 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20     (1)  Fill in 
4f00: 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
4f10: 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
4f20: 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
4f30: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
4f40: 66 69 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66  fines the set of
4f50: 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f   tables that sho
4f60: 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20  uld be scanned. 
4f70: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
4f80: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
4f90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
4fa0: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
4fb0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
4fc0: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
4fd0: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
4fe0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
4ff0: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
5000: 20 20 28 33 29 20 20 53 63 61 6e 20 74 68 65 20    (3)  Scan the 
5010: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
5020: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5030: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
5040: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
5050: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
5060: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
5070: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
5080: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
5090: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
50a0: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
50b0: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
50c0: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
50d0: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
50e0: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
50f0: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
5100: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
5110: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
5120: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
5130: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
5140: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
5150: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
5160: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
5170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5180: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
5190: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
51a0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
51b0: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
51c0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
51d0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
51e0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
51f0: 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  Tab;..  if( p==0
5200: 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29   || p->pSrc==0 )
5210: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61   return 1;.  pTa
5220: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
5230: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
5240: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  EList;..  /* Loo
5250: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
5260: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
5270: 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  st..  */.  for(i
5280: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
5290: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
52a0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
52b0: 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  i].pTab ){.     
52c0: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
52d0: 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21   has run before!
52e0: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e    No need to con
52f0: 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72  tinue */.      r
5300: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5310: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
5320: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
5330: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
5340: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
5350: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
5360: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
5370: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d  ssert( pTabList-
5380: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30  >a[i].pSelect!=0
5390: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
53a0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
53b0: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
53c0: 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65    char zFakeName
53d0: 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70  [60];.        sp
53e0: 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c  rintf(zFakeName,
53f0: 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
5400: 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20 20 20  y_%p_",.        
5410: 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62 4c 69     (void*)pTabLi
5420: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
5430: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5440: 65 53 65 74 53 74 72 69 6e 67 28 26 70 54 61 62  eSetString(&pTab
5450: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
5460: 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20 30 29  s, zFakeName, 0)
5470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5480: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
5490: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
54a0: 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 75        sqliteResu
54b0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
54c0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
54d0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20 20  a[i].zAlias,.   
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61       pTabList->a
5510: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
5520: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
5530: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
5540: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
5550: 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73     pTab->isTrans
5560: 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  ient = 1;.    }e
5570: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
5580: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
5590: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
55a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
55b0: 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73  */.      pTabLis
55c0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70  t->a[i].pTab = p
55d0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
55e0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70  qliteFindTable(p
55f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 4c  Parse->db, pTabL
5600: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
5610: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
5620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5630: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
5640: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
5650: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
5660: 20 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   ", .           
5670: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
5680: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
5690: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
56a0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
56b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
56c0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
56d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
56e0: 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  f( sqliteViewGet
56f0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
5700: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
5710: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5730: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
5740: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
5750: 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 61 62  teSelectDup(pTab
5760: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
5770: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
5780: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
5790: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
57a0: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
57b0: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
57c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
57d0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
57e0: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
57f0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
5800: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
5810: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
5820: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
5830: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
5840: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
5850: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
5860: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
5870: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
5880: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
5890: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
58a0: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
58b0: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
58c0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
58d0: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
58e0: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
58f0: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
5900: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
5910: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
5920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
5930: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
5940: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
5950: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
5960: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
5970: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
5980: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
5990: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
59a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
59b0: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
59c0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
59d0: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
59e0: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
59f0: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
5a00: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
5a10: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
5a20: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
5a30: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
5a40: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
5a50: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
5a60: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
5a70: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
5a80: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
5a90: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
5aa0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
5ab0: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
5ac0: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
5ad0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
5ae0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
5af0: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
5b00: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
5b10: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
5b20: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
5b30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5b40: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
5b50: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
5b60: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
5b70: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
5b80: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
5b90: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
5ba0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
5bb0: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
5bc0: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
5bd0: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
5be0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
5bf0: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
5c00: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
5c10: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
5c20: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
5c30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
5c40: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
5c50: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
5c60: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
5c70: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
5c80: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
5c90: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
5ca0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
5cb0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
5cc0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
5cd0: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
5ce0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
5cf0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
5d00: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
5d10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
5d20: 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  w = sqliteExprLi
5d30: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61  stAppend(pNew, a
5d40: 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
5d50: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
5d60: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
5d70: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
5d80: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  ;.        a[k].p
5d90: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
5da0: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
5db0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
5dd0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
5de0: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
5df0: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
5e00: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
5e10: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
5e20: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
5e30: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
5e40: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
5e50: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
5e60: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65      Token *pName
5e70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  ;           /* t
5e80: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
5e90: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
5ea0: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
5eb0: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
5ec0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61  ){.          pNa
5ed0: 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d  me = &pE->pLeft-
5ee0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
5ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5f00: 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   pName = 0;.    
5f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
5f20: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
5f30: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
5f40: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
5f50: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
5f60: 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[i].pTab;.    
5f70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
5f80: 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Name = pTabList-
5f90: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[i].zAlias;.  
5fa0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
5fb0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
5fc0: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
5fd0: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
5fe0: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
5ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6000: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
6010: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
6020: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
6030: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
6040: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
6050: 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a  trNICmp(pName->z
6060: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d  , zTabName, pNam
6070: 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20  e->n)!=0 ||.    
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61               zTa
6090: 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21  bName[pName->n]!
60a0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
60b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
60c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
60d0: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
60e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
60f0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
6100: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
6110: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
6120: 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  , *pLeft, *pRigh
6130: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
6140: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
6150: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
6160: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
6170: 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c  f( i>0 && (pTabL
6180: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e  ist->a[i-1].join
6190: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
61a0: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
61b0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
61c0: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
61d0: 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d  [i-1].pTab, zNam
61e0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
61f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
6200: 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
6210: 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
6220: 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
6230: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
6240: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
6250: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6260: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6270: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6280: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
6290: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64   sqliteIdListInd
62a0: 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  ex(pTabList->a[i
62b0: 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  -1].pUsing, zNam
62c0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
62d0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
62e0: 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
62f0: 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
6300: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
6310: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
6320: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
6330: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
6340: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
6350: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6360: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
6370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
6380: 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ght = sqliteExpr
6390: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
63a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
63b0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72  ( pRight==0 ) br
63c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
63d0: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a   pRight->token.z
63e0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
63f0: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
6400: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
6410: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
6420: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
6430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6440: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45   pLeft = sqliteE
6450: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
6460: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
6470: 20 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20     if( pLeft==0 
6480: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6490: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
64a0: 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65  ken.z = zTabName
64b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
64c0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  pLeft->token.n =
64d0: 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65   strlen(zTabName
64e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
64f0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45   pExpr = sqliteE
6500: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
6510: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
6530: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
6540: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
6550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6560: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
6570: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
6580: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
6590: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
65a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
65b0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
65c0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
65d0: 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c  end(pNew, pExpr,
65e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
65f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6600: 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
6610: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
6620: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
6630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
6640: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
6650: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
6660: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31  uch table: ", -1
6670: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
6680: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
6690: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ->n, 0);.       
66a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
66b0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
66c0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
66d0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 74 61 62 6c  ErrMsg, "no tabl
66e0: 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
66f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
6700: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
6710: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6720: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
6730: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
6740: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
6750: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
6760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6780: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
6790: 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  ely unlinks the 
67a0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
67b0: 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  pTab pointers.**
67c0: 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72   in a select str
67d0: 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74  ucture.  It just
67e0: 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65   sets the pointe
67f0: 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  rs to NULL.  Thi
6800: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
6810: 72 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65  recursive in the
6820: 20 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74   sense that if t
6830: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
6840: 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f  [].pSelect.** po
6850: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
6860: 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  L, this routine 
6870: 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
6880: 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f  ively on that po
6890: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
68a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
68b0: 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63  led on the Selec
68c0: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
68d0: 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49   defines a.** VI
68e0: 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75  EW in order to u
68f0: 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73  ndo any bindings
6900: 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69   to tables.  Thi
6910: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a  s is necessary.*
6920: 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  * because those 
6930: 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20  tables might be 
6940: 44 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73  DROPed by a subs
6950: 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61  equent SQL comma
6960: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
6970: 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53  teSelectUnbind(S
6980: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
6990: 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
69a0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
69b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
69c0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
69d0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
69e0: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
69f0: 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20  {.    if( (pTab 
6a00: 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  = pSrc->a[i].pTa
6a10: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  b)!=0 ){.      i
6a20: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
6a30: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ient ){.        
6a40: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
6a50: 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  e(0, pTab);.    
6a60: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
6a70: 44 65 6c 65 74 65 28 70 53 72 63 2d 3e 61 5b 69  Delete(pSrc->a[i
6a80: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
6a90: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70      pSrc->a[i].p
6aa0: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20  Select = 0;.    
6ab0: 20 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e    }.      pSrc->
6ac0: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20  a[i].pTab = 0;. 
6ad0: 20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61       if( pSrc->a
6ae0: 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20  [i].pSelect ){. 
6af0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c         sqliteSel
6b00: 65 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e  ectUnbind(pSrc->
6b10: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
6b20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6b40: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
6b50: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
6b60: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
6b70: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
6b80: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
6b90: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
6ba0: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
6bb0: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
6bc0: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
6bd0: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
6be0: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
6bf0: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
6c00: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
6c10: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
6c20: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
6c30: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
6c40: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
6c50: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
6c60: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
6c70: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
6c80: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
6c90: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
6ca0: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
6cb0: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
6cc0: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
6cd0: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
6ce0: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
6cf0: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
6d00: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
6d10: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
6d20: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
6d30: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
6d40: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
6d50: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
6d60: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
6d70: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
6d80: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
6d90: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
6da0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
6dc0: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
6dd0: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
6de0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
6df0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
6e00: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
6e10: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
6e20: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
6e30: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
6e40: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
6e50: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
6e60: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
6e70: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e90: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
6ea0: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
6eb0: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
6ec0: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
6ed0: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
6ee0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
6ef0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
6f00: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
6f10: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6f20: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
6f30: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
6f40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6f50: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
6f60: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
6f70: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
6f80: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
6f90: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
6fa0: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
6fb0: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
6fc0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6fd0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
6fe0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   1;.  }.  if( pS
6ff0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
7000: 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72  .    if( matchOr
7010: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
7020: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
7030: 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c  Prior, pOrderBy,
7040: 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
7050: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7060: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
7070: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
7080: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
7090: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
70a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
70b0: 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
70c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
70d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b    int iCol = -1;
70e0: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
70f0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
7100: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7110: 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
7120: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
7130: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
7140: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
7150: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7160: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
7170: 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70  200];.        sp
7180: 72 69 6e 74 66 28 7a 42 75 66 2c 22 4f 52 44 45  rintf(zBuf,"ORDE
7190: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
71a0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
71b0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
71c0: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70           iCol, p
71d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
71e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
71f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7200: 7a 45 72 72 4d 73 67 2c 20 7a 42 75 66 2c 20 30  zErrMsg, zBuf, 0
7210: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
7220: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
7230: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
7240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7250: 7d 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a  }.      iCol--;.
7260: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
7270: 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70  0; iCol<0 && j<p
7280: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
7290: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
72a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
72b0: 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   && (pE->op==TK_
72c0: 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b  ID || pE->op==TK
72d0: 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20  _STRING) ){.    
72e0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
72f0: 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20   *zLabel;.      
7300: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
7310: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
7320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
7330: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20  ->token.z );.   
7340: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
7350: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e  liteStrNDup(pE->
7360: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b  token.z, pE->tok
7370: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  en.n);.        s
7380: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 61  qliteDequote(zLa
7390: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  bel);.        if
73a0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
73b0: 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d  zName, zLabel)==
73c0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
73d0: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
73e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
73f0: 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a  teFree(zLabel);.
7400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7410: 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69  ( iCol<0 && sqli
7420: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  teExprCompare(pE
7430: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  , pEList->a[j].p
7440: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
7450: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
7460: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7470: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
7480: 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f    pE->op = TK_CO
7490: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e  LUMN;.      pE->
74a0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
74b0: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
74c0: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20   = iTable;.     
74d0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
74e0: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  done = 1;.    }.
74f0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
7500: 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  & mustComplete )
7510: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
7520: 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72  f[30];.      spr
7530: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69  intf(zBuf,"%d",i
7540: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
7550: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
7560: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52  se->zErrMsg, "OR
7570: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
7580: 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20  er ", zBuf, .   
7590: 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f 74 20       " does not 
75a0: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
75b0: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
75c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
75d0: 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  ++;.      nErr++
75e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
75f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7600: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
7610: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
7620: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
7630: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
7640: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
7650: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
7660: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7670: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
7680: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
7690: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
76a0: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74  .Vdbe *sqliteGet
76b0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
76c0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
76d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
76e0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
76f0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
7700: 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  dbe = sqliteVdbe
7710: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
7720: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
7730: 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a   v;.}.    ../*.*
7740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7750: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
7760: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
7770: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
7780: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
7790: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
77a0: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
77b0: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
77c0: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
77d0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
77e0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
77f0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 73 68 6f   The results sho
7800: 75 6c 64 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  uld.** be stored
7810: 20 69 6e 20 65 44 65 73 74 20 77 69 74 68 20 70   in eDest with p
7820: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
7830: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
7840: 6c 74 69 53 65 6c 65 63 74 28 50 61 72 73 65 20  ltiSelect(Parse 
7850: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
7860: 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
7870: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74  nt iParm){.  int
7880: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
7890: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
78a0: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
78b0: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
78c0: 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41  pPrior;     /* A
78d0: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
78e0: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
78f0: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
7900: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v;            /
7910: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
7920: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
7930: 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20    int base;     
7940: 20 20 20 20 20 20 2f 2a 20 42 61 73 65 6c 69 6e        /* Baselin
7950: 65 20 76 61 6c 75 65 20 66 6f 72 20 70 50 61 72  e value for pPar
7960: 73 65 2d 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f  se->nTab */..  /
7970: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
7980: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
7990: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
79a0: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20   SELECTs.  Only 
79b0: 74 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53  the .  ** last S
79c0: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
79d0: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
79e0: 4f 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20  ORDER BY..  */. 
79f0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
7a00: 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
7a10: 72 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d  rn 1;.  pPrior =
7a20: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66   p->pPrior;.  if
7a30: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
7a40: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
7a50: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
7a60: 65 2d 3e 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45  e->zErrMsg,"ORDE
7a70: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
7a80: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 22 2c  ld come after ",
7a90: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
7aa0: 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f  ame(p->op), " no
7ab0: 74 20 62 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20  t before", 0);. 
7ac0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7ad0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
7ae0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
7af0: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
7b00: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
7b10: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
7b20: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
7b30: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
7b40: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
7b50: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
7b60: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65  urn 1;..  /* Cre
7b70: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
7b80: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
7b90: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
7ba0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
7bb0: 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
7bc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
7bd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
7be0: 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
7bf0: 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53  );.    eDest = S
7c00: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
7c10: 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
7c20: 55 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52 53 45  UNION or INTERSE
7c30: 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20 20 62 61 73  CTION.  */.  bas
7c40: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
7c50: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
7c60: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
7c70: 5f 41 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  _ALL:.    case T
7c80: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
7c90: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
7ca0: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
7cb0: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
7cc0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
7cd0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
7ce0: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
7cf0: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
7d00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d10: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
7d20: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
7d30: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
7d40: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
7d50: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
7d60: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
7d70: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
7d80: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
7d90: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  t *pOrderBy;  /*
7da0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
7db0: 61 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67  ause for the rig
7dc0: 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ht SELECT */..  
7dd0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
7de0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
7df0: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
7e00: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ion;.      if( e
7e10: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
7e20: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
7e30: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
7e40: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
7e50: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
7e60: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
7e70: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
7e80: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
7e90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
7ea0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
7eb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ec0: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
7ed0: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
7ee0: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
7ef0: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
7f00: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
7f10: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
7f20: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
7f30: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
7f40: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
7f50: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
7f60: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
7f70: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
7f80: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
7f90: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
7fa0: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
7fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
7fc0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
7fd0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
7fe0: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
7ff0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
8000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
8010: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
8020: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  b, 1);.         
8030: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8040: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
8050: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a  , unionTab, 1);.
8060: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8070: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
8080: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
8090: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
80a0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
80b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
80c0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
80d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
80e0: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
80f0: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
8100: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
8110: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
8120: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
8130: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
8140: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8150: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
8160: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
8170: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
8180: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
8190: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
81a0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
81b0: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
81c0: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
81d0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
81e0: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
81f0: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
8200: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
8210: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
8220: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
8230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8240: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
8250: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72  r = 0;.      pOr
8260: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
8270: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
8280: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
8290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
82a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
82b0: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
82c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  0, 0);.      p->
82d0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
82e0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
82f0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
8300: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
8310: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
8320: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
8330: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
8340: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
8350: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
8360: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
8370: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
8380: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
8390: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
83a0: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
83b0: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
83c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
83d0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
83e0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
83f0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
8400: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
8410: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
8420: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
8430: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
8440: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  mes(pParse, p->b
8450: 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  ase, 0, p->pELis
8460: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
8470: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
8480: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
8490: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
84a0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
84b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
84c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
84d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
84e0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
84f0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
8500: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
8510: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
8520: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
8530: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
8540: 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 75 6e  pParse, p, 0, un
8550: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
8560: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
8590: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
85a0: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
85d0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
85e0: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
85f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8600: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
8610: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
8620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8630: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
8640: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
8650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8660: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
8670: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
8680: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8690: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
86a0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
86b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
86c0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
86d0: 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
86e0: 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  ail(p, v, p->pEL
86f0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
8700: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t, iParm);.     
8710: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8720: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8730: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8740: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
8750: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
8760: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
8770: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
8780: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
8790: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
87a0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
87b0: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
87c0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
87d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
87e0: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
87f0: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
8800: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
8810: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
8820: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
8830: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
8840: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
8850: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
8860: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
8870: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
8880: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
8890: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
88a0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
88b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  ->pOrderBy,tab1,
88c0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  1) ){.        re
88d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
88e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
88f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
8900: 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a  Temp, tab1, 1);.
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8920: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
8930: 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b  sData, tab1, 1);
8940: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
8950: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
8960: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
8970: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
8980: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
8990: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
89a0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
89b0: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
89c0: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b   tab1, 0, 0, 0);
89d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
89e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
89f0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
8a00: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
8a10: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
8a20: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
8a30: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
8a40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
8a50: 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29  enTemp, tab2, 1)
8a60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
8a80: 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31  yAsData, tab2, 1
8a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
8aa0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  or = 0;.      rc
8ab0: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
8ac0: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
8ad0: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
8ae0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
8af0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
8b00: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
8b10: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
8b20: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
8b30: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
8b40: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
8b50: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
8b60: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
8b70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8b80: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
8b90: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
8ba0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
8bb0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
8bc0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
8bd0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
8be0: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
8bf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8c00: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56  iBreak = sqliteV
8c10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
8c20: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
8c30: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
8c40: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
8c50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8c60: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
8c70: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
8c80: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
8c90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
8ca0: 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29  ullKey, tab1, 0)
8cb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8cc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
8cd0: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
8ce0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ont);.      rc =
8cf0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
8d00: 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 74  (pParse, p, 0, t
8d10: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
8d20: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
8d50: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
8d60: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
8d90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
8da0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
8db0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
8dc0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
8dd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8de0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
8df0: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
8e00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8e10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8e20: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
8e30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8e40: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
8e50: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
8e60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8e70: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
8e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
8e90: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
8ea0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
8eb0: 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d  ortTail(p, v, p-
8ec0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
8ed0: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
8ee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8ef0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
8f00: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
8f10: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
8f20: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
8f30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
8f40: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
8f50: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
8f60: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8f70: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53  rse->zErrMsg, "S
8f80: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
8f90: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
8fa0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
8fb0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20  pName(p->op), " 
8fc0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
8fd0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
8fe0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
8ff0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
9000: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
9010: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72  rn 1;.  }.  pPar
9020: 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b  se->nTab = base;
9030: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9040: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
9050: 79 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 61  y scan through a
9060: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9070: 65 2e 20 20 46 6f 72 20 65 76 65 72 79 20 72 65  e.  For every re
9080: 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20  ference.** to a 
9090: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
90a0: 6e 75 6d 62 65 72 20 69 46 72 6f 6d 2c 20 63 68  number iFrom, ch
90b0: 61 6e 67 65 20 74 68 61 74 20 72 65 66 65 72 65  ange that refere
90c0: 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61  nce to the.** sa
90d0: 6d 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  me column in tab
90e0: 6c 65 20 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a  le number iTo..*
90f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
9100: 61 6e 67 65 54 61 62 6c 65 73 28 45 78 70 72 20  angeTables(Expr 
9110: 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 46 72 6f  *pExpr, int iFro
9120: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
9130: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
9140: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
9150: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
9160: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
9170: 65 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  e==iFrom ){.    
9180: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
9190: 69 54 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  iTo;.  }else{.  
91a0: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 63 68    static void ch
91b0: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
91c0: 28 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c  (ExprList*, int,
91d0: 20 69 6e 74 29 3b 0a 20 20 20 20 63 68 61 6e 67   int);.    chang
91e0: 65 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70  eTables(pExpr->p
91f0: 4c 65 66 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Left, iFrom, iTo
9200: 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62  );.    changeTab
9210: 6c 65 73 28 70 45 78 70 72 2d 3e 70 52 69 67 68  les(pExpr->pRigh
9220: 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a  t, iFrom, iTo);.
9230: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
9240: 49 6e 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  InList(pExpr->pL
9250: 69 73 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29  ist, iFrom, iTo)
9260: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9270: 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73  oid changeTables
9280: 49 6e 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  InList(ExprList 
9290: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 46 72 6f  *pList, int iFro
92a0: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
92b0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
92c0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
92d0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
92e0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
92f0: 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 4c 69  changeTables(pLi
9300: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
9310: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20  iFrom, iTo);.   
9320: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9330: 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
9340: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
9350: 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
9360: 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
9370: 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
9380: 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
9390: 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
93a0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
93b0: 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  ng.** entry in p
93c0: 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
93d0: 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
93e0: 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
93f0: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
9400: 29 20 20 57 68 65 6e 20 6d 61 6b 69 6e 67 20 61  )  When making a
9410: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
9420: 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74  ession in pEList
9430: 2c 20 63 68 61 6e 67 65 0a 2a 2a 20 72 65 66 65  , change.** refe
9440: 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
9450: 73 20 69 6e 20 74 61 62 6c 65 20 69 53 75 62 20  s in table iSub 
9460: 69 6e 74 6f 20 72 65 66 65 72 65 6e 63 65 73 20  into references 
9470: 74 6f 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2e  to table iTable.
9480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9490: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
94a0: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
94b0: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
94c0: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
94d0: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
94e0: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
94f0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
9500: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
9510: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
9520: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
9530: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
9540: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
9550: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
9560: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
9570: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
9580: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
9590: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
95a0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
95b0: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
95c0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
95d0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
95e0: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
95f0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
9600: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
9610: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
9620: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
9630: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
9640: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69  rList *pEList, i
9650: 6e 74 20 69 53 75 62 29 7b 0a 20 20 69 66 28 20  nt iSub){.  if( 
9660: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
9670: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
9680: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
9690: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
96a0: 69 54 61 62 6c 65 20 26 26 20 70 45 78 70 72 2d  iTable && pExpr-
96b0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
96c0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
96d0: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
96e0: 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
96f0: 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
9700: 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
9710: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
9720: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
9730: 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72  ight==0 && pExpr
9740: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
9750: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
9760: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
9770: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  n].pExpr;.    as
9780: 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
9790: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
97a0: 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 70   pNew->op;.    p
97b0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
97c0: 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77  liteExprDup(pNew
97d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45  ->pLeft);.    pE
97e0: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  xpr->pRight = sq
97f0: 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77  liteExprDup(pNew
9800: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  ->pRight);.    p
9810: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
9820: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
9830: 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
9840: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
9850: 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a  = pNew->iTable;.
9860: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
9870: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
9880: 6d 6e 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  mn;.    pExpr->i
9890: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
98a0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b  ;.    pExpr->tok
98b0: 65 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en = pNew->token
98c0: 3b 0a 20 20 20 20 69 66 28 20 69 53 75 62 21 3d  ;.    if( iSub!=
98d0: 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
98e0: 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78  changeTables(pEx
98f0: 70 72 2c 20 69 53 75 62 2c 20 69 54 61 62 6c 65  pr, iSub, iTable
9900: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9910: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 76 6f 69  {.    static voi
9920: 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
9930: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
9940: 70 72 4c 69 73 74 2a 2c 69 6e 74 29 3b 0a 20 20  prList*,int);.  
9950: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
9960: 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
9970: 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  , pEList, iSub);
9980: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
9990: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
99a0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53  able, pEList, iS
99b0: 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ub);.    substEx
99c0: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
99d0: 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
99e0: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a  ist, iSub);.  }.
99f0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73  }.static void .s
9a00: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
9a10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
9a20: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
9a30: 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20  st *pEList, int 
9a40: 69 53 75 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iSub){.  int i;.
9a50: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
9a60: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
9a70: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
9a80: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
9a90: 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
9aa0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
9ab0: 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29  e, pEList, iSub)
9ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
9ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
9ae0: 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
9af0: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
9b00: 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
9b10: 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
9b20: 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
9b30: 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
9b40: 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
9b50: 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
9b60: 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
9b70: 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
9b80: 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
9b90: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
9ba0: 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
9bb0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
9bc0: 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
9bd0: 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
9be0: 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
9bf0: 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
9c00: 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
9c10: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
9c20: 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
9c30: 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
9c40: 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
9c50: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
9c60: 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
9c70: 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
9c80: 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
9c90: 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
9ca0: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
9cb0: 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
9cc0: 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
9cd0: 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
9ce0: 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
9cf0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
9d00: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
9d10: 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
9d20: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
9d30: 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
9d40: 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
9d50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9d60: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
9d70: 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
9d80: 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
9d90: 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
9da0: 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
9db0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
9dc0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
9dd0: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
9de0: 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
9df0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
9e00: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
9e10: 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
9e20: 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
9e30: 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
9e40: 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
9e50: 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
9e60: 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
9e70: 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
9e80: 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
9e90: 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
9ea0: 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
9eb0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
9ec0: 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
9ed0: 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
9ee0: 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
9ef0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9f00: 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
9f10: 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
9f20: 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
9f30: 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
9f40: 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
9f50: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
9f60: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
9f70: 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
9f80: 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
9f90: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
9fa0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
9fb0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
9fc0: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
9fd0: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
9fe0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
9ff0: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
a000: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
a010: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
a020: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
a030: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
a040: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
a050: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
a060: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
a070: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
a080: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
a090: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
a0a0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
a0b0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
a0c0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
a0d0: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
a0e0: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
a0f0: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
a100: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
a110: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
a120: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
a130: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
a140: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
a150: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
a160: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
a170: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
a180: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
a190: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
a1a0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
a1b0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
a1c0: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
a1d0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
a1e0: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
a1f0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
a200: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
a210: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
a220: 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
a230: 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
a240: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
a250: 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
a260: 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
a270: 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
a280: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
a290: 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
a2a0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
a2b0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
a2c0: 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
a2d0: 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
a2e0: 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
a2f0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
a300: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
a310: 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
a320: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
a330: 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
a340: 74 75 72 6e 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  turn 0..** If fl
a350: 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
a360: 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
a370: 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
a380: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
a390: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
a3a0: 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
a3b0: 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
a3c0: 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
a3d0: 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
a3e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
a3f0: 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 66 6c 61 74 74  ns..*/.int flatt
a400: 65 6e 53 75 62 71 75 65 72 79 28 53 65 6c 65 63  enSubquery(Selec
a410: 74 20 2a 70 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  t *p, int iFrom,
a420: 20 69 6e 74 20 69 73 41 67 67 2c 20 69 6e 74 20   int isAgg, int 
a430: 73 75 62 71 75 65 72 79 49 73 41 67 67 29 7b 0a  subqueryIsAgg){.
a440: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
a450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
a460: 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
a470: 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
a480: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
a490: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
a4a0: 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
a4b0: 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
a4c0: 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
a4d0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
a4e0: 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
a4f0: 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
a500: 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
a510: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
a520: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
a530: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  */.  int i;.  in
a540: 74 20 69 50 61 72 65 6e 74 2c 20 69 53 75 62 3b  t iParent, iSub;
a550: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
a560: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
a570: 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
a580: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
a590: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
a5a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
a5b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a5c0: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
a5d0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
a5e0: 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
a5f0: 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
a600: 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d  ;.  pSub = pSrc-
a610: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63  >a[iFrom].pSelec
a620: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
a630: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
a640: 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
a650: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
a660: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
a670: 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
a680: 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
a690: 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
a6a0: 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
a6b0: 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
a6c0: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
a6d0: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
a6e0: 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
a6f0: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
a700: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20  ->nLimit>=0) && 
a710: 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
a720: 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
a730: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a740: 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69   if( (p->isDisti
a750: 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74  nct || p->nLimit
a760: 29 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  ) && subqueryIsA
a770: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  gg ) return 0;..
a780: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
a790: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
a7a0: 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67  means flattening
a7b0: 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f   is permitted fo
a7c0: 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d 74 68 20  r the.  ** i-th 
a7d0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
a7e0: 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
a7f0: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
a800: 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 2d  /.  iParent = p-
a810: 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d 3b 0a 20  >base + iFrom;. 
a820: 20 69 53 75 62 20 3d 20 70 53 75 62 2d 3e 62 61   iSub = pSub->ba
a830: 73 65 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  se;.  substExprL
a840: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69  ist(p->pEList, i
a850: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
a860: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 70  List, iSub);.  p
a870: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
a880: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a890: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
a8a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
a8b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
a8c0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a8d0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
a8e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
a8f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
a900: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
a910: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
a920: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
a930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a940: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
a950: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
a960: 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
a970: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20  , pSub->pEList, 
a980: 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74  iSub);.    subst
a990: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
a9a0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
a9b0: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
a9c0: 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69   }.  substExprLi
a9d0: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
a9e0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
a9f0: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
aa00: 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
aa10: 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
aa20: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
aa30: 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
aa40: 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69    if( iParent!=i
aa50: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61  Sub ){.      cha
aa60: 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72 65  ngeTables(pWhere
aa70: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
aa80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
aa90: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
aaa0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
aab0: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
aac0: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
aad0: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
aae0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
aaf0: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
ab00: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
ab10: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
ab20: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
ab30: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
ab40: 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ub);.    if( pSu
ab50: 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  b->pHaving ){.  
ab60: 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e      Expr *pHavin
ab70: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  g = sqliteExprDu
ab80: 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
ab90: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61 72  ;.      if( iPar
aba0: 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20  ent!=iSub ){.   
abb0: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
abc0: 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62 2c  s(pHaving, iSub,
abd0: 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   iParent);.     
abe0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
abf0: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
ac00: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
ac10: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e  sqliteExpr(TK_AN
ac20: 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  D, p->pHaving, p
ac30: 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  Having, 0);.    
ac40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ac50: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48   p->pHaving = pH
ac60: 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20  aving;.      }. 
ac70: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
ac80: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
ac90: 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
aca0: 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  By = sqliteExprL
acb0: 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
acc0: 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28 20  oupBy);.    if( 
acd0: 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29 7b  iParent!=iSub ){
ace0: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
acf0: 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47 72  lesInList(p->pGr
ad00: 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50 61  oupBy, iSub, iPa
ad10: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
ad20: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
ad30: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
ad40: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
ad50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
ad60: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
ad70: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
ad80: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
ad90: 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65 20  .    if( pWhere 
ada0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  ){.      p->pWhe
adb0: 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  re = sqliteExpr(
adc0: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72  TK_AND, p->pWher
add0: 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  e, pWhere, 0);. 
ade0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 73     }.  }.  p->is
adf0: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
ae00: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
ae10: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
ae20: 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  if( pSub->nLimit
ae30: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
ae40: 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ->nLimit<0 ){.  
ae50: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
ae60: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20  pSub->nLimit;.  
ae70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
ae80: 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74  Limit+p->nOffset
ae90: 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b   > pSub->nLimit+
aea0: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b  pSub->nOffset ){
aeb0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
aec0: 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20   = pSub->nLimit 
aed0: 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  + pSub->nOffset 
aee0: 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  - p->nOffset;.  
aef0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66    }.  }.  p->nOf
af00: 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f  fset += pSub->nO
af10: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 70 53 72  ffset;.  if( pSr
af20: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
af30: 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f   && pSrc->a[iFro
af40: 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m].pTab->isTrans
af50: 69 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ient ){.    sqli
af60: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
af70: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
af80: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 53 72  pTab);.  }.  pSr
af90: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
afa0: 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d   = pSubSrc->a[0]
afb0: 2e 70 54 61 62 3b 0a 20 20 70 53 75 62 53 72 63  .pTab;.  pSubSrc
afc0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 30 3b  ->a[0].pTab = 0;
afd0: 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  .  pSrc->a[iFrom
afe0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
aff0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
b000: 74 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b  t;.  pSubSrc->a[
b010: 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
b020: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
b030: 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65  lete(pSub);.  re
b040: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
b050: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
b060: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
b070: 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
b080: 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
b090: 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
b0a0: 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
b0b0: 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
b0c0: 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
b0d0: 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
b0e0: 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
b0f0: 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
b100: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
b110: 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
b120: 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
b130: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
b140: 73 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 20  s SELECT return 
b150: 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
b160: 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
b170: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
b180: 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
b190: 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
b1a0: 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
b1b0: 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
b1c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
b1d0: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
b1e0: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
b1f0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
b200: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
b210: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
b220: 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
b230: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
b240: 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
b250: 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
b260: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
b270: 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
b280: 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
b290: 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
b2a0: 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
b2b0: 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
b2c0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
b2d0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
b2e0: 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
b2f0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
b300: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
b310: 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
b320: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
b330: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
b340: 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
b350: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e 0a  sqliteSelect()..
b360: 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
b370: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
b380: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
b390: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
b3a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b3b0: 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
b3c0: 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
b3d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b3e0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
b3f0: 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
b400: 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
b410: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
b420: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
b430: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
b440: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6f 70 65  be *v;.  int ope
b450: 6e 4f 70 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f  nOp;.  int seekO
b460: 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
b470: 20 45 78 70 72 4c 69 73 74 20 65 4c 69 73 74 3b   ExprList eList;
b480: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
b490: 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
b4a0: 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  m;..  /* Check t
b4b0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75  o see if this qu
b4c0: 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
b4d0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
b4e0: 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20  uery.  Return.  
b4f0: 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73  ** zero if it is
b500: 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66    not..  */.  if
b510: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c  ( p->pGroupBy ||
b520: 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70   p->pHaving || p
b530: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
b540: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n 0;.  if( p->pS
b550: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
b560: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
b570: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
b580: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
b590: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
b5a0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
b5b0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
b5c0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
b5d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
b5e0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
b5f0: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 || pExpr->pLis
b600: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
b610: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
b620: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
b630: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
b640: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
b650: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
b660: 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
b670: 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52     seekOp = OP_R
b680: 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ewind;.  }else i
b690: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
b6a0: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
b6b0: 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
b6c0: 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
b6d0: 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
b6e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b6f0: 0a 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72  .  pExpr = pExpr
b700: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
b710: 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
b720: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
b730: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
b740: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
b750: 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d  umn;.  pTab = p-
b760: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
b770: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
b780: 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
b790: 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
b7a0: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
b7b0: 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
b7c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
b7d0: 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
b7e0: 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
b7f0: 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
b800: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
b810: 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
b820: 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
b830: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
b840: 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
b850: 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
b860: 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
b870: 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
b880: 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
b890: 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
b8a0: 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
b8b0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
b8c0: 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
b8d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
b8e0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
b8f0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b900: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
b910: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
b920: 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20  Column>=1 );.   
b930: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
b940: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29  olumn[0]==iCol )
b950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b960: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
b970: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
b980: 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
b990: 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
b9a0: 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
b9b0: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
b9c0: 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
b9d0: 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
b9e0: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
b9f0: 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65   a table or a me
ba00: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a  mory cell..  */.
ba10: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
ba20: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ba30: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
ba40: 20 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d   0;.  if( eDest=
ba50: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
ba60: 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
ba70: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
ba80: 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72   p->base, p->pSr
ba90: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
baa0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
bab0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
bac0: 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
bad0: 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
bae0: 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
baf0: 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
bb00: 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
bb10: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
bb20: 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
bb30: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
bb40: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
bb50: 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
bb60: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
bb70: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
bb80: 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
bb90: 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
bba0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
bbb0: 21 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56  !pParse->schemaV
bbc0: 65 72 69 66 69 65 64 20 26 26 20 28 70 50 61 72  erified && (pPar
bbd0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
bbe0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
bbf0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bc00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bc10: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50  VerifyCookie, pP
bc20: 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61  arse->db->schema
bc30: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
bc40: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
bc50: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  erified = 1;.  }
bc60: 0a 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62  .  openOp = pTab
bc70: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
bc80: 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b  enAux : OP_Open;
bc90: 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73  .  base = p->bas
bca0: 65 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  e;.  sqliteVdbeA
bcb0: 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20  ddOp(v, openOp, 
bcc0: 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
bcd0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43  );.  sqliteVdbeC
bce0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
bcf0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
bd00: 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 70 49  TATIC);.  if( pI
bd10: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
bd20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bd30: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
bd40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
bd50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
bd60: 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2b 31  , openOp, base+1
bd70: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
bd80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
bd90: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
bda0: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
bdb0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
bdc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
bdd0: 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  kOp, base+1, 0);
bde0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
bdf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65  ddOp(v, OP_IdxRe
be00: 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  cno, base+1, 0);
be10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
be20: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
be30: 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
be40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
be50: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
be60: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
be70: 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
be80: 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
be90: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
bea0: 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
beb0: 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
bec0: 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
bed0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
bee0: 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
bef0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
bf00: 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
bf10: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26  oop(pParse, p, &
bf20: 65 4c 69 73 74 2c 20 62 61 73 65 2c 20 31 2c 20  eList, base, 1, 
bf30: 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
bf40: 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29  arm, cont, cont)
bf50: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ;.  sqliteVdbeRe
bf60: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
bf70: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
bf80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
bf90: 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
bfa0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
bfb0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
bfc0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
bfd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
bfe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
bff0: 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
c000: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
c010: 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
c020: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
c030: 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
c040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
c050: 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
c060: 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
c070: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
c080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0a0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
c0b0: 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
c0c0: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
c0d0: 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
c0e0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
c0f0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
c100: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
c110: 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
c120: 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
c130: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
c140: 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
c150: 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
c160: 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  of a table with 
c170: 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a  cursor iParm.**.
c180: 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
c190: 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
c1a0: 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
c1b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
c1c0: 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
c1d0: 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
c1e0: 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
c1f0: 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f  s form the tempo
c200: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
c210: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
c220: 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
c230: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
c240: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
c250: 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  rm.**.** This ro
c260: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
c270: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
c280: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
c290: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
c2a0: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
c2b0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
c2c0: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
c2d0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
c2e0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
c2f0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
c300: 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
c310: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
c320: 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
c330: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c340: 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
c350: 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
c360: 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
c370: 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
c380: 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
c390: 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
c3a0: 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
c3b0: 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
c3c0: 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
c3d0: 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
c3e0: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
c3f0: 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
c400: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
c410: 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
c420: 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
c430: 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
c440: 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
c450: 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
c460: 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
c470: 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
c480: 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
c490: 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
c4a0: 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
c4b0: 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
c4c0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
c4d0: 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  nt sqliteSelect(
c4e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c4f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
c500: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
c510: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c530: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c540: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
c550: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c570: 4f 6e 65 20 6f 66 3a 20 53 52 54 5f 43 61 6c 6c  One of: SRT_Call
c580: 62 61 63 6b 20 4d 65 6d 20 53 65 74 20 55 6e 69  back Mem Set Uni
c590: 6f 6e 20 45 78 63 65 70 74 20 2a 2f 0a 20 20 69  on Except */.  i
c5a0: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
c5b0: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 20 72 65        /* Save re
c5c0: 73 75 6c 74 20 69 6e 20 74 68 69 73 20 6d 65 6d  sult in this mem
c5d0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2c 20 69 66  ory location, if
c5e0: 20 3e 3d 30 20 2a 2f 0a 20 20 53 65 6c 65 63 74   >=0 */.  Select
c5f0: 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
c600: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
c610: 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
c620: 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
c630: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
c640: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
c650: 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
c660: 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
c670: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
c680: 50 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20  ParentAgg       
c690: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
c6a0: 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
c6b0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
c6c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
c6d0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
c6e0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
c6f0: 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20  t isAgg = 0;    
c700: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
c710: 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
c720: 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
c730: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c740: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
c750: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
c760: 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
c770: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
c780: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
c790: 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
c7a0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
c7b0: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
c7c0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
c7d0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
c7e0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
c7f0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
c800: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
c810: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
c820: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
c830: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
c840: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
c850: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
c860: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
c870: 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
c880: 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
c890: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
c8a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
c8b0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
c8c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
c8d0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
c8e0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
c8f0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
c900: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
c910: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
c920: 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
c930: 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20    int base;     
c940: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c950: 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62  t cursor availab
c960: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20  le for use */.  
c970: 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
c980: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c990: 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
c9a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
c9b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
c9c0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
c9d0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
c9e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
c9f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
ca00: 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
ca10: 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
ca20: 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
ca30: 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
ca40: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
ca50: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
ca60: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ca70: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
ca80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
ca90: 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20  local copies of 
caa0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66  the parameters f
cab0: 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20  or this query.. 
cac0: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   */.  pTabList =
cad0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65   p->pSrc;.  pWhe
cae0: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
caf0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
cb00: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f  pOrderBy;.  pGro
cb10: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
cb20: 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
cb30: 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
cb40: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
cb50: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
cb60: 41 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  Allocate a block
cb70: 20 6f 66 20 56 44 42 45 20 63 75 72 73 6f 72 73   of VDBE cursors
cb80: 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 74  , one for each t
cb90: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
cba0: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 54 68   clause..  ** Th
cbb0: 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 73 69  e WHERE processi
cbc0: 6e 67 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ng requires that
cbd0: 20 74 68 65 20 63 75 72 73 6f 72 73 20 66 6f 72   the cursors for
cbe0: 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
cbf0: 68 65 0a 20 20 2a 2a 20 46 52 4f 4d 20 63 6c 61  he.  ** FROM cla
cc00: 75 73 65 20 62 65 20 63 6f 6e 73 65 63 75 74 69  use be consecuti
cc10: 76 65 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20  ve..  */.  base 
cc20: 3d 20 70 2d 3e 62 61 73 65 20 3d 20 70 50 61 72  = p->base = pPar
cc30: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72  se->nTab;.  pPar
cc40: 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 70 54 61 62  se->nTab += pTab
cc50: 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
cc60: 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
cc70: 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
cc80: 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
cc90: 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
cca0: 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
ccb0: 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
ccc0: 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
ccd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
cce0: 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
ccf0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
cd00: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
cd10: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  y table in the t
cd20: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 63 72  able list and cr
cd30: 65 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69  eate an appropri
cd40: 61 74 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c  ate.  ** columnl
cd50: 69 73 74 20 69 6e 20 70 45 4c 69 73 74 20 69 66  ist in pEList if
cd60: 20 74 68 65 72 65 20 69 73 6e 27 74 20 6f 6e 65   there isn't one
cd70: 20 61 6c 72 65 61 64 79 2e 20 20 28 54 68 65 20   already.  (The 
cd80: 70 61 72 73 65 72 20 6c 65 61 76 65 73 0a 20 20  parser leaves.  
cd90: 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e 20 74 68 65  ** a NULL in the
cda0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 66 20 74 68   p->pEList if th
cdb0: 65 20 53 51 4c 20 73 61 69 64 20 22 53 45 4c 45  e SQL said "SELE
cdc0: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a  CT * FROM ...").
cdd0: 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49    */.  if( fillI
cde0: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72  nColumnList(pPar
cdf0: 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f  se, p) ){.    go
ce00: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
ce10: 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d   }.  pWhere = p-
ce20: 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69 73  >pWhere;.  pELis
ce30: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
ce40: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
ce50: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
ce60: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
ce70: 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
ce80: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
ce90: 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
cea0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
ceb0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
cec0: 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54   if( (eDest==SRT
ced0: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
cee0: 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73  RT_Set) && pELis
cef0: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20  t->nExpr>1 ){.  
cf00: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
cf10: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
cf20: 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  sg, "only a sing
cf30: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
cf40: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
cf50: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
cf60: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
cf70: 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 20  ession", 0);.   
cf80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
cf90: 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
cfa0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
cfb0: 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
cfc0: 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
cfd0: 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
cfe0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
cff0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
d000: 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
d010: 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
d020: 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
d030: 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
d040: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
d050: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
d060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
d070: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
d080: 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
d090: 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
d0a0: 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
d0b0: 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
d0c0: 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
d0d0: 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
d0e0: 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
d0f0: 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
d100: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d110: 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
d120: 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
d130: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
d140: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
d150: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d160: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
d170: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
d180: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
d190: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
d1a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d1b0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
d1c0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
d1d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
d1e0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
d1f0: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
d200: 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67  .pExpr, 1, &isAg
d210: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
d220: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
d230: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68   }.  }.  if( pWh
d240: 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ere ){.    if( s
d250: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
d260: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
d270: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
d280: 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20  st, pWhere) ){. 
d290: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
d2a0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
d2b0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
d2c0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65  eck(pParse, pWhe
d2d0: 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  re, 0, 0) ){.   
d2e0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
d2f0: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
d300: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
d310: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d320: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
d330: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
d340: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
d350: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d360: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
d370: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
d380: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
d390: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
d3a0: 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
d3b0: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
d3c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d3d0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
d3e0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
d3f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d400: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
d410: 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
d420: 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
d430: 6e 74 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  nts", 0);.      
d440: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
d450: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ++;.          go
d460: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
d470: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d480: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
d490: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
d4a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
d4b0: 20 7a 42 75 66 5b 32 30 30 30 5d 3b 0a 20 20 20   zBuf[2000];.   
d4c0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
d4d0: 42 75 66 2c 22 4f 52 44 45 52 20 42 59 20 63 6f  Buf,"ORDER BY co
d4e0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
d4f0: 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
d500: 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
d510: 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
d520: 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c  1 and %d", iCol,
d530: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d540: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d550: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
d560: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 42 75  se->zErrMsg, zBu
d570: 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  f, 0);.         
d580: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
d590: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
d5a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d5b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
d5c0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
d5d0: 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
d5e0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d5f0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78  pExpr = sqliteEx
d600: 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
d610: 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
d620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d630: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
d640: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62  lveIds(pParse, b
d650: 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  ase, pTabList, p
d660: 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
d670: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
d680: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
d690: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
d6a0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
d6b0: 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
d6c0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
d6d0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d6e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
d6f0: 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
d700: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
d710: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
d720: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
d730: 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  *pE = pGroupBy->
d740: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d750: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
d760: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
d770: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d780: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
d790: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20  e->zErrMsg, .   
d7a0: 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50            "GROUP
d7b0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20   BY expressions 
d7c0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f  should not be co
d7d0: 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20  nstant", 0);.   
d7e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
d7f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
d800: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
d810: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d820: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
d830: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
d840: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
d850: 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
d860: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
d870: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
d880: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
d890: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
d8a0: 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
d8b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
d8c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
d8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d8e0: 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
d8f0: 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
d900: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
d910: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
d920: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52  ->zErrMsg, "a GR
d930: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
d940: 20 72 65 71 75 69 72 65 64 20 22 0a 20 20 20 20   required ".    
d950: 20 20 20 20 20 22 62 65 66 6f 72 65 20 48 41 56       "before HAV
d960: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ING", 0);.      
d970: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
d980: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
d990: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
d9a0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
d9b0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
d9c0: 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  , base, pTabList
d9d0: 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e  , pEList, pHavin
d9e0: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
d9f0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
da00: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
da10: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
da20: 65 2c 20 70 48 61 76 69 6e 67 2c 20 69 73 41 67  e, pHaving, isAg
da30: 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67  g, 0) ){.      g
da40: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
da50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
da60: 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
da70: 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
da80: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
da90: 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
daa0: 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
dab0: 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
dac0: 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
dad0: 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
dae0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
daf0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
db00: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
db10: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  nd;.  }..  /* Be
db20: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
db30: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
db40: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
db50: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
db60: 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
db70: 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end;..  /* Ident
db80: 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
db90: 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
dba0: 73 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c 6c  sing in the call
dbb0: 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
dbc0: 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
dbd0: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
dbe0: 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
dbf0: 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
dc00: 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ell..  */.  if( 
dc10: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
dc20: 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
dc30: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
dc40: 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
dc50: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
dc60: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
dc70: 20 74 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a   the limiter.  *
dc80: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
dc90: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  t<=0 ){.    p->n
dca0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65  Offset = 0;.  }e
dcb0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
dcc0: 6e 4f 66 66 73 65 74 3c 30 20 29 20 70 2d 3e 6e  nOffset<0 ) p->n
dcd0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
dce0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dcf0: 76 2c 20 4f 50 5f 4c 69 6d 69 74 2c 20 70 2d 3e  v, OP_Limit, p->
dd00: 6e 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4f 66 66 73  nLimit, p->nOffs
dd10: 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  et);.  }..  /* G
dd20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
dd30: 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
dd40: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
dd50: 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  use.  */.  for(i
dd60: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
dd70: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
dd80: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
dd90: 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  i].pSelect==0 ) 
dda0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
ddb0: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
ddc0: 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  e, pTabList->a[i
ddd0: 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  ].pSelect, SRT_T
dde0: 65 6d 70 54 61 62 6c 65 2c 20 62 61 73 65 2b 69  empTable, base+i
ddf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
de00: 20 20 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29     p, i, &isAgg)
de10: 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
de20: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
de30: 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
de40: 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  ;.    if( eDest=
de50: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
de60: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
de70: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
de80: 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42     }.    pGroupB
de90: 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
dea0: 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70  .    pHaving = p
deb0: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69  ->pHaving;.    i
dec0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
ded0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a  sDistinct;.  }..
dee0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
def0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  e if this is a s
df00: 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e  ubquery that can
df10: 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20   be "flattened" 
df20: 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
df30: 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  .  ** If flatten
df40: 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ing is a possibl
df50: 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72  ity, do so and r
df60: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
df70: 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  y.  .  */.  if( 
df80: 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
df90: 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
dfa0: 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
dfb0: 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
dfc0: 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
dfd0: 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
dfe0: 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
dff0: 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72  ntAgg = 1;.    r
e000: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
e010: 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
e020: 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
e030: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
e040: 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
e050: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e060: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
e070: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
e080: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e090: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
e0a0: 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rm, 0);.  }..  /
e0b0: 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  * Do an analysis
e0c0: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78   of aggregate ex
e0d0: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
e0e0: 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74    sqliteAggregat
e0f0: 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73  eInfoReset(pPars
e100: 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20  e);.  if( isAgg 
e110: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e120: 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29  Parse->nAgg==0 )
e130: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e140: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
e150: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e160: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
e170: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
e180: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
e190: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
e1a0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
e1b0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
e1c0: 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  }.    if( pGroup
e1d0: 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
e1e0: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
e1f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e200: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e210: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
e220: 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47  gates(pParse, pG
e230: 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
e240: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
e250: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
e260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e270: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e280: 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
e290: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
e2a0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
e2b0: 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
e2c0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
e2d0: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
e2e0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
e2f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e300: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
e310: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
e320: 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  ( sqliteExprAnal
e330: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
e340: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
e350: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
e360: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
e370: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e380: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e390: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  }.  }..  /* Rese
e3a0: 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  t the aggregator
e3b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
e3c0: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  g ){.    sqliteV
e3d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
e3e0: 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72  ggReset, 0, pPar
e3f0: 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66  se->nAgg);.    f
e400: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
e410: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
e420: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
e430: 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  nc;.      if( (p
e440: 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61  Func = pParse->a
e450: 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30  Agg[i].pFunc)!=0
e460: 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61   && pFunc->xFina
e470: 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
e480: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e490: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74  Op(v, OP_AggInit
e4a0: 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , 0, i);.       
e4b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
e4c0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
e4d0: 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e  *)pFunc, P3_POIN
e4e0: 54 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TER);.      }.  
e4f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
e500: 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
e510: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e520: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
e530: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e540: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e550: 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30  P_AggFocus, 0, 0
e560: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e570: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
e580: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  e memory cell to
e590: 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
e5a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
e5b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
e5c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
e5d0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
e5e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e5f0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e600: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
e610: 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70    /* Open a temp
e620: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
e630: 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
e640: 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
e650: 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
e660: 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
e670: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
e680: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
e690: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
e6a0: 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 31  emp, distinct, 1
e6b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e6c0: 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
e6d0: 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74   }..  /* Begin t
e6e0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
e6f0: 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d  .  */.  pWInfo =
e700: 20 73 71 6c 69 74 65 57 68 65 72 65 42 65 67 69   sqliteWhereBegi
e710: 6e 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  n(pParse, p->bas
e720: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
e730: 65 72 65 2c 20 30 2c 20 26 70 4f 72 64 65 72 42  ere, 0, &pOrderB
e740: 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  y);.  if( pWInfo
e750: 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
e760: 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65  t_end;..  /* Use
e770: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
e780: 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61  ner loop if we a
e790: 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77  re not dealing w
e7a0: 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61  ith.  ** aggrega
e7b0: 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  tes.  */.  if( !
e7c0: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28  isAgg ){.    if(
e7d0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
e7e0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
e7f0: 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
e800: 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
e810: 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
e820: 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20           iParm, 
e830: 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
e840: 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
e850: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74  k) ){.       got
e860: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
e870: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
e880: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
e890: 77 69 74 68 20 61 67 67 72 65 67 61 74 65 73 2c  with aggregates,
e8a0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65   then do the spe
e8b0: 63 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20  cial aggregate. 
e8c0: 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20   ** processing. 
e8d0: 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20   .  */.  else{. 
e8e0: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
e8f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  ){.      int lbl
e900: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  1;.      for(i=0
e910: 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
e920: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
e930: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
e940: 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
e950: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
e960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e970: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e980: 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47  , OP_MakeKey, pG
e990: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30  roupBy->nExpr, 0
e9a0: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
e9b0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
e9c0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
e9d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e9e0: 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
e9f0: 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f   lbl1);.      fo
ea00: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
ea10: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
ea20: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
ea30: 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
ea40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ea50: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
ea60: 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  e(pParse, pParse
ea70: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29  ->aAgg[i].pExpr)
ea80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ea90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eaa0: 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20  AggSet, 0, i);. 
eab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
eac0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
ead0: 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
eae0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
eaf0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
eb00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
eb10: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
eb20: 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   j;.      if( !p
eb30: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
eb40: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
eb50: 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72  .      pE = pPar
eb60: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
eb70: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
eb80: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
eb90: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
eba0: 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20    if( pE->pList 
ebb0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
ebc0: 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d  =0; j<pE->pList-
ebd0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
ebe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
ebf0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ec00: 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
ec10: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
ec20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ec30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ec40: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
ec50: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ec60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ec70: 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d  _AggFunc, 0, pE-
ec80: 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69  >pList ? pE->pLi
ec90: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
eca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ecb0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
ecc0: 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unc!=0 );.      
ecd0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
ece0: 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78  aAgg[i].pFunc->x
ecf0: 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
ed00: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
ed10: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
ed20: 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  *)pParse->aAgg[i
ed30: 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e  ].pFunc, P3_POIN
ed40: 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TER);.    }.  }.
ed50: 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61  .  /* End the da
ed60: 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
ed70: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57  ..  */.  sqliteW
ed80: 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
ed90: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
eda0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
edb0: 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20  egates, we need 
edc0: 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f  to set up a seco
edd0: 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65  nd loop.  ** ove
ede0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67  r all of the agg
edf0: 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e  regate values an
ee00: 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a  d process them..
ee10: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
ee20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61   ){.    int enda
ee30: 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  gg = sqliteVdbeM
ee40: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
ee50: 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
ee60: 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
ee70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ee80: 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
ee90: 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61  endagg);.    pPa
eea0: 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b  rse->useAgg = 1;
eeb0: 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
eec0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eed0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
eee0: 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
eef0: 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
ef00: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
ef10: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
ef20: 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
ef30: 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
ef40: 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
ef70: 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20  , endagg) ){.   
ef80: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
ef90: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
efa0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
efb0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61   OP_Goto, 0, sta
efc0: 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  rtagg);.    sqli
efd0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
efe0: 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
eff0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f000: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
f010: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
f020: 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20  ->useAgg = 0;.  
f030: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
f040: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
f050: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
f060: 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
f070: 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
f080: 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
f090: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
f0a0: 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
f0b0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
f0c0: 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
f0d0: 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74  ail(p, v, pEList
f0e0: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
f0f0: 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20  iParm);.  }...  
f100: 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20  /* Issue a null 
f110: 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74  callback if that
f120: 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73 65   is what the use
f130: 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  r wants..  */.  
f140: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
f150: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
f160: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30  NullCallback)!=0
f170: 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   && eDest==SRT_C
f180: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  allback ){.    s
f190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f1a0: 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  , OP_NullCallbac
f1b0: 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  k, pEList->nExpr
f1c0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
f1d0: 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
f1e0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
f1f0: 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
f200: 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
f210: 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
f220: 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
f230: 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
f240: 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
f250: 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
f260: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
f270: 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
f280: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
f290: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
f2a0: 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
f2b0: 5f 65 6e 64 3a 0a 20 20 70 50 61 72 73 65 2d 3e  _end:.  pParse->
f2c0: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20 73  nTab = base;.  s
f2d0: 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
f2e0: 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
f2f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.