/ Hex Artifact Content
Login

Artifact 8a4a38310c5168d1f6e1759494e57cf838d6d37c:


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 32 33 31  select.c,v 1.231
0200: 20 32 30 30 35 2f 30 31 2f 32 30 20 31 33 3a 33   2005/01/20 13:3
0210: 36 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  6:20 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
0a00: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a10: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a20: 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20     u8 nChar;.   
0a30: 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65   u8 code;.  } ke
0a40: 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20  ywords[] = {.   
0a50: 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c   { "natural", 7,
0a60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20   JT_NATURAL },. 
0a70: 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20     { "left",    
0a80: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
0a90: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69  TER },.    { "ri
0aa0: 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49  ght",   5, JT_RI
0ab0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0ac0: 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20      { "full",   
0ad0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
0ae0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0af0: 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20  .    { "outer", 
0b00: 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c    5, JT_OUTER },
0b10: 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20  .    { "inner", 
0b20: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b30: 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20  .    { "cross", 
0b40: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b50: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0b60: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0b70: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0b80: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0b90: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0ba0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0bb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0bc0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0bd0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0be0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
0bf0: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
0c00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
0c10: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
0c20: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
0c30: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
0c40: 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  Cmp(p->z, keywor
0c50: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0c60: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0c70: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0c80: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0c90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0cb0: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0cc0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0cd0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0ce0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0cf0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
0d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d10: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
0d20: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
0d30: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
0d40: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
0d50: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
0d60: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
0d70: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
0d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31  const char *zSp1
0d90: 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73   = " ";.    cons
0da0: 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22  t char *zSp2 = "
0db0: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0dc0: 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20  0 ){ zSp1++; }. 
0dd0: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
0de0: 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71  zSp2++; }.    sq
0df0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0e00: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
0e10: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
0e20: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
0e30: 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20    "%T%s%T%s%T", 
0e40: 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53  pA, zSp1, pB, zS
0e50: 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  p2, pC);.    joi
0e60: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
0e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  ;.  }else if( jo
0e80: 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48  intype & JT_RIGH
0e90: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
0ea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0eb0: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
0ec0: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
0ed0: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
0ee0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
0ef0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
0f00: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
0f10: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
0f20: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
0f30: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
0f40: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
0f50: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
0f60: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
0f70: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
0f80: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
0f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
0fa0: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
0fb0: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
0fc0: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
0fd0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0fe0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
0ff0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1000: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1010: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1020: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1030: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1040: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  -1;.}../*.** Set
1050: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1060: 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30  token to a '\000
1070: 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  '-terminated str
1080: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
1090: 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b  oid setToken(Tok
10a0: 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  en *p, const cha
10b0: 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20  r *z){.  p->z = 
10c0: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c  z;.  p->n = strl
10d0: 65 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20  en(z);.  p->dyn 
10e0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
10f0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
1100: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1110: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
1120: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
1130: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1140: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1150: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1160: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1170: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1180: 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73  hereTerm(.  cons
1190: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
11a0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
11c0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11d0: 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73  b1,      /* Firs
11e0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  t table */.  con
11f0: 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31  st char *zAlias1
1200: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1210: 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20  or first table. 
1220: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1230: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
1240: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
1250: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
1260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69  const char *zAli
1270: 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61  as2,     /* Alia
1280: 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62  s for second tab
1290: 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  le.  May be NULL
12a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
12b0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
12c0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
12d0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
12e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
12f0: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1300: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1310: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1320: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1330: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1340: 70 45 3b 0a 0a 20 20 73 65 74 54 6f 6b 65 6e 28  pE;..  setToken(
1350: 26 64 75 6d 6d 79 2c 20 7a 43 6f 6c 29 3b 0a 20  &dummy, zCol);. 
1360: 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 45   pE1a = sqlite3E
1370: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1380: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61   &dummy);.  pE2a
1390: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
13a0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
13b0: 6d 79 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  my);.  if( zAlia
13c0: 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s1==0 ){.    zAl
13d0: 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e  ias1 = pTab1->zN
13e0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 73 65 74 54 6f  ame;.  }.  setTo
13f0: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 41 6c 69  ken(&dummy, zAli
1400: 61 73 31 29 3b 0a 20 20 70 45 31 62 20 3d 20 73  as1);.  pE1b = s
1410: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
1420: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1430: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1440: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1450: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1460: 0a 20 20 7d 0a 20 20 73 65 74 54 6f 6b 65 6e 28  .  }.  setToken(
1470: 26 64 75 6d 6d 79 2c 20 7a 41 6c 69 61 73 32 29  &dummy, zAlias2)
1480: 3b 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74  ;.  pE2b = sqlit
1490: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
14a0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70   0, &dummy);.  p
14b0: 45 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70  E1c = sqlite3Exp
14c0: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20  r(TK_DOT, pE1b, 
14d0: 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63  pE1a, 0);.  pE2c
14e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
14f0: 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32  K_DOT, pE2b, pE2
1500: 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71  a, 0);.  pE = sq
1510: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 45 51 2c  lite3Expr(TK_EQ,
1520: 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b   pE1c, pE2c, 0);
1530: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
1540: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1550: 69 6e 29 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d  in);.  *ppExpr =
1560: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1570: 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a  *ppExpr, pE);.}.
1580: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
1590: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
15a0: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
15b0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
15c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
15d0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
15e0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
15f0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1600: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1610: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1620: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1630: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
1640: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
1650: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
1660: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
1670: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
1680: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1690: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
16a0: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
16b0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
16c0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
16d0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
16e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
16f0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
1700: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
1710: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
1720: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
1730: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
1740: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1750: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  G clause..*/.sta
1760: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
1770: 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
1780: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
1790: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
17a0: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
17b0: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
17c0: 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  r(p->pLeft);.   
17d0: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
17e0: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
17f0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
1800: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
1810: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
1820: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1830: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
1840: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
1850: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
1860: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
1870: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1880: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
1890: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
18a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
18b0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
18c0: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
18d0: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
18e0: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
18f0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
1900: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
1910: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
1920: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
1930: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
1940: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
1950: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
1960: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
1970: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
1980: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
1990: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
19a0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
19b0: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
19c0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
19d0: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
19e0: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
19f0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
1a00: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
1a10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
1a20: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
1a30: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1a40: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
1a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1a60: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1a70: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
1a80: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
1a90: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
1aa0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
1ab0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1ac0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
1ad0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
1ae0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
1af0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
1b00: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1b10: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1b30: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1b40: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b50: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
1b60: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
1b70: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
1b80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b90: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
1ba0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
1bb0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
1bc0: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
1bd0: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
1be0: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
1bf0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
1c00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
1c10: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
1c20: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
1c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1c40: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
1c50: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
1c60: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
1c70: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20  Right->pTab;..  
1c80: 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d    if( pLeftTab==
1c90: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
1ca0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1cb0: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1cc0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1cd0: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
1ce0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1cf0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
1d00: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
1d10: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
1d20: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
1d30: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
1d40: 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ft->jointype & J
1d50: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1d60: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
1d70: 6e 20 7c 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69  n || pLeft->pUsi
1d80: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1d90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1da0: 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c  arse, "a NATURAL
1db0: 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61   join may not ha
1dc0: 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ve ".           
1dd0: 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  "an ON or USING 
1de0: 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20  clause", 0);.   
1df0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1e10: 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62  (j=0; j<pLeftTab
1e20: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1e30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1e40: 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43  e = pLeftTab->aC
1e50: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
1e60: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
1e70: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
1e80: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1e90: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
1ea0: 65 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74  erm(zName, pLeft
1eb0: 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69  Tab, pLeft->zAli
1ec0: 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  as, .           
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52     pRightTab, pR
1ef0: 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70  ight->zAlias, &p
1f00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
1f10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
1f30: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
1f40: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
1f50: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
1f60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1f70: 65 66 74 2d 3e 70 4f 6e 20 26 26 20 70 4c 65 66  eft->pOn && pLef
1f80: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
1f90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fa0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1fb0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
1fc0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
1fd0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
1fe0: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
1ff0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
2010: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
2020: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
2030: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2040: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
2050: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
2060: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
2070: 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20   if( pLeft->pOn 
2080: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
2090: 45 78 70 72 28 70 4c 65 66 74 2d 3e 70 4f 6e 29  Expr(pLeft->pOn)
20a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
20b0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
20c0: 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 4c  nd(p->pWhere, pL
20d0: 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  eft->pOn);.     
20e0: 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b   pLeft->pOn = 0;
20f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2100: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2110: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2120: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2130: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2140: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2150: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2160: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2170: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2180: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2190: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
21a0: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
21b0: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
21c0: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
21d0: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
21e0: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
21f0: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2200: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2210: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2220: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2230: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2240: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2250: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2260: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2270: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2280: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2290: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
22a0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
22b0: 70 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  pList = pLeft->p
22c0: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
22d0: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
22e0: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
22f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2300: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
2310: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2320: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
2330: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
2340: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2350: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
2360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2380: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
2390: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
23a0: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
23b0: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
23c0: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
23d0: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
23e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2400: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2410: 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  rm(zName, pLeftT
2420: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
2430: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
2460: 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70  t->zAlias, &p->p
2470: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
2480: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
24a0: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
24b0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
24c0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
24d0: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
24e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
24f0: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
2500: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
2510: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
2520: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2530: 65 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ete(p->pEList);.
2540: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2550: 44 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b  Delete(p->pSrc);
2560: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2570: 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b  lete(p->pWhere);
2580: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2590: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f  stDelete(p->pGro
25a0: 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  upBy);.  sqlite3
25b0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48  ExprDelete(p->pH
25c0: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
25d0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
25e0: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
25f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2600: 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  ete(p->pPrior);.
2610: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
2620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2630: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69   the aggregate i
2640: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2650: 74 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74  the parse struct
2660: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2670: 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67  oid sqliteAggreg
2680: 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72  ateInfoReset(Par
2690: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
26a0: 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65  qliteFree(pParse
26b0: 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73  ->aAgg);.  pPars
26c0: 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->aAgg = 0;.  p
26d0: 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b  Parse->nAgg = 0;
26e0: 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  .  pParse->useAg
26f0: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2700: 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f  Insert code into
2710: 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70   "v" that will p
2720: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f  ush the record o
2730: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
2740: 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74  .** stack into t
2750: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
2760: 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e  atic void pushOn
2770: 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a  toSorter(Parse *
2780: 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c  pParse, Vdbe *v,
2790: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
27a0: 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rBy){.  int i;. 
27b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
27c0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
27d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
27e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
27f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2800: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xpr);.  }.  sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2820: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
2830: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2840: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2860: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
2880: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2890: 4f 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54  OFFSET and LIMIT
28a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28b0: 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20 20 56  codeLimiter(.  V
28c0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
28d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
28e0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
28f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2910: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2920: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
2930: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2940: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2950: 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e   skip the curren
2960: 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  t record */.  in
2970: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
2980: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2990: 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  end the loop */.
29a0: 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20    int nPop      
29b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29c0: 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74   times to pop st
29d0: 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67  ack when jumping
29e0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
29f0: 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20  iOffset>=0 ){.  
2a00: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2a10: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2a20: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
2a30: 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61 64 64  if( nPop>0 ) add
2a40: 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r++;.    sqlite3
2a50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2a60: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66  MemIncr, p->iOff
2a70: 73 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  set, addr);.    
2a80: 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20  if( nPop>0 ){.  
2a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
2ab0: 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nPop, 0);.    }.
2ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
2ae0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
2af0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2b00: 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53  (v, "# skip OFFS
2b10: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
2b20: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d   }.  if( p->iLim
2b30: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
2b40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2b50: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2b60: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2b70: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
2b80: 28 28 76 2c 20 22 23 20 65 78 69 74 20 77 68 65  ((v, "# exit whe
2b90: 6e 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  n LIMIT reached"
2ba0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
2bb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2bc0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2bd0: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2be0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2bf0: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2c00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2c10: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c20: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c30: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c40: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c50: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2c60: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2c70: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2c80: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2c90: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2ca0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2cb0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2cc0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2cd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2ce0: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2cf0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d00: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d30: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d40: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d60: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2d70: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2d80: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2d90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2da0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2db0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2dc0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2dd0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2df0: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2e00: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2e10: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e30: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e40: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e50: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2e60: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2e70: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2e80: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2e90: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2ea0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2eb0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2ec0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2ed0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2ee0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2ef0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2f00: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2f10: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f20: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f30: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f40: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f50: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2f60: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2f80: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2f90: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2fa0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
2fd0: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
2fe0: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
2ff0: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
3000: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
3010: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
3020: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
3030: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3040: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3050: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
3060: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
3070: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3080: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3090: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
30a0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
30b0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
30c0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
30d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
30e0: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
30f0: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3100: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3110: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3120: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3130: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3140: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61  utput..  */.  ha
3150: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
3160: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3170: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
3180: 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  pr>0;.  if( pOrd
3190: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
31a0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
31b0: 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c  odeLimiter(v, p,
31c0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65   iContinue, iBre
31d0: 61 6b 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ak, 0);.  }..  /
31e0: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
31f0: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
3200: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
3210: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
3220: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
3230: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
3240: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3250: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
3260: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
3270: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20  se{.    nColumn 
3280: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
3290: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
32a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
32b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
32c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
32d0: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
32e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
32f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
3300: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
3310: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
3320: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3330: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
3340: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
3350: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
3360: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
3370: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
3380: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
3390: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
33a0: 74 69 6e 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c  tinct ){.#if NUL
33b0: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
33c0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  T.    sqlite3Vdb
33d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
33e0: 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45  ull, -pEList->nE
33f0: 78 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  xpr, sqlite3Vdbe
3400: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3410: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
3420: 20 44 65 6c 69 62 65 72 61 74 65 6c 79 20 6c 65   Deliberately le
3430: 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
3440: 20 73 74 72 69 6e 67 20 6f 66 66 20 6f 66 20 74   string off of t
3450: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
3460: 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   ** OP_MakeRecor
3470: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
3480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3490: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 45 4c 69  MakeRecord, pELi
34a0: 73 74 2d 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20  st->nExpr * -1, 
34b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
34c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
34d0: 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63  istinct, distinc
34e0: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
34f0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
3500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3520: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31   pEList->nExpr+1
3530: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3540: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3550: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3560: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3570: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
3580: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
3590: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
35a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
35b0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
35c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
35d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
35e0: 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69 6e  utStrKey, distin
35f0: 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
3600: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
3610: 20 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72       codeLimiter
3620: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3630: 2c 20 69 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d  , iBreak, nColum
3640: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
3650: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
3660: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
3670: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
3680: 45 4c 45 43 54 0a 20 20 20 20 2f 2a 20 49 6e 20  ELECT.    /* In 
3690: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
36a0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
36b0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
36c0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
36d0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
36e0: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
36f0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
3700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3720: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
3730: 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  , NULL_ALWAYS_DI
3740: 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73  STINCT);.      s
3750: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3760: 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50  P3(v, -1, aff, P
3770: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
3780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3790: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
37a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37c0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
37d0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
37e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
37f0: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
3800: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
3810: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
3820: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
3830: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
3840: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
3850: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
3860: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
3870: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
3880: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
3890: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
38a0: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
38b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
38c0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
38d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
38e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
38f0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3900: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3920: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3930: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
3940: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3950: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3960: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
3970: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
3980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3990: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
39a0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
39b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
39c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
39d0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
39e0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
39f0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
3a00: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
3a10: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
3a20: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
3a30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3a40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3a60: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
3a70: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3a80: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3a90: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3aa0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ad0: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50   OP_NewRecno, iP
3ae0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  arm, 0);.       
3af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b00: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
3b10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3b30: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
3b40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3b50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3b60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3b70: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
3b80: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
3b90: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
3ba0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
3bb0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
3bc0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
3bd0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
3be0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
3bf0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
3c00: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
3c10: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
3c20: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
3c30: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
3c40: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
3c50: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3c60: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
3c70: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
3c80: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
3c90: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
3ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3cb0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
3cc0: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ce0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
3cf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
3d00: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3d20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3d30: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3d40: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
3d50: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
3d60: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
3d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3d80: 63 68 61 72 20 61 66 66 20 3d 20 28 69 50 61 72  char aff = (iPar
3d90: 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20  m>>16)&0xFF;.   
3da0: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
3db0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
3dc0: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
3dd0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 20 20  Expr, aff);.    
3de0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
3df0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
3e00: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 2c  ord, 1, 0, &aff,
3e10: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
3e20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3e30: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
3e40: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3e60: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69  OP_PutStrKey, (i
3e70: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
3e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3ea0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32  hangeP2(v, addr2
3eb0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3ec0: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
3ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ee0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
3ef0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
3f00: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
3f10: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
3f20: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
3f30: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
3f40: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
3f50: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
3f60: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
3f70: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
3f80: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
3f90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
3fa0: 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  s:.    case SRT_
3fb0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
3fc0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3fd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3fe0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3ff0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4000: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
4010: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
4020: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4030: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4040: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
4050: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 1);.        s
4060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4070: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4080: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  Break);.      }.
4090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20   }..    /* Send 
40b0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
40c0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
40d0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
40e0: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
40f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f  .    case SRT_So
4100: 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66  rter: {.      if
4110: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4140: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4150: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4160: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4170: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4180: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4190: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
41a0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
41b0: 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ack );.        s
41c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
41d0: 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
41e0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
41f0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4200: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4210: 49 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75 74  Invoke a subrout
4220: 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ine to handle th
4230: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
4240: 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c  subroutine itsel
4250: 66 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73 70  f.    ** is resp
4260: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70 70  onsible for popp
4270: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
4280: 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63 6b  off of the stack
4290: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
42a0: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
42b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
42c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
42d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
42e0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
42f0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
4300: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
4310: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
4320: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
4330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4350: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
4360: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
4370: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4390: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
43a0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
43b0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
43c0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
43d0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
43e0: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
43f0: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
4400: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
4410: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
4420: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
4430: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
4440: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
4450: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
4460: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
4470: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
4480: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
4490: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
44a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
44b0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
44c0: 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
44d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
44e0: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  P_Pop, nColumn, 
44f0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4510: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4520: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
4530: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
4540: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
4550: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
4560: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
4570: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
4580: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
4590: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
45a0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
45b0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
45c0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
45d0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
45e0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
45f0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
4600: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
4610: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
4620: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
4630: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
4640: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
4650: 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  arse,   /* The p
4660: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4670: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
4680: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
4690: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
46a0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
46b0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
46c0: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
46d0: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
46e0: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  umn,     /* Numb
46f0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
4700: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65   data */.  int e
4710: 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57  Dest,       /* W
4720: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
4730: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
4740: 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20    int iParm     
4750: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70     /* Optional p
4760: 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61  arameter associa
4770: 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a  ted with eDest *
4780: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20  /.){.  int end1 
4790: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
47a0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
47b0: 20 65 6e 64 32 20 3d 20 73 71 6c 69 74 65 33 56   end2 = sqlite3V
47c0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
47d0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b  .  int addr;.  K
47e0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
47f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4800: 72 42 79 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  rBy;.  int nCol,
4810: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
4820: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4830: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4840: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
4850: 6e 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  n;.  pOrderBy = 
4860: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e  p->pOrderBy;.  n
4870: 43 6f 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Col = pOrderBy->
4880: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
4890: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
48a0: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
48b0: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
48c0: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
48d0: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65  f( pInfo==0 ) re
48e0: 74 75 72 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  turn;.  pInfo->a
48f0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61  SortOrder = (cha
4900: 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  r*)&pInfo->aColl
4910: 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d  [nCol];.  pInfo-
4920: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4940: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  l; i++){.    /* 
4950: 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  If a collation s
4960: 65 71 75 65 6e 63 65 20 77 61 73 20 73 70 65 63  equence was spec
4970: 69 66 69 65 64 20 65 78 70 6c 69 63 69 74 79 2c  ified explicity,
4980: 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
4990: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 4f 72  is stored in pOr
49a0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  derBy->a[i].zNam
49b0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  e. Otherwise, us
49c0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  e the default.  
49d0: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
49e0: 79 70 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  ype for the expr
49f0: 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ession..    */. 
4a00: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
4a10: 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
4a20: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
4a30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
4a40: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21  Expr);.    if( !
4a50: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4a60: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
4a70: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70  aColl[i] = db->p
4a80: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
4a90: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
4aa0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
4ab0: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
4ac0: 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  der;.  }.  sqlit
4ad0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
4ae0: 53 6f 72 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  Sort, 0, 0, (cha
4af0: 72 2a 29 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  r*)pInfo, P3_KEY
4b00: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
4b10: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
4b20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4b30: 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31  ortNext, 0, end1
4b40: 29 3b 0a 20 20 63 6f 64 65 4c 69 6d 69 74 65 72  );.  codeLimiter
4b50: 28 76 2c 20 70 2c 20 61 64 64 72 2c 20 65 6e 64  (v, p, addr, end
4b60: 32 2c 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28  2, 1);.  switch(
4b70: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4b80: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4b90: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
4ba0: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
4bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4bc0: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
4bd0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4bf0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
4c00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4c10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4c20: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
4c30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4c50: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4c60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4c70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c90: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4ca0: 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -1, sqlite3VdbeC
4cb0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4ce0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
4cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d00: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4d10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4d20: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d40: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4d50: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c  cord, 1, 0, "n",
4d60: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d80: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4d90: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
4da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4db0: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
4dc0: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
4dd0: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
4de0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4df0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
4e00: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  :.    case SRT_M
4e10: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4e20: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4e30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4e40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4e50: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
4e60: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4e70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4e80: 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b  _Goto, 0, end1);
4e90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ea0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
4eb0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
4ec0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
4ed0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
4ee0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
4ef0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4f00: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69  Integer, p->pELi
4f10: 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  st->nExpr, 0);. 
4f20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4f40: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 1, 0);.      f
4f50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
4f60: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
4f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f80: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
4f90: 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20  -1-i, i);.      
4fa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
4fb0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
4fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4fd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4fe0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4ff0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
5000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5020: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
5030: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
5040: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5050: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
5060: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   2, 0);.      br
5070: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5080: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5090: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
50a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50b0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
50c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
50d0: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
50e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
50f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
5100: 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  d2);.  sqlite3Vd
5110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
5120: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, 1, 0);.  sqli
5130: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5140: 62 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20  bel(v, end1);.  
5150: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5160: 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74  (v, OP_SortReset
5170: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
5180: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
5190: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
51a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
51b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
51c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
51d0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
51e0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
51f0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
5200: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
5210: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65 63  **.** If the dec
5220: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
5230: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
5240: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
5250: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
5260: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43 52   the original CR
5270: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5280: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
5290: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
52a0: 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  mn..** .** The d
52b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
52c0: 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f  for an expressio
52d0: 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58 54  n is either TEXT
52e0: 2c 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e 59  , NUMERIC or ANY
52f0: 2e 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  ..** The declara
5300: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
5310: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
5320: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
5330: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
5340: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
5350: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
5360: 2a 70 54 61 62 4c 69 73 74 2c 20 45 78 70 72 20  *pTabList, Expr 
5370: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
5380: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20 20  const *zType;.  
5390: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
53a0: 70 72 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73  pr==0 || pTabLis
53b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
53c0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 52  ..  sqlite3ExprR
53d0: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72  esolveNames(pPar
53e0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c  se, pTabList, 0,
53f0: 20 30 2c 20 70 45 78 70 72 2c 20 31 2c 20 30 29   0, pExpr, 1, 0)
5400: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41  ;..  /* The TK_A
5410: 53 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f  S operator can o
5420: 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44  nly occur in ORD
5430: 45 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c  ER BY, GROUP BY,
5440: 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e   HAVING,.  ** an
5450: 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2e  d LIMIT clauses.
5460: 20 20 42 75 74 20 70 45 78 70 72 20 6f 72 69 67    But pExpr orig
5470: 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 72 65  inates in the re
5480: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 0a 20 20  sult set of a.  
5490: 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53 6f 20 70  ** SELECT.  So p
54a0: 45 78 70 72 20 63 61 6e 20 6e 65 76 65 72 20 63  Expr can never c
54b0: 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20 6f 70 65  ontain an AS ope
54c0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  rator..  */.  as
54d0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
54e0: 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69  =TK_AS );..  swi
54f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5500: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
5510: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61  LUMN: {.      Ta
5520: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
5530: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
5540: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
5550: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
5560: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
5570: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
5580: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
5590: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
55a0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
55b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
55c0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
55d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
55e0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
55f0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
5600: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
5610: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
5620: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
5630: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
5640: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5650: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  <0 ){.        zT
5660: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
5670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5680: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
5690: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
56a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Type;.      }.  
56b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
56c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
56d0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 53 65 6c  ECT: {.      Sel
56e0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
56f0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
5700: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
5710: 70 65 28 70 50 61 72 73 65 2c 20 70 53 2d 3e 70  pe(pParse, pS->p
5720: 53 72 63 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d  Src, pS->pEList-
5730: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20  >a[0].pExpr); . 
5740: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5750: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
5760: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
5770: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
5780: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
5790: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
57a0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
57b0: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
57c0: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
57d0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
57e0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
57f0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5800: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
5810: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5820: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
5830: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
5840: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5850: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
5860: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5870: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5880: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5890: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
58a0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
58b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
58c0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
58d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
58e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
58f0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
5900: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5910: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
5920: 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e   *zType = column
5930: 54 79 70 65 28 70 50 61 72 73 65 2c 20 70 54 61  Type(pParse, pTa
5940: 62 4c 69 73 74 2c 20 70 29 3b 0a 20 20 20 20 69  bList, p);.    i
5950: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
5960: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
5970: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
5980: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
5990: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
59a0: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
59b0: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
59c0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
59d0: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
59e0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
59f0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5a00: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5a10: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
5a20: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
5a30: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
5a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5a50: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5a60: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5a70: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5a80: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5a90: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
5aa0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
5ab0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
5ac0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
5ad0: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
5ae0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
5af0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
5b00: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
5b10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b20: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5b30: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
5b40: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
5b50: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
5b60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5b70: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
5b80: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5b90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5ba0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5bb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5bc0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
5bd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5be0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
5bf0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
5c00: 73 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s;..#ifdef SQLIT
5c10: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
5c20: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5c30: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
5c40: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
5c50: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
5c60: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
5c70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
5c80: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
5c90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
5ca0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
5cb0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  0 || sqlite3_mal
5cc0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
5cd0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
5ce0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
5cf0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
5d00: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5d10: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
5d20: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
5d30: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
5d40: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
5d50: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
5d60: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
5d70: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
5d80: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
5d90: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
5da0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
5db0: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
5dc0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5dd0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
5de0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
5df0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
5e00: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
5e10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
5e20: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
5e30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
5e50: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
5e60: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
5e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5e80: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
5e90: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
5ea0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
5eb0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
5ec0: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
5ed0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
5ee0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
5ef0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
5f00: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
5f10: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
5f20: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
5f30: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
5f40: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
5f50: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
5f60: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5f70: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
5f80: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
5f90: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
5fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
5fb0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
5fc0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5fd0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
5fe0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
5ff0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
6000: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
6010: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
6020: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
6030: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
6040: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
6050: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
6060: 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e  Names && p->span
6070: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
6080: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
6090: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
60a0: 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61  ame(v, i, p->spa
60b0: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
60c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
60d0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21   fullNames || (!
60e0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54  shortNames && pT
60f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
6100: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6110: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
6120: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
6130: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
6140: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6150: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
6160: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
6170: 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20   zTab==0 ) zTab 
6180: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
61a0: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
61b0: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
61c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
61d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
61e0: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
61f0: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
6200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6220: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43  ColName(v, i, zC
6230: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
6240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6250: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
6260: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
6270: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
6280: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6290: 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e  e(v, i, p->span.
62a0: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
62b0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
62c0: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
62d0: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
62e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
62f0: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
6300: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6310: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
6320: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
6330: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e        sprintf(zN
6340: 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  ame, "column%d",
6350: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
6360: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6370: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
6380: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
6390: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
63a0: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
63b0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
63c0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
63d0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
63e0: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
63f0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
6400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
6410: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
6420: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
6430: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
6440: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
6450: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
6460: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
6470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6480: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
6490: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
64a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
64b0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
64c0: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
64d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
64e0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
64f0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
6500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
6510: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
6520: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
6530: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
6540: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
6550: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
6560: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
6570: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
6580: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
6590: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
65a0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
65b0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
65c0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
65d0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
65e0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
65f0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
6600: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
6610: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
6620: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
6630: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
6640: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
6650: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
6660: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
6670: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
6680: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
6690: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
66a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
66b0: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
66c0: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
66d0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
66e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
66f0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a  0;.  }.  pTab->z
6700: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
6710: 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  ? sqliteStrDup(z
6720: 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20  TabName) : 0;.  
6730: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
6740: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62  ->pEList;.  pTab
6750: 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ->nCol = pEList-
6760: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
6770: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
6780: 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d  ;.  pTab->aCol =
6790: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61   aCol = sqliteMa
67a0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61  lloc( sizeof(pTa
67b0: 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62  b->aCol[0])*pTab
67c0: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28  ->nCol );.  for(
67d0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
67e0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
67f0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
6800: 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20  Expr *p, *pR;.  
6810: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
6820: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6830: 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 6e      char *zBasen
6840: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ame;.    int cnt
6850: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65  ;.    .    /* Ge
6860: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
6870: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
6880: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
6890: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
68a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
68b0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
68c0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
68d0: 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e  oken.z==0 || p->
68e0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
68f0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
6900: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
6910: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
6920: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
6930: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
6940: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
6950: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
6960: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
6970: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
6980: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
6990: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
69a0: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
69b0: 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  DOT .           
69c0: 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69     && (pR=p->pRi
69d0: 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74  ght)!=0 && pR->t
69e0: 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f  oken.z && pR->to
69f0: 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  ken.z[0] ){.    
6a00: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
6a10: 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42   of the from A.B
6a20: 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61   use B as the na
6a30: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6a40: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
6a50: 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f  tf("%T", &pR->to
6a60: 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ken);.    }else 
6a70: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
6a80: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
6a90: 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  .      /* Use th
6aa0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
6ab0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
6ac0: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
6ad0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
6ae0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
6af0: 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73  intf("%T", &p->s
6b00: 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pan);.    }else{
6b10: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c  .      /* If all
6b20: 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b   else fails, mak
6b30: 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20  e up a name */. 
6b40: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6b50: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c  ite3MPrintf("col
6b60: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
6b70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
6b80: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a  equote(zName);..
6b90: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
6ba0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6bb0: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
6bc0: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
6bd0: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
6be0: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
6bf0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
6c00: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
6c10: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
6c20: 20 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e    zBasename = zN
6c30: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  ame;.    for(j=c
6c40: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
6c50: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6c60: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
6c70: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
6c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
6c90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
6ca0: 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42  intf("%s:%d", zB
6cb0: 61 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  asename, ++cnt);
6cc0: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
6cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6ce0: 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61 6d 65     if( zBasename
6cf0: 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  !=zName ){.     
6d00: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 61 73   sqliteFree(zBas
6d10: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
6d20: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
6d30: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
6d40: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
6d50: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
6d60: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
6d70: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
6d80: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
6d90: 20 20 2a 2f 0a 20 20 20 20 7a 54 79 70 65 20 3d    */.    zType =
6da0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f   sqliteStrDup(co
6db0: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c  lumnType(pParse,
6dc0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20 2c   pSelect->pSrc ,
6dd0: 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  p));.    pCol->z
6de0: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
6df0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
6e00: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
6e10: 4d 45 52 49 43 3b 0a 20 20 20 20 69 66 28 20 7a  MERIC;.    if( z
6e20: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 70 43  Type ){.      pC
6e30: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
6e40: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
6e50: 70 65 28 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e  pe(zType, strlen
6e60: 28 7a 54 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a  (zType));.    }.
6e70: 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20      pCol->pColl 
6e80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6e90: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
6ea0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e  .    if( !pCol->
6eb0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
6ec0: 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61  Col->pColl = pPa
6ed0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
6ee0: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ll;.    }.  }.  
6ef0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
6f00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
6f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
6f20: 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  e a SELECT state
6f30: 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
6f40: 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65  ing by doing the
6f50: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
6f60: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings:.**.**    (
6f70: 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
6f80: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
6f90: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
6fa0: 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
6fb0: 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
6fc0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
6fd0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
6fe0: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
6ff0: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
7000: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
7010: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
7020: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
7030: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
7040: 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
7050: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7060: 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
7070: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
7080: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
7090: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
70a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
70b0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
70c0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
70d0: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
70e0: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
70f0: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
7100: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
7110: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
7120: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
7130: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
7140: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
7150: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
7160: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
7170: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
7180: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
7190: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
71a0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
71b0: 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
71c0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
71d0: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
71e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
71f0: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
7200: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
7210: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7220: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
7230: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
7240: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
7250: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
7260: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
7270: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
7280: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
7290: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
72a0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
72b0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
72c0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
72d0: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
72e0: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
72f0: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
7300: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
7310: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
7320: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
7330: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
7340: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
7350: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
7360: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
7370: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7380: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
7390: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
73a0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
73b0: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
73c0: 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mt(Parse *pParse
73d0: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
73e0: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b  int i, j, k, rc;
73f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
7400: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
7410: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
7420: 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72 75 63  e *pTab;.  struc
7430: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7440: 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d  pFrom;..  if( p=
7450: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
7460: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
7470: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
7480: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
7490: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
74a0: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
74b0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
74c0: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
74d0: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
74e0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
74f0: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
7500: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
7510: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
7520: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
7530: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7540: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
7550: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
7560: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7570: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
7580: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
7590: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
75a0: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
75b0: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
75c0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
75d0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
75e0: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
75f0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
7600: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
7610: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
7620: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
7630: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
7640: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
7650: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
7660: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
7670: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
7680: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
7690: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
76a0: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
76b0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
76c0: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
76d0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
76e0: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
76f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
7700: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
7710: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  >zName==0 ){.   
7720: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
7730: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
7740: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
7750: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
7760: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
7770: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
7780: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
77a0: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
77b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
77c0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
77d0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
77e0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
77f0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
7800: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
7810: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
7820: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
7830: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7840: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
7850: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
7860: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7880: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7890: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
78a0: 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69  Transient flag i
78b0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
78c0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
78d0: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
78e0: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
78f0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
7900: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
7910: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
7920: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
7930: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
7940: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
7950: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
7960: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
7970: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
7980: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
7990: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
79a0: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
79b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
79c0: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
79d0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
79e0: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
79f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
7a00: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
7a10: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
7a20: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
7a30: 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a  (pParse,pFrom->z
7a40: 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
7a50: 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
7a60: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7a70: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7a80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7a90: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
7aa0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
7ab0: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
7ac0: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
7ad0: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
7ae0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7af0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
7b00: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
7b10: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
7b20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7b40: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
7b50: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
7b60: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
7b70: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
7b80: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
7b90: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
7ba0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
7bb0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
7bc0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
7bd0: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
7be0: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
7bf0: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
7c00: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
7c10: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
7c20: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7c30: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
7c40: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
7c50: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
7c60: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7c70: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
7c80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7c90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7ca0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
7cb0: 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
7cc0: 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
7cd0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
7ce0: 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
7cf0: 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73  if( sqliteProces
7d00: 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
7d10: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
7d20: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
7d30: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
7d40: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
7d50: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
7d60: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
7d70: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
7d80: 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
7d90: 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
7da0: 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
7db0: 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
7dc0: 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
7dd0: 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
7de0: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
7df0: 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
7e00: 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
7e10: 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
7e20: 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
7e30: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
7e40: 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
7e50: 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
7e60: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
7e70: 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
7e80: 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
7e90: 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
7ea0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
7eb0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
7ec0: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
7ed0: 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
7ee0: 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
7ef0: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
7f00: 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
7f10: 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
7f20: 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
7f30: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
7f40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
7f50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
7f60: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
7f70: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
7f80: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
7f90: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
7fa0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
7fb0: 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
7fc0: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
7fd0: 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
7fe0: 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
7ff0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
8000: 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
8010: 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20    rc = 0;.  if( 
8020: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
8030: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
8040: 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
8050: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
8060: 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
8070: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
8080: 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
8090: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
80a0: 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
80b0: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
80c0: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
80d0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
80e0: 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
80f0: 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
8100: 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
8110: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8120: 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
8130: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
8140: 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b  w = 0;.    for(k
8150: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
8160: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
8170: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
8180: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
8190: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
81a0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
81b0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
81c0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
81d0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
81e0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
81f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
8200: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
8210: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
8220: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
8230: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8240: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8250: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8260: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
8270: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
8280: 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
8290: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
82a0: 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
82b0: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
82c0: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
82d0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
82e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
82f0: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
8300: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
8310: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
8320: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
8330: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
8340: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
8350: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
8360: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
8370: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
8380: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
8390: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
83a0: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
83b0: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
83c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
83d0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
83e0: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
83f0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
8400: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
8410: 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d  oken(&pE->pLeft-
8420: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
8430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8440: 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
8450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8460: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
8470: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
8480: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
8490: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
84a0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
84b0: 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
84c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
84d0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
84e0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
84f0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
8500: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
8510: 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20  e[0]==0 ){ .    
8520: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
8530: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8540: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8550: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
8560: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
8570: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
8580: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
8590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
85a0: 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
85b0: 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a  TabName)!=0) ){.
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
85d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
85e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
85f0: 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
8600: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8610: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
8620: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
8630: 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66  pr *pExpr, *pLef
8640: 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  t, *pRight;.    
8650: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8660: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
8670: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  [j].zName;..    
8680: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
8690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
86a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
86b0: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
86c0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
86d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
86e0: 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  f( (pLeft->joint
86f0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
8700: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
8730: 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
8740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8750: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
8760: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
8770: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
8780: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
8790: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
87a0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
87b0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
87c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
87f0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
8800: 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e  dex(pLeft->pUsin
8810: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
8840: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
8850: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
8860: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
8870: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
8880: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
8890: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
88a0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
88b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
88e0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
88f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
8900: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
8910: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8920: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
8930: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
8940: 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d  etToken(&pRight-
8950: 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a  >token, zName);.
8960: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8970: 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54 61 62  zTabName && pTab
8980: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
89a0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
89b0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
89c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
89d0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
89e0: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65  Expr(TK_DOT, pLe
89f0: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8a10: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
8a20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8a30: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66    setToken(&pLef
8a40: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
8a50: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
8a60: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
8a70: 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65  pr->span, sqlite
8a80: 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22  3MPrintf("%s.%s"
8a90: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
8aa0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
8ab0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
8ac0: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
8ad0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8ae0: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
8af0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8b00: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
8b10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8b20: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
8b40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
8b50: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
8b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8b70: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
8b80: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
8b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8ba0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8bb0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8bc0: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  d(pNew, pExpr, &
8bd0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
8be0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8bf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8c00: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
8c10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
8c20: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
8c30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8c40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8c50: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
8c60: 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
8c70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8c80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8c90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8ca0: 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
8cb0: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
8cc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
8cd0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
8ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
8cf0: 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e(zTName);.     
8d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8d10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8d20: 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  te(pEList);.    
8d30: 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
8d40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8d50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
8d60: 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69   routine recursi
8d70: 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65  vely unlinks the
8d80: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d   Select.pSrc.a[]
8d90: 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a  .pTab pointers.*
8da0: 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74  * in a select st
8db0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73  ructure.  It jus
8dc0: 74 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74  t sets the point
8dd0: 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68  ers to NULL.  Th
8de0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
8df0: 20 72 65 63 75 72 73 69 76 65 20 69 6e 20 74 68   recursive in th
8e00: 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 66 20  e sense that if 
8e10: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e  the Select.pSrc.
8e20: 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70  a[].pSelect.** p
8e30: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
8e40: 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  LL, this routine
8e50: 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
8e60: 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70  sively on that p
8e70: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
8e80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8e90: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65  lled on the Sele
8ea0: 63 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ct structure tha
8eb0: 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56  t defines a.** V
8ec0: 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  IEW in order to 
8ed0: 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67  undo any binding
8ee0: 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68  s to tables.  Th
8ef0: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a  is is necessary.
8f00: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73 65  ** because those
8f10: 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65   tables might be
8f20: 20 44 52 4f 50 65 64 20 62 79 20 61 20 73 75 62   DROPed by a sub
8f30: 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d  sequent SQL comm
8f40: 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62  and..** If the b
8f50: 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  indings are not 
8f60: 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68  removed, then th
8f70: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61  e Select.pSrc->a
8f80: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a  [].pTab field.**
8f90: 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
8fa0: 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c  inting to a deal
8fb0: 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73 74  located Table st
8fc0: 72 75 63 74 75 72 65 20 61 66 74 65 72 20 74 68  ructure after th
8fd0: 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20  e.** DROP and a 
8fe0: 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63  coredump will oc
8ff0: 63 75 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d  cur the next tim
9000: 65 20 74 68 65 20 56 49 45 57 20 69 73 20 75 73  e the VIEW is us
9010: 65 64 2e 0a 2a 2f 0a 23 69 66 20 30 0a 76 6f 69  ed..*/.#if 0.voi
9020: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55  d sqlite3SelectU
9030: 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29  nbind(Select *p)
9040: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  {.  int i;.  Src
9050: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
9060: 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
9070: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
9080: 65 6d 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  em;.  Table *pTa
9090: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
90a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
90b0: 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  0, pItem=pSrc->a
90c0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
90d0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
90e0: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
90f0: 49 74 65 6d 2d 3e 70 54 61 62 29 21 3d 30 20 29  Item->pTab)!=0 )
9100: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  {.      if( pTab
9110: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
9120: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9130: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
9140: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
9150: 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
9160: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
9170: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
9180: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9190: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 49 74  SelectUnbind(pIt
91a0: 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
91b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
91c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
91d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
91e0: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
91f0: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
9200: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
9210: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
9220: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
9230: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
9240: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
9250: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
9260: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
9270: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
9280: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
9290: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
92a0: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
92b0: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
92c0: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
92d0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
92e0: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
92f0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
9300: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
9310: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
9320: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
9330: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
9340: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
9350: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
9360: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
9370: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
9380: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
9390: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
93a0: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
93b0: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
93c0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
93d0: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
93e0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
93f0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
9400: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
9410: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
9420: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
9430: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
9440: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9450: 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61  * A place to lea
9460: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
9470: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
9480: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f  Select,        /
9490: 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c  * Match to resul
94a0: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69  t columns of thi
94b0: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78  s SELECT */.  Ex
94c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
94d0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
94e0: 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20  ER BY values to 
94f0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f  match against co
9500: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lumns */.  int i
9510: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
9520: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
9530: 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c  s value in iTabl
9540: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43  e */.  int mustC
9550: 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f  omplete        /
9560: 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52  * If TRUE all OR
9570: 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74  DER BYs must mat
9580: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ch */.){.  int n
9590: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
95a0: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
95b0: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
95c0: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
95d0: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
95e0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74  rn 1;.  if( must
95f0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
9600: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
9610: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
9620: 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  { pOrderBy->a[i]
9630: 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d  .done = 0; }.  }
9640: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
9650: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
9660: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
9670: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9680: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
9690: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
96a0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
96b0: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
96c0: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
96d0: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
96e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
96f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
9700: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
9710: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
9720: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9730: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
9740: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
9750: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9760: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
9770: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
9780: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9790: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
97a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
97b0: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
97c0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
97d0: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
97e0: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
97f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9800: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9810: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52  e,.          "OR
9820: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
9830: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
9840: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
9850: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20            iCol, 
9860: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9870: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
9880: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
98a0: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
98b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
98c0: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
98d0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
98e0: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
98f0: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
9900: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
9910: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
9920: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
9930: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
9940: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
9950: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
9960: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
9970: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
9980: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
9990: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e  Label = sqlite3N
99a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
99b0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
99c0: 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c    assert( zLabel
99d0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
99e0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
99f0: 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29  p(zName, zLabel)
9a00: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
9a10: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
9a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9a30: 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29  liteFree(zLabel)
9a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9a50: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71  if( iCol<0 && sq
9a60: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
9a70: 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  (pE, pEList->a[j
9a80: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9a90: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
9aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9ab0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
9ac0: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
9ad0: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
9ae0: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
9af0: 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61  l;.      pE->iTa
9b00: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
9b10: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
9b20: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
9b30: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c   }.    if( iCol<
9b40: 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74  0 && mustComplet
9b50: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
9b60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9b70: 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45  e,.        "ORDE
9b80: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
9b90: 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   %d does not mat
9ba0: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
9bb0: 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20  lumn", i+1);.   
9bc0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
9bd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9be0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
9bf0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20    .}../*.** Get 
9c00: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
9c10: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
9c20: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
9c30: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
9c40: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
9c50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
9c60: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
9c70: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
9c80: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
9c90: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
9ca0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
9cb0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9cc0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
9cd0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
9ce0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
9cf0: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
9d00: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
9d10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
9d20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
9d30: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
9d40: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
9d50: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
9d60: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d  d on the.** nLim
9d70: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66  it and nOffset f
9d80: 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61  ields.  nLimit a
9d90: 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd nOffset hold 
9da0: 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  the integers.** 
9db0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
9dc0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
9dd0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
9de0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
9df0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
9e00: 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20  .  Or that hold 
9e10: 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73  -1 and 0 if thos
9e20: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
9e30: 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69  mitted..** iLimi
9e40: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
9e50: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
9e60: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
9e70: 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75  mbers for.** cou
9e80: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
9e90: 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
9ea0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
9eb0: 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c  there is no.** l
9ec0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
9ed0: 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20  et, then iLimit 
9ee0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9ef0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
9f00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
9f10: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
9f20: 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  if iLimit and iO
9f30: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
9f40: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
9f50: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
9f60: 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66   nLimit and nOff
9f70: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
9f80: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
9f90: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
9fa0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
9fb0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
9fc0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
9fd0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
9fe0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
9ff0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
a000: 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69  ** Only if nLimi
a010: 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e  t>=0 or nOffset>
a020: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
a030: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
a040: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
a050: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
a060: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
a070: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
a080: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
a090: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
a0a0: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
a0b0: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
a0c0: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
a0d0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
a0e0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
a0f0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
a100: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
a110: 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20  ect *p){.  /* . 
a120: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61   ** If the compa
a130: 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d  rison is p->nLim
a140: 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54  it>0 then "LIMIT
a150: 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61   0" shows.  ** a
a160: 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20  ll rows.  It is 
a170: 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c  the same as no l
a180: 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d  imit. If the com
a190: 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a  parision is.  **
a1a0: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68   p->nLimit>=0 th
a1b0: 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f  en "LIMIT 0" sho
a1c0: 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c  w no rows at all
a1d0: 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31  ..  ** "LIMIT -1
a1e0: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
a1f0: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
a200: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
a210: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
a220: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
a230: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
a240: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
a250: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
a260: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
a270: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
a280: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
a290: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69   */.  if( p->nLi
a2a0: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit>=0 ){.    in
a2b0: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
a2c0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
a2d0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
a2e0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a2f0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
a300: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
a310: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a320: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c  _Integer, -p->nL
a330: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
a340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a350: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
a360: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
a370: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
a380: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
a390: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
a3a0: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
a3b0: 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29  ( p->nOffset>0 )
a3c0: 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  {.    int iMem =
a3d0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
a3e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
a3f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
a400: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
a410: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a430: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a440: 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30  , -p->nOffset, 0
a450: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a460: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
a470: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
a480: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
a490: 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20  t((v, "# OFFSET 
a4a0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
a4b0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65  p->iOffset = iMe
a4c0: 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m;.  }.}../*.** 
a4d0: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e  Generate VDBE in
a4e0: 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
a4f0: 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e  will open a tran
a500: 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  sient table that
a510: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .** will be used
a520: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72   for an index or
a530: 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20   to store keyed 
a540: 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f  results for a co
a550: 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  mpound.** select
a560: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a570: 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  s, open a transi
a580: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e  ent table that n
a590: 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66  eeds a.** KeyInf
a5a0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
a5b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
a5c0: 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e  mns in the KeyIn
a5d0: 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  fo is determined
a5e0: 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c  .** by the resul
a5f0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
a600: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
a610: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
a620: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  ment..**.** Spec
a630: 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72  ifically, this r
a640: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a650: 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65   to open an inde
a660: 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44  x table for.** D
a670: 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20  ISTINCT, UNION, 
a680: 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45 58  INTERSECT and EX
a690: 43 45 50 54 20 73 65 6c 65 63 74 20 73 74 61 74  CEPT select stat
a6a0: 65 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20  ements (but not 
a6b0: 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  .** UNION ALL)..
a6c0: 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e  **.** Make the n
a6d0: 65 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73  ew table a KeyAs
a6e0: 44 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65  Data table if ke
a6f0: 79 41 73 44 61 74 61 20 69 73 20 74 72 75 65 2e  yAsData is true.
a700: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
a710: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
a720: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
a730: 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74  OP_OpenTemp inst
a740: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruction..*/.stat
a750: 69 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49  ic int openTempI
a760: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
a770: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
a780: 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79  nt iTab, int key
a790: 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e  AsData){.  KeyIn
a7a0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
a7b0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73  int nColumn;.  s
a7c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a7d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
a7e0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a7f0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
a800: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20  nt addr;..  if( 
a810: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
a820: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
a830: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a840: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45   nColumn = p->pE
a850: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
a860: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
a870: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
a880: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d  pKeyInfo)+nColum
a890: 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  n*sizeof(CollSeq
a8a0: 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  *) );.  if( pKey
a8b0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
a8c0: 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e   0;.  pKeyInfo->
a8d0: 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20  enc = db->enc;. 
a8e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
a8f0: 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66  d = nColumn;.  f
a900: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
a910: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b 65  n; i++){.    pKe
a920: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
a930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a940: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
a950: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
a960: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  pr);.    if( !pK
a970: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
a980: 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e   ){.      pKeyIn
a990: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64  fo->aColl[i] = d
a9a0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
a9b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d    }.  }.  addr =
a9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a9d0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
a9e0: 69 54 61 62 2c 20 30 2c 20 0a 20 20 20 20 20 20  iTab, 0, .      
a9f0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
aa00: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
aa10: 4f 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79 41  OFF);.  if( keyA
aa20: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71 6c  sData ){.    sql
aa30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aa40: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 69   OP_KeyAsData, i
aa50: 54 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Tab, 1);.  }.  r
aa60: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
aa70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aa80: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
aa90: 43 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  CT./*.** Add the
aaa0: 20 61 64 64 72 65 73 73 20 22 61 64 64 72 22 20   address "addr" 
aab0: 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  to the set of al
aac0: 6c 20 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64  l OpenTemp opcod
aad0: 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a 20 74  e addresses.** t
aae0: 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 61 63  hat are being ac
aaf0: 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d 3e  cumulated in p->
ab00: 70 70 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a 73  ppOpenTemp..*/.s
ab10: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
ab20: 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64  electOpenTempAdd
ab30: 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  r(Select *p, int
ab40: 20 61 64 64 72 29 7b 0a 20 20 49 64 4c 69 73 74   addr){.  IdList
ab50: 20 2a 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70 70   *pList = *p->pp
ab60: 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74  OpenTemp = sqlit
ab70: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a  e3IdListAppend(*
ab80: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30  p->ppOpenTemp, 0
ab90: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
aba0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
abb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
abc0: 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  }.  pList->a[pLi
abd0: 73 74 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d  st->nId-1].idx =
abe0: 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20   addr;.  return 
abf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
ac00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ac10: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
ac20: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
ac30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ac40: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
ac50: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
ac60: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
ac70: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
ac80: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
ac90: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
aca0: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
acb0: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
acc0: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
acd0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
ace0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
acf0: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
ad00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
ad10: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
ad20: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
ad30: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
ad40: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
ad50: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
ad60: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
ad70: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
ad80: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ad90: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
ada0: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
adb0: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
adc0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
add0: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
ade0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
adf0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
ae00: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
ae10: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
ae20: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
ae30: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
ae40: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
ae50: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  0;.  }.  if( pRe
ae60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74  t==0 ){.    pRet
ae70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ae80: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
ae90: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
aea0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
aeb0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
aec0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
aed0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
aee0: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
aef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
af00: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
af10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
af20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
af30: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
af40: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
af50: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
af60: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
af70: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
af80: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
af90: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
afa0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
afb0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
afc0: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
afd0: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
afe0: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
aff0: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
b000: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
b010: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
b020: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
b030: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
b040: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
b050: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
b060: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
b070: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
b080: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
b090: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
b0a0: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
b0b0: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
b0c0: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
b0d0: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
b0e0: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
b0f0: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
b100: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
b110: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
b120: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
b130: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
b140: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
b150: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
b160: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
b170: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
b180: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
b190: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
b1a0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
b1b0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
b1c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b1d0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
b1e0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
b1f0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
b200: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
b210: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
b220: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
b230: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
b240: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
b250: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
b260: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
b270: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
b280: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
b290: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
b2a0: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
b2b0: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
b2c0: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
b2d0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
b2e0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
b2f0: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
b300: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
b310: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
b320: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
b330: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
b340: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
b350: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
b360: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
b370: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b380: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
b390: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b3a0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
b3b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
b3c0: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
b3d0: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
b3e0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
b3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f            /* \__
b400: 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20 72  _  Store query r
b410: 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69 66  esults as specif
b420: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ied */.  int iPa
b430: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rm,            /
b440: 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73 65  * /     by these
b450: 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e   two parameters.
b460: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68           */.  ch
b470: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
b480: 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
b490: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
b4a0: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
b4b0: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
b4c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
b4d0: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
b4e0: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
b4f0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
b500: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
b510: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
b520: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
b530: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
b540: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
b550: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
b560: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
b570: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70  */.  IdList *pOp
b580: 65 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f 50  enTemp = 0;/* OP
b590: 5f 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65  _OpenTemp opcode
b5a0: 73 20 74 68 61 74 20 6e 65 65 64 20 61 20 4b 65  s that need a Ke
b5b0: 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  yInfo */.  int a
b5c0: 41 64 64 72 5b 35 5d 3b 20 20 20 20 20 20 20 20  Addr[5];        
b5d0: 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 6f 66   /* Addresses of
b5e0: 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f   SetNumColumns o
b5f0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
b600: 74 20 6e 41 64 64 72 20 3d 20 30 3b 20 20 20 20  t nAddr = 0;    
b610: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 73      /* Number us
b620: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ed */.  int nCol
b630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b640: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b650: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
b660: 20 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61   set */..  /* Ma
b670: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
b680: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
b690: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
b6a0: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
b6b0: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
b6c0: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
b6d0: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
b6e0: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
b6f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
b700: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
b710: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
b720: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
b730: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
b740: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
b750: 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  }.  pPrior = p->
b760: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50  pPrior;.  if( pP
b770: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
b780: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b790: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
b7a0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
b7b0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
b7c0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
b7d0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
b7e0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
b7f0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
b800: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b810: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
b820: 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c  ior->nLimit>=0 |
b830: 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65  | pPrior->nOffse
b840: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
b850: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b860: 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
b870: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
b880: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
b890: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
b8a0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
b8b0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
b8c0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
b8d0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
b8e0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
b8f0: 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65   a valid query e
b900: 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20  ngine.  If not, 
b910: 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
b920: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
b930: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b940: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
b950: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
b960: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b970: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
b980: 20 2f 2a 20 49 66 20 2a 70 20 74 68 69 73 20 69   /* If *p this i
b990: 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
b9a0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
b9b0: 74 2c 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69  t, then initiali
b9c0: 7a 65 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70 65  ze.  ** p->ppOpe
b9d0: 6e 54 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20 74  nTemp to point t
b9e0: 6f 20 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49 66  o pOpenTemp.  If
b9f0: 20 2a 70 20 69 73 20 6e 6f 74 20 74 68 65 20 72   *p is not the r
ba00: 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight most.  ** s
ba10: 74 61 74 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d  tatement then p-
ba20: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c 6c  >ppOpenTemp will
ba30: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
ba40: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 20  en initialized. 
ba50: 20 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20 63   ** by a prior c
ba60: 61 6c 6c 20 74 6f 20 74 68 69 73 20 73 61 6d 65  all to this same
ba70: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 50 61 73   procedure.  Pas
ba80: 73 20 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70 65  s along the pOpe
ba90: 6e 54 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e 74  nTemp.  ** point
baa0: 65 72 20 74 6f 20 70 50 72 69 6f 72 2c 20 74 68  er to pPrior, th
bab0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
bac0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20   to our left..  
bad0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f 70  */.  if( p->ppOp
bae0: 65 6e 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  enTemp==0 ){.   
baf0: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d   p->ppOpenTemp =
bb00: 20 26 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d   &pOpenTemp;.  }
bb10: 0a 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65  .  pPrior->ppOpe
bb20: 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65  nTemp = p->ppOpe
bb30: 6e 54 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72 65  nTemp;..  /* Cre
bb40: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
bb50: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
bb60: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
bb70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
bb80: 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
bb90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bba0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
bbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbc0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
bbd0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
bbe0: 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3d 3d   assert( nAddr==
bbf0: 30 20 29 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e  0 );.    aAddr[n
bc00: 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  Addr++] = sqlite
bc10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bc20: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
bc30: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65  iParm, 0);.    e
bc40: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
bc50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
bc60: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
bc70: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
bc80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bc90: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
bca0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
bcb0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
bcc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
bcd0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
bce0: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69     pPrior->nLimi
bcf0: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
bd00: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e         pPrior->n
bd10: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
bd20: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  set;.        rc 
bd30: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
bd40: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
bd50: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
bd60: 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29 3b 0a   0, 0, aff, 0);.
bd70: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
bd80: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
bd90: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bda0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
bdb0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
bdc0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
bdd0: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
bde0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
bdf0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
be00: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
be10: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
be20: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d  = -1;.        p-
be30: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
be40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
be50: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
be60: 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
be70: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20  , 0, 0, 0, aff, 
be80: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  0);.        p->p
be90: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
bea0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
beb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
bec0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bed0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
bee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bef0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72    }.      /* For
bf00: 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f   UNION ALL ... O
bf10: 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72  RDER BY fall thr
bf20: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
bf30: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
bf40: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
bf50: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
bf60: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
bf70: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
bf80: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
bf90: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
bfa0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
bfb0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
bfc0: 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  nt op = 0;      
bfd0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
bfe0: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
bff0: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
c000: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
c010: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
c020: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
c030: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
c040: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
c050: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f    int nLimit, nO
c060: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
c070: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
c080: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
c090: 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  et */.      Expr
c0a0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
c0b0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
c0c0: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
c0d0: 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a  right SELECT */.
c0e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c0f0: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
c100: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f   p->op==TK_ALL ?
c110: 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54   SRT_Table : SRT
c120: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
c130: 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  ( eDest==priorOp
c140: 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d   && p->pOrderBy=
c150: 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c  =0 && p->nLimit<
c160: 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d  0 && p->nOffset=
c170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c180: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
c190: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c1a0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
c1b0: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
c1c0: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
c1d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c1e0: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61    unionTab = iPa
c1f0: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
c200: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
c210: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
c220: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
c230: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
c240: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
c250: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
c260: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
c270: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
c280: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c290: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
c2a0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20  ( p->pOrderBy . 
c2b0: 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f         && matchO
c2c0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
c2d0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
c2e0: 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c  derBy, unionTab,
c2f0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
c300: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
c310: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c320: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c330: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
c340: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c350: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
c360: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  mp, unionTab, 0)
c370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
c380: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
c390: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 75           rc = mu
c3a0: 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d  ltiSelectOpenTem
c3b0: 70 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a  pAddr(p, addr);.
c3c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
c3d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
c3f0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
c430: 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54  eyAsData, unionT
c440: 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ab, 1);.        
c450: 7d 0a 09 61 73 73 65 72 74 28 20 6e 41 64 64 72  }..assert( nAddr
c460: 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73  <sizeof(aAddr)/s
c470: 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20  izeof(aAddr[0]) 
c480: 29 3b 0a 20 20 20 20 20 20 20 20 61 41 64 64 72  );.        aAddr
c490: 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69  [nAddr++] = sqli
c4a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c4b0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
c4c0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
c4d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c4e0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
c4f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c500: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
c510: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
c520: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
c530: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c540: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c550: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
c560: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
c570: 20 30 2c 20 61 66 66 2c 20 30 29 3b 0a 20 20 20   0, aff, 0);.   
c580: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c590: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c5a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c5b0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
c5c0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
c5d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
c5e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
c5f0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
c600: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
c610: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
c620: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
c630: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
c640: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
c650: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
c660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c670: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
c680: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
c690: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
c6a0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
c6b0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
c6c0: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
c6d0: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e  derBy;.      p->
c6e0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
c6f0: 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e      nLimit = p->
c700: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
c710: 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >nLimit = -1;.  
c720: 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d      nOffset = p-
c730: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >nOffset;.      
c740: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
c750: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c760: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c770: 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62   p, op, unionTab
c780: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20  , 0, 0, 0, aff, 
c790: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
c7a0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
c7b0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
c7c0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
c7d0: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
c7e0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
c7f0: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
c800: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
c810: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  t = -1;.      p-
c820: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
c830: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c840: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c850: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c860: 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a      }...      /*
c870: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
c880: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
c890: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
c8a0: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
c8b0: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
c8c0: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
c8d0: 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20  d..      */     
c8e0: 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73   .      if( eDes
c8f0: 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
c900: 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b  ionTab!=iParm ){
c910: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
c920: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
c930: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
c940: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
c950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65  .        if( eDe
c960: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
c970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
c980: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
c990: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
c9a0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
c9b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
c9c0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
c9d0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
c9e0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
c9f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ca00: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
ca10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ca20: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
ca30: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
ca40: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
ca50: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
ca60: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
ca70: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
ca80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ca90: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63  r(v);.        rc
caa0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
cab0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
cac0: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
cad0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
cae0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
cb10: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
cb20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
cb40: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
cb50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cb60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
cb70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
cb80: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cb90: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
cba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cbb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
cbc0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
cbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cbe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
cbf0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
cc00: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
cc10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cc20: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
cc30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cc40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
cc50: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
cc60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
cc70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
cc80: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
cc90: 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  SECT: {.      in
cca0: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
ccb0: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
ccc0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
ccd0: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c       int nLimit,
cce0: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   nOffset;.      
ccf0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
cd00: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
cd10: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
cd20: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
cd30: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
cd40: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
cd50: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
cd60: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
cd70: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
cd80: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
cd90: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
cda0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
cdb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
cdc0: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
cdd0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
cde0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
cdf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
ce00: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
ce10: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
ce20: 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64  pParse,p,p->pOrd
ce30: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
ce40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
ce50: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
ce60: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ce70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64       }..      ad
ce80: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ce90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
cea0: 54 65 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a  Temp, tab1, 0);.
ceb0: 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69        rc = multi
cec0: 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64  SelectOpenTempAd
ced0: 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20  dr(p, addr);.   
cee0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cef0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
cf00: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cf10: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
cf20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
cf40: 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b  sData, tab1, 1);
cf50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
cf60: 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64  Addr<sizeof(aAdd
cf70: 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b  r)/sizeof(aAddr[
cf80: 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 41 64  0]) );.      aAd
cf90: 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71  dr[nAddr++] = sq
cfa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cfb0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
cfc0: 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ns, tab1, 0);.  
cfd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
cfe0: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
cff0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
d000: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
d010: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d020: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
d030: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
d040: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d050: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53  Parse, pPrior, S
d060: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20  RT_Union, tab1, 
d070: 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29  0, 0, 0, aff, 0)
d080: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d090: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d0a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d0b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d0c0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
d0d0: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
d0e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d0f0: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
d100: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d120: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
d130: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b2, 0);.      rc
d140: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
d150: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
d160: 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
d170: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d180: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d190: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d1b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d1c0: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
d1d0: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  ab2, 1);.      a
d1e0: 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a  ssert( nAddr<siz
d1f0: 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f  eof(aAddr)/sizeo
d200: 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20  f(aAddr[0]) );. 
d210: 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72       aAddr[nAddr
d220: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
d230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
d240: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32  NumColumns, tab2
d250: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
d260: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d270: 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69   nLimit = p->nLi
d280: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  mit;.      p->nL
d290: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
d2a0: 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f   nOffset = p->nO
d2b0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d2c0: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
d2d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d2e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
d2f0: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
d300: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20  , 0, 0, 0, aff, 
d310: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
d320: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
d330: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
d340: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
d350: 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73  >nOffset = nOffs
d360: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
d370: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d380: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d390: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
d3a0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d3b0: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
d3c0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
d3d0: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
d3e0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
d3f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d400: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d410: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
d420: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
d430: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ack ){.        g
d440: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
d450: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d  es(pParse, 0, p-
d460: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
d470: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
d480: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d490: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d4a0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
d4b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
d4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d4d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
d4e0: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
d4f0: 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  ak);.      compu
d500: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
d510: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
d520: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
d530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d540: 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31  OP_FullKey, tab1
d550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d560: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d570: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
d580: 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
d590: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
d5a0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
d5b0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
d5c0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
d5d0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
d600: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
d610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
d630: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
d640: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d650: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
d660: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d670: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d690: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d6a0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
d6b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d6c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d6d0: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
d6e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d6f0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d700: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
d710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d720: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d730: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
d740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d750: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
d760: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
d770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d780: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
d790: 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
d7a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
d7b0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
d7c0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
d7d0: 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
d7e0: 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
d7f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d800: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
d810: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
d820: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
d830: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
d840: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
d850: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d860: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
d870: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
d880: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
d890: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
d8a0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
d8b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
d8c0: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
d8d0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
d8e0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
d8f0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d900: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
d910: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
d920: 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ns in temporary 
d930: 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43  tables.  */.  nC
d940: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
d950: 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  nExpr;.  while( 
d960: 6e 41 64 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e  nAddr>0 ){.    n
d970: 41 64 64 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69  Addr--;.    sqli
d980: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
d990: 76 2c 20 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c  v, aAddr[nAddr],
d9a0: 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f   nCol);.  }..  /
d9b0: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
d9c0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
d9d0: 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65  ed by either the
d9e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d9f0: 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20   or.  ** by any 
da00: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
da10: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
da20: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
da30: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
da40: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
da50: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
da60: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
da70: 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  les.  Invoke the
da80: 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70  .  ** ORDER BY p
da90: 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68 65  rocessing if the
daa0: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
dab0: 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  Y clause..  **. 
dac0: 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
dad0: 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
dae0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
daf0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
db00: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
db10: 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
db20: 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
db30: 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
db40: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
db50: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
db60: 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
db70: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
db80: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
db90: 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
dba0: 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
dbb0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
dbc0: 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70  ->pOrderBy || (p
dbd0: 4f 70 65 6e 54 65 6d 70 20 26 26 20 70 4f 70 65  OpenTemp && pOpe
dbe0: 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b  nTemp->nId>0) ){
dbf0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dc20: 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
dc30: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
dc40: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
dc50: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
dc60: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
dc70: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
dc80: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d   p->ppOpenTemp =
dc90: 3d 20 26 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a  = &pOpenTemp );.
dca0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
dcb0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
dcc0: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
dcd0: 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  ol*sizeof(CollSe
dce0: 71 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  q*));.    if( !p
dcf0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
dd00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
dd10: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
dd20: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
dd30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
dd40: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72  Info->enc = pPar
dd50: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
dd60: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
dd70: 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
dd80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
dd90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  i++){.      pKey
dda0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
ddb0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
ddc0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
ddd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4b  );.      if( !pK
dde0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
ddf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
de00: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
de10: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
de20: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
de30: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
de40: 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70 20 26 26  =0; pOpenTemp &&
de50: 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49   i<pOpenTemp->nI
de60: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  d; i++){.      i
de70: 6e 74 20 70 33 74 79 70 65 20 3d 20 28 69 3d 3d  nt p3type = (i==
de80: 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  0?P3_KEYINFO_HAN
de90: 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29  DOFF:P3_KEYINFO)
dea0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
deb0: 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b   = pOpenTemp->a[
dec0: 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 73 71  i].idx;.      sq
ded0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
dee0: 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
def0: 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74   *)pKeyInfo, p3t
df00: 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ype);.    }..   
df10: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
df20: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
df30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
df40: 70 4f 72 64 65 72 42 79 54 65 72 6d 20 3d 20 70  pOrderByTerm = p
df50: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
df60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
df70: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
df80: 70 72 3b 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42  pr; i++, pOrderB
df90: 79 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  yTerm++){.      
dfa0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
dfb0: 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e 70 45  pOrderByTerm->pE
dfc0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61  xpr;.        cha
dfd0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65  r *zName = pOrde
dfe0: 72 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a  rByTerm->zName;.
dff0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e000: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
e010: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
e020: 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20  Column<nCol );. 
e030: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
e040: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a  pExpr->pColl );.
e050: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
e060: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
e070: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
e080: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
e090: 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  eq(pParse, zName
e0a0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
e0b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e0c0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
e0d0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70  KeyInfo->aColl[p
e0e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
e0f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e100: 7d 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65  }.      generate
e110: 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
e120: 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74   p, v, p->pEList
e130: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
e140: 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  iParm);.    }.. 
e150: 20 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d     if( !pOpenTem
e160: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
e170: 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55  is happens for U
e180: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
e190: 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73  ER BY */.      s
e1a0: 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e  qliteFree(pKeyIn
e1b0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  fo);.    }.  }..
e1c0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e1d0: 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d  :.  if( pOpenTem
e1e0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
e1f0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70  IdListDelete(pOp
e200: 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70  enTemp);.  }.  p
e210: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30  ->ppOpenTemp = 0
e220: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e230: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e240: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
e250: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
e260: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e270: 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  IEW./*.** Scan t
e280: 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
e290: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
e2a0: 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
e2b0: 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
e2c0: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
e2d0: 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
e2e0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
e2f0: 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
e300: 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
e310: 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
e320: 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
e330: 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
e340: 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
e350: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
e360: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
e370: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
e380: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
e390: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
e3a0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
e3b0: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
e3c0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
e3d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e3e0: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
e3f0: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
e400: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
e410: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
e420: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
e430: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
e440: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
e450: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
e460: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
e470: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
e480: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
e490: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
e4a0: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
e4b0: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
e4c0: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
e4d0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
e4e0: 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
e4f0: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
e500: 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f  prList*);  /* Fo
e510: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
e520: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e530: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
e540: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
e550: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
e560: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
e570: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e580: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e590: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
e5a0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
e5b0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
e5c0: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
e5d0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
e5e0: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
e5f0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
e600: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
e610: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
e620: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
e630: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
e640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e650: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
e660: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
e670: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
e680: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
e690: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
e6a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
e6b0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
e6c0: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
e6d0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
e6e0: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
e6f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e700: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
e710: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
e720: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
e730: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
e740: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e750: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
e760: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
e770: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
e780: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
e790: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e7a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
e7b0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
e7c0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
e7d0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
e7e0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
e7f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
e800: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
e810: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
e820: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
e830: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
e840: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
e850: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
e860: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
e870: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
e880: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
e890: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
e8a0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
e8b0: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
e8c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
e8d0: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
e8e0: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
e8f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
e900: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
e910: 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
e920: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
e930: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
e940: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
e950: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
e960: 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45  tic void .substE
e970: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
e980: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
e990: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
e9a0: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  EList){.  int i;
e9b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
e9c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
e9d0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
e9e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
e9f0: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
ea00: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
ea10: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
ea20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
ea30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ea40: 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e  T_VIEW) */..#ifn
ea50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ea60: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  VIEW./*.** This 
ea70: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
ea80: 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
ea90: 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
eaa0: 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
eab0: 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
eac0: 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
ead0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
eae0: 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
eaf0: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
eb00: 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
eb10: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
eb20: 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
eb30: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
eb40: 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
eb50: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
eb60: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
eb70: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
eb80: 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
eb90: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
eba0: 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
ebb0: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
ebc0: 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
ebd0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
ebe0: 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
ebf0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
ec00: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
ec10: 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
ec20: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ec30: 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
ec40: 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
ec50: 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
ec60: 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
ec70: 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
ec80: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
ec90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
eca0: 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
ecb0: 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
ecc0: 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
ecd0: 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
ece0: 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
ecf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ed00: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
ed10: 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
ed20: 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
ed30: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
ed40: 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
ed50: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
ed60: 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
ed70: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
ed80: 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
ed90: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
eda0: 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
edb0: 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
edc0: 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
edd0: 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
ede0: 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
edf0: 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
ee00: 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
ee10: 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
ee20: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
ee30: 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
ee40: 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
ee50: 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
ee60: 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
ee70: 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
ee80: 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
ee90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
eea0: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
eeb0: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
eec0: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
eed0: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
eee0: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
eef0: 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
ef00: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
ef10: 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
ef20: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
ef30: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
ef40: 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
ef50: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
ef60: 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
ef70: 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
ef80: 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
ef90: 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
efa0: 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
efb0: 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
efc0: 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
efd0: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
efe0: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
eff0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
f000: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
f010: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
f020: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
f030: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
f040: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f050: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
f060: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
f070: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
f080: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
f090: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
f0a0: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
f0b0: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
f0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
f0d0: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
f0e0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
f0f0: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
f100: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
f110: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f120: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
f130: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f140: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
f150: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
f160: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
f170: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
f180: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f190: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
f1a0: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
f1b0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
f1c0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
f1d0: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
f1e0: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
f1f0: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
f200: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
f210: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
f220: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
f230: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
f240: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
f250: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
f260: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
f270: 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
f280: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
f290: 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
f2a0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
f2b0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
f2c0: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
f2d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
f2e0: 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
f2f0: 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  50).**.** In thi
f300: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
f310: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
f320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
f330: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
f340: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f350: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
f360: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
f370: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
f380: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
f390: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
f3a0: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
f3b0: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
f3c0: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
f3d0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
f3e0: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
f3f0: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
f400: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f410: 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
f420: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
f430: 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
f440: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f450: 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
f460: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f470: 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
f480: 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
f490: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
f4a0: 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
f4b0: 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
f4c0: 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
f4d0: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
f4e0: 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
f4f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f500: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
f510: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
f520: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
f530: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
f540: 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
f550: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
f560: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
f570: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
f580: 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
f590: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
f5a0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
f5b0: 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
f5c0: 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
f5d0: 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
f5e0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
f5f0: 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
f600: 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
f610: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
f620: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
f630: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
f640: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
f650: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
f660: 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
f670: 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
f680: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
f690: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
f6a0: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
f6b0: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
f6c0: 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
f6d0: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
f6e0: 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
f6f0: 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
f700: 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
f710: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
f720: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f730: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
f740: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
f750: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
f760: 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
f770: 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
f780: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
f790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
f7a0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
f7b0: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
f7e0: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
f7f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f800: 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
f810: 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20  e subquery */.. 
f820: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
f830: 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
f840: 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
f850: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
f860: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
f870: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
f880: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
f890: 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
f8a0: 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
f8b0: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
f8c0: 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
f8d0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70  c->a[iFrom];.  p
f8e0: 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
f8f0: 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
f900: 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
f910: 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
f920: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
f930: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62  urn 0;.  if( sub
f940: 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
f950: 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
f960: 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63  urn 0;.  pSubSrc
f970: 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
f980: 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
f990: 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72   );.  if( pSubSr
f9a0: 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
f9b0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53  urn 0;.  if( (pS
f9c0: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
f9d0: 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d  | pSub->nLimit>=
f9e0: 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53  0) &&  (pSrc->nS
f9f0: 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
fa00: 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
fa10: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69  .  }.  if( (p->i
fa20: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e  sDistinct || p->
fa30: 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75  nLimit>=0) && su
fa40: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
fa50: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
fa60: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
fa70: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
fa80: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65  turn 0;..  /* Re
fa90: 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
faa0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
fab0: 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
fac0: 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
fad0: 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
fae0: 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
faf0: 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
fb00: 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
fb10: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
fb20: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
fb30: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
fb40: 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
fb50: 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
fb60: 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
fb70: 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
fb80: 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
fb90: 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
fba0: 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
fbb0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
fbc0: 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
fbd0: 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
fbe0: 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
fbf0: 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
fc00: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
fc10: 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28   && iFrom>0 && (
fc20: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d  pSrc->a[iFrom-1]
fc30: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
fc40: 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
fc50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
fc60: 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
fc70: 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
fc80: 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
fc90: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
fca0: 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
fcb0: 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
fcc0: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
fcd0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
fce0: 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
fcf0: 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
fd00: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
fd10: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
fd20: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
fd30: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
fd40: 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
fd50: 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
fd60: 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
fd70: 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
fd80: 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
fd90: 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
fda0: 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
fdb0: 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
fdc0: 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
fdd0: 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
fde0: 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
fdf0: 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
fe00: 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
fe10: 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
fe20: 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
fe30: 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
fe40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f  .  */.  if( iFro
fe50: 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b  m>0 && (pSrc->a[
fe60: 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70  iFrom-1].jointyp
fe70: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
fe80: 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d   .      && pSub-
fe90: 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
fea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
feb0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
fec0: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
fed0: 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
fee0: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
fef0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
ff00: 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
ff10: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
ff20: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ff30: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
ff40: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
ff50: 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
ff60: 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
ff70: 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
ff80: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
ff90: 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
ffa0: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
ffb0: 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
ffc0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
ffd0: 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
ffe0: 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
fff0: 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
10000 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
10010 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
10020 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
10030 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
10040 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
10050 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
10060 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
10070 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
10080 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
10090 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
100a0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
100b0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
100c0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
100d0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
100e0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
100f0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
10100 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
10110 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  em->iCursor;.  {
10120 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
10130 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
10140 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
10150 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
10160 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 54 61 62  ointype;.    Tab
10170 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 75 62 69  le *pTab = pSubi
10180 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20  tem->pTab;..    
10190 69 66 28 20 70 54 61 62 20 26 26 20 70 54 61 62  if( pTab && pTab
101a0 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
101b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
101c0 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75  leteTable(0, pSu
101d0 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  bitem->pTab);.  
101e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
101f0 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  ee(pSubitem->zDa
10200 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
10210 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
10220 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
10230 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65  liteFree(pSubite
10240 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
10250 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
10260 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61  .      int extra
10270 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a   = nSubSrc - 1;.
10280 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
10290 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
102a0 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73          pSrc = s
102b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
102c0 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b  end(pSrc, 0, 0);
102d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
102e0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
102f0 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d       for(i=pSrc-
10300 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61  >nSrc-1; i-extra
10310 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20  >=iFrom; i--){. 
10320 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69         pSrc->a[i
10330 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78  ] = pSrc->a[i-ex
10340 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra];.      }.  
10350 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
10360 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
10370 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  {.      pSrc->a[
10380 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
10390 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
103a0 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
103b0 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
103c0 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
103d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
103e0 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72  ->a[iFrom+nSubSr
103f0 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  c-1].jointype = 
10400 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20  jointype;.  }.. 
10410 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
10420 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
10430 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
10440 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
10450 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
10460 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
10470 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
10480 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78  y..  ** .  ** Ex
10490 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
104a0 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
104b0 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
104c0 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
104d0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
104e0 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20  ERE a>b;.  **   
104f0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
10500 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
10510 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
10520 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
10530 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f     /.  **    \__
10540 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10550 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
10560 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10570 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10580 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f    **.  ** We loo
10590 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
105a0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
105b0 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
105c0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
105d0 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
105e0 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
105f0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
10600 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
10610 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
10620 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  */.  substExprLi
10630 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50  st(p->pEList, iP
10640 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
10650 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ist);.  pList = 
10660 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  p->pEList;.  for
10670 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
10680 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
10690 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
106a0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
106b0 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
106c0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
106d0 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
106e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  !=0 ){.      pLi
106f0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
10700 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
10710 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
10720 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
10730 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
10740 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74  Agg ){.    subst
10750 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
10760 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
10770 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
10780 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
10790 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
107a0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
107b0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
107c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
107d0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
107e0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  rBy==0 );.    p-
107f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
10800 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
10810 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
10820 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
10830 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
10840 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
10850 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  (p->pOrderBy, iP
10860 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
10870 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
10880 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
10890 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
108a0 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62  ite3ExprDup(pSub
108b0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c  ->pWhere);.  }el
108c0 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  se{.    pWhere =
108d0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75   0;.  }.  if( su
108e0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
108f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
10900 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
10910 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  p->pHaving = p->
10920 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70  pWhere;.    p->p
10930 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
10940 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
10950 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
10960 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10970 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
10980 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
10990 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71  d(p->pHaving, sq
109a0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
109b0 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
109c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
109d0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
109e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
109f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10a00 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29  (pSub->pGroupBy)
10a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
10a20 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
10a30 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
10a40 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
10a50 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
10a60 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57  te3ExprAnd(p->pW
10a70 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
10a80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
10a90 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
10aa0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
10ab0 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
10ac0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
10ad0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
10ae0 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
10af0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
10b00 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
10b10 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
10b20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
10b30 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  limit expression
10b40 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
10b50 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a  ry to the outer.
10b60 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f    ** query..  */
10b70 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69  .  if( pSub->nLi
10b80 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  mit>=0 ){.    if
10b90 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b  ( p->nLimit<0 ){
10ba0 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
10bb0 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b   = pSub->nLimit;
10bc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
10bd0 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66  ->nLimit+p->nOff
10be0 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d  set > pSub->nLim
10bf0 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  it+pSub->nOffset
10c00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
10c10 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
10c20 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73  it + pSub->nOffs
10c30 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et - p->nOffset;
10c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
10c50 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d  nOffset += pSub-
10c60 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20  >nOffset;..  /* 
10c70 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
10c80 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
10c90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
10ca0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
10cb0 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
10cc0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
10cd0 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
10ce0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
10cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10d00 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  W */../*.** Anal
10d10 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
10d20 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
10d30 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
10d40 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
10d50 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
10d60 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
10d70 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
10d80 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
10d90 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
10da0 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
10db0 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
10dc0 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
10dd0 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
10de0 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
10df0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
10e00 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
10e10 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
10e20 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
10e30 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
10e40 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
10e50 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
10e60 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
10e70 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
10e80 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
10e90 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
10ea0 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
10eb0 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
10ec0 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
10ed0 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
10ee0 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
10ef0 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
10f00 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
10f10 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
10f20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
10f30 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
10f40 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
10f50 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
10f60 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
10f70 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
10f80 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
10f90 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
10fa0 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
10fb0 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
10fc0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
10fd0 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
10fe0 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
10ff0 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
11000 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
11010 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a  qlite3Select()..
11020 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
11030 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
11040 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
11050 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
11060 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
11070 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
11080 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
11090 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
110a0 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
110b0 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
110c0 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
110d0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
110e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
110f0 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
11100 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
11110 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
11120 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
11130 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
11140 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
11150 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
11160 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
11170 2a 70 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65  *pSrc;..  /* Che
11180 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
11190 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
111a0 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
111b0 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
111c0 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
111d0 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
111e0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
111f0 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
11200 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
11210 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
11220 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
11230 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
11240 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c   return 0;.  pEL
11250 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
11260 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
11270 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
11280 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45   0;.  pExpr = pE
11290 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
112a0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
112b0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
112c0 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
112d0 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
112e0 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
112f0 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
11300 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
11310 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
11320 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
11330 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
11340 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
11350 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
11360 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
11370 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
11380 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
11390 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
113a0 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
113b0 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
113c0 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
113d0 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
113e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
113f0 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    pExpr = pList-
11400 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
11410 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
11420 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
11430 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
11440 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
11450 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
11460 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
11470 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
11480 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
11490 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
114a0 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
114b0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
114c0 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
114d0 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
114e0 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
114f0 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
11500 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
11510 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
11520 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
11530 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
11540 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
11550 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
11560 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
11570 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
11580 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
11590 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
115a0 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
115b0 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
115c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
115d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
115e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
115f0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
11600 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  r);.    for(pIdx
11610 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
11620 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
11630 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
11640 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
11650 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn>=1 );.      
11660 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
11670 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70  mn[0]==iCol && p
11680 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
11690 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62  ll[0]==pColl ) b
116a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
116b0 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
116c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
116d0 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
116e0 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
116f0 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20  ll be using the 
11700 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
11710 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
11720 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
11730 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
11740 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
11750 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68  ry cell..  ** Th
11760 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68  e column names h
11770 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11780 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
11790 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
117a0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  on..  */.  v = s
117b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
117c0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
117d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
117e0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
117f0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
11800 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
11810 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
11820 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
11830 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
11840 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
11850 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11860 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
11870 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
11880 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11890 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
118a0 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  s, iParm, 1);.  
118b0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
118c0 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
118d0 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
118e0 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
118f0 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
11900 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
11910 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
11920 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
11930 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
11940 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
11950 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
11960 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
11970 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
11980 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
11990 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
119a0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
119b0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
119c0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
119d0 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ma(pParse, pTab-
119e0 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20  >iDb);.  base = 
119f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
11a00 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  or;.  computeLim
11a10 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
11a20 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53  se, p);.  if( pS
11a30 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
11a40 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
11a50 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65  e3OpenTableForRe
11a60 61 64 69 6e 67 28 76 2c 20 62 61 73 65 2c 20 70  ading(v, base, p
11a70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74  Tab);.  }.  cont
11a80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11a90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
11aa0 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
11ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ac0 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
11ad0 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
11ae0 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75      /* Even thou
11af0 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  gh the cursor us
11b00 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69  ed to open the i
11b10 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f  ndex here is clo
11b20 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f  sed.    ** as so
11b30 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76  on as a single v
11b40 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72 65  alue has been re
11b50 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f  ad from it, allo
11b60 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75  cate it.    ** u
11b70 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54  sing (pParse->nT
11b80 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74  ab++) to prevent
11b90 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20 66   the cursor id f
11ba0 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a  rom being .    *
11bb0 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20 69  * reused. This i
11bc0 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  s important for 
11bd0 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68  statements of th
11be0 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22  e form .    ** "
11bf0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45  INSERT INTO x SE
11c00 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20  LECT max() FROM 
11c10 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  x"..    */.    i
11c20 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 69 49 64  nt iIdx;.    iId
11c30 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
11c40 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
11c50 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11c60 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44  nteger, pIdx->iD
11c70 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
11c80 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
11c90 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20  OpenRead, iIdx, 
11ca0 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20  pIdx->tnum,.    
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11cc0 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79  char*)&pIdx->key
11cd0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
11ce0 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f  );.    if( seekO
11cf0 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a  p==OP_Rewind ){.
11d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
11d20 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
11d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d40 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
11d50 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ord, 1, 0);.    
11d60 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f    seekOp = OP_Mo
11d70 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  veGt;.    }.    
11d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11d90 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78  (v, seekOp, iIdx
11da0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11db0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11dc0 5f 49 64 78 52 65 63 6e 6f 2c 20 69 49 64 78 2c  _IdxRecno, iIdx,
11dd0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11de0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11df0 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b  Close, iIdx, 0);
11e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11e10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
11e20 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Ge, base, 0);.  
11e30 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20  }.  eList.nExpr 
11e40 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  = 1;.  memset(&e
11e50 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a  ListItem, 0, siz
11e60 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b  eof(eListItem));
11e70 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c  .  eList.a = &eL
11e80 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74  istItem;.  eList
11e90 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  .a[0].pExpr = pE
11ea0 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  xpr;.  selectInn
11eb0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11ec0 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , &eList, 0, 0, 
11ed0 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
11ee0 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c  arm, cont, cont,
11ef0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
11f00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11f10 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
11f20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11f30 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30  P_Close, base, 0
11f40 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31  );.  .  return 1
11f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
11f60 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
11f70 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
11f80 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  se in a SELECT s
11f90 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
11fa0 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
11fb0 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
11fc0 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42  **.** An ORDER B
11fd0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73  Y or GROUP BY is
11fe0 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
11ff0 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20  ssions.  If any 
12000 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
12010 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
12020 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20  tant, then that 
12030 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
12040 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a  placed by the.**
12050 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65   corresponding e
12060 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73 75  ntry in the resu
12070 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
12080 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64  c int processOrd
12090 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72  erGroupBy(.  Par
120a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
120b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
120c0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
120d0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
120e0 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
120f0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
12100 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73  use to be proces
12110 73 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  sed */.  SrcList
12120 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
12130 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12140 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
12150 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20  *pEList,     /* 
12160 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  The result set *
12170 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
12180 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  *pNC,     /* Nam
12190 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 6e  e context for en
121a0 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f  closing query */
121b0 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
121c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
121d0 20 69 66 20 61 67 67 72 65 67 61 74 65 20 66 75   if aggregate fu
121e0 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f  nctions are invo
121f0 6c 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lved */.  const 
12200 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
12210 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52  /* Either "ORDER
12220 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73  " or "GROUP", as
12230 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
12240 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12250 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
12260 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
12270 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
12280 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12290 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
122a0 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
122b0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
122c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
122d0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
122e0 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c  , &iCol) && iCol
122f0 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69  >0 && iCol<=pELi
12300 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
12310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
12320 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
12330 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
12340 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
12350 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73  te3ExprDup(pELis
12360 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
12370 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
12380 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
12390 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73  solveNames(pPars
123a0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
123b0 69 73 74 2c 20 70 4e 43 2c 20 70 45 2c 20 69 73  ist, pNC, pE, is
123c0 41 67 67 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  Agg, 1) ){.     
123d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
123e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
123f0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
12400 45 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  E) ){.      if( 
12410 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
12420 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
12430 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
12440 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12450 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
12460 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d 75 73  "%s BY terms mus
12470 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74  t not be non-int
12480 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c  eger constants",
12490 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20   zType);.       
124a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
124b0 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c   }else if( iCol<
124c0 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
124d0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
124e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
124f0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
12500 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63          "%s BY c
12510 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
12520 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
12530 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
12540 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
12550 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c   and %d", zType,
12560 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
12570 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
12580 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
12590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
125a0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
125b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
125c0 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
125d0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
125e0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
125f0 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
12600 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
12610 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
12620 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65  .** value of eDe
12630 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a  st and iParm..**
12640 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61  .**     eDest Va
12650 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74  lue       Result
12660 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
12670 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
12680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126a0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43  ---.**     SRT_C
126b0 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b  allback    Invok
126c0 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
126d0 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
126e0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
126f0 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
12700 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74       Store first
12710 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72   result in memor
12720 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a  y cell iParm.**.
12730 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
12740 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
12750 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
12760 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
12770 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
12780 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
12790 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
127a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
127b0 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
127c0 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
127d0 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
127e0 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
127f0 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
12800 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
12810 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
12820 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
12830 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
12840 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  rm.**.** The tab
12850 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f  le above is inco
12860 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f  mplete.  Additio
12870 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20  nal eDist value 
12880 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a  have be added.**
12890 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d   since this comm
128a0 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e  ent was written.
128b0 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74    See the select
128c0 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63  InnerLoop() func
128d0 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f  tion for.** a co
128e0 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f  mplete listing o
128f0 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61  f the allowed va
12900 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e  lues of eDest an
12910 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73  d their meanings
12920 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12930 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
12940 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
12950 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
12960 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
12970 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
12980 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
12990 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
129a0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
129b0 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
129c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
129d0 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
129e0 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
129f0 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
12a00 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
12a10 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
12a20 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  t..**.** The pPa
12a30 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
12a40 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67   and *pParentAgg
12a50 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c   fields are fill
12a60 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ed in if this.**
12a70 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62   SELECT is a sub
12a80 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75  query.  This rou
12a90 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20  tine may try to 
12aa0 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c  combine this SEL
12ab0 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20  ECT.** with its 
12ac0 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61  parent to form a
12ad0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65   single flat que
12ae0 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ry.  In so doing
12af0 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68  , it might.** ch
12b00 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20  ange the parent 
12b10 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e  query from a non
12b20 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e  -aggregate to an
12b30 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
12b40 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65  ..** For that re
12b50 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e  ason, the pParen
12b60 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73  tAgg flag is pas
12b70 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
12b80 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62  , so it.** can b
12b90 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
12ba0 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68   Example 1:   Th
12bb0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
12bc0 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
12bd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  er..**.**    SEL
12be0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f  ECT * FROM t1 JO
12bf0 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f  IN (SELECT x, co
12c00 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20  unt(*) FROM t2) 
12c10 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c  JOIN t3;.**    \
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73        \_______ s
12c40 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f  ubquery _______/
12c50 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
12c60 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
12ca0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
12cb0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
12cc0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
12cd0 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54  _______/.**.** T
12ce0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12cf0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75  alled for the ou
12d00 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e  ter query first.
12d10 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c     For that call
12d20 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c  ,.** pParent wil
12d30 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69  l be NULL.  Duri
12d40 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ng the processin
12d50 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  g of the outer q
12d60 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72  uery, this .** r
12d70 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12d80 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
12d90 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75  handle the subqu
12da0 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65  ery.  For the re
12db0 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c  cursive.** call,
12dc0 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f   pParent will po
12dd0 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72  int to the outer
12de0 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65   query.  Because
12df0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
12e00 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
12e10 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65  lement in a thre
12e20 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20  e-way join, the 
12e30 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65  parentTab parame
12e40 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31  ter will.** be 1
12e50 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20   (the 2nd value 
12e60 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61  of a 0-indexed a
12e70 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  rray.).*/.int sq
12e80 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
12e90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12ea0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
12eb0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
12ec0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
12ee0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12ef0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
12f00 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
12f10 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
12f20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
12f30 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
12f40 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
12f50 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
12f60 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
12f70 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
12f80 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
12f90 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
12fa0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
12fb0 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
12fc0 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
12fd0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
12fe0 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
12ff0 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
13000 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
13010 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
13020 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20  *pParentAgg,    
13030 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
13040 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
13050 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
13060 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 2c 20 20  /.  char *aff,  
13070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
13080 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
13090 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
130a0 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 4e 61  y string */.  Na
130b0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 20  meContext *pNC  
130c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
130d0 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 75  e of the next ou
130e0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a  ter query */.){.
130f0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
13100 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
13110 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
13120 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  sAgg = 0;       
13130 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
13140 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
13150 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
13160 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
13170 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
13180 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
13190 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
131a0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
131b0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
131c0 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
131d0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
131e0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
131f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
13200 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
13210 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13220 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
13230 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
13240 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
13250 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
13260 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
13270 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
13280 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
13290 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
132a0 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
132b0 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
132c0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
132d0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
132e0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
132f0 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
13300 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
13310 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
13320 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
13330 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
13340 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
13350 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
13360 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
13370 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
13380 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
13390 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
133a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
133b0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
133c0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
133d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
133e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
133f0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13400 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
13410 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
13420 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1;..#ifndef SQLI
13430 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
13440 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
13450 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
13460 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
13470 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
13480 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
13490 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
134a0 69 6f 72 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ior ){.#ifndef S
134b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f  QLITE_OMIT_CURSO
134c0 52 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 46 65  R.    if( p->pFe
134d0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tch ){.      sql
134e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
134f0 72 73 65 2c 20 22 63 75 72 73 6f 72 73 20 63 61  rse, "cursors ca
13500 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20  nnot be used on 
13510 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
13520 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ");.      goto s
13530 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13540 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
13550 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
13560 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
13570 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20   iParm, aff);.  
13580 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
13590 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
135a0 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
135b0 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
135c0 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
135d0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
135e0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
135f0 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  re;.  pOrderBy =
13600 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
13610 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
13620 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
13630 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
13640 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
13650 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
13660 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
13670 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
13680 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
13690 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
136a0 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
136b0 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
136c0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
136d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
136e0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
136f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13700 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
13710 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29  tStmt(pParse, p)
13720 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
13730 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
13740 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
13750 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  e;.  pEList = p-
13760 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
13770 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
13780 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
13790 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
137a0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
137b0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
137c0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
137d0 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
137e0 75 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ut..  */.  asser
137f0 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  t( eDest!=SRT_Ex
13800 69 73 74 73 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  ists || pEList->
13810 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 69 66  nExpr==1 );.  if
13820 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  ( (eDest==SRT_Me
13830 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
13840 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e  Set) && pEList->
13850 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73  nExpr>1 ){.    s
13860 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13870 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
13880 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
13890 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
138a0 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
138b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
138c0 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
138d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
138e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45  ;.  }..  /* ORDE
138f0 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
13900 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61  for some destina
13910 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  tions..  */.  sw
13920 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
13930 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
13940 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  n:.    case SRT_
13950 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73 65  Except:.    case
13960 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20 20   SRT_Discard:.  
13970 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
13980 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13990 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
139a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
139b0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
139c0 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
139d0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74   allocated all t
139e0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
139f0 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  we.  ** need to 
13a00 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73  handle subquerys
13a10 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74   and temporary t
13a20 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20  ables.  .  **.  
13a30 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  ** Resolve the c
13a40 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
13a50 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63  do a semantics c
13a60 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20  heck on all the 
13a70 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
13a80 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
13a90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
13aa0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
13ab0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
13ac0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
13ad0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13ae0 65 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  eNames(pParse, p
13af0 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 4e 43 2c  TabList, 0, pNC,
13b00 20 70 58 2c 20 31 2c 20 31 29 20 29 7b 0a 20 20   pX, 1, 1) ){.  
13b10 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13b20 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
13b30 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
13b40 74 79 28 70 58 2c 20 45 50 5f 41 67 67 29 20 29  ty(pX, EP_Agg) )
13b50 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a   isAgg = 1;.  }.
13b60 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13b70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50  rResolveNames(pP
13b80 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
13b90 70 45 4c 69 73 74 2c 20 70 4e 43 2c 20 70 57 68  pEList, pNC, pWh
13ba0 65 72 65 2c 20 30 2c 20 31 29 20 29 7b 0a 20 20  ere, 0, 1) ){.  
13bb0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13bc0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61  d;.  }.  if( pHa
13bd0 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
13be0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
13bf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13c00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
13c10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
13c20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
13c30 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
13c40 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13c50 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
13c60 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
13c70 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65  olveNames(pParse
13c80 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
13c90 73 74 2c 20 70 4e 43 2c 20 70 48 61 76 69 6e 67  st, pNC, pHaving
13ca0 2c 20 31 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  , 1, 1) ){.     
13cb0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13cd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13ce0 70 48 61 76 69 6e 67 2c 20 45 50 5f 41 67 67 29  pHaving, EP_Agg)
13cf0 20 29 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20   ) isAgg = 1;.  
13d00 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  }.  if( pGroupBy
13d10 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20   && !isAgg ){.  
13d20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13d30 67 28 70 50 61 72 73 65 2c 20 22 47 52 4f 55 50  g(pParse, "GROUP
13d40 20 42 59 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20   BY may only be 
13d50 75 73 65 64 20 6f 6e 20 61 67 67 72 65 67 61 74  used on aggregat
13d60 65 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20  e queries");.   
13d70 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63  ;.  }.  if( proc
13d90 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
13da0 70 50 61 72 73 65 2c 70 4f 72 64 65 72 42 79 2c  pParse,pOrderBy,
13db0 70 54 61 62 4c 69 73 74 2c 70 45 4c 69 73 74 2c  pTabList,pEList,
13dc0 70 4e 43 2c 69 73 41 67 67 2c 22 4f 52 44 45 52  pNC,isAgg,"ORDER
13dd0 22 29 0a 20 20 20 7c 7c 20 70 72 6f 63 65 73 73  ").   || process
13de0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
13df0 72 73 65 2c 70 47 72 6f 75 70 42 79 2c 70 54 61  rse,pGroupBy,pTa
13e00 62 4c 69 73 74 2c 70 45 4c 69 73 74 2c 70 4e 43  bList,pEList,pNC
13e10 2c 69 73 41 67 67 2c 22 47 52 4f 55 50 22 29 0a  ,isAgg,"GROUP").
13e20 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65    ){.    goto se
13e30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
13e40 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 75 73   /* We cannot us
13e50 65 20 61 20 53 51 4c 20 63 75 72 73 6f 72 20 6f  e a SQL cursor o
13e60 6e 20 61 20 6a 6f 69 6e 20 6f 72 20 6f 6e 20 61  n a join or on a
13e70 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 0a   DISTINCT query.
13e80 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
13e90 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52 0a  ITE_OMIT_CURSOR.
13ea0 20 20 69 66 28 20 70 2d 3e 70 46 65 74 63 68 20    if( p->pFetch 
13eb0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  ){.    if( p->is
13ec0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
13ed0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13ee0 67 28 70 50 61 72 73 65 2c 20 22 63 75 72 73 6f  g(pParse, "curso
13ef0 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  rs cannot be use
13f00 64 20 6f 6e 20 44 49 53 54 49 4e 43 54 20 71 75  d on DISTINCT qu
13f10 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20 67  eries");.      g
13f20 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13f30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
13f40 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29  abList->nSrc>0 )
13f50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13f60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13f70 22 63 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20  "cursors cannot 
13f80 62 65 20 75 73 65 64 20 6f 6e 20 6a 6f 69 6e 73  be used on joins
13f90 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ");.      goto s
13fa0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13fb0 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
13fc0 74 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  t->a[0].pSelect 
13fd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13fe0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13ff0 20 22 63 75 72 73 6f 72 20 63 61 6e 6e 6f 74 20   "cursor cannot 
14000 62 65 20 75 73 65 64 20 77 69 74 68 20 6e 65 73  be used with nes
14010 74 65 64 20 71 75 65 72 69 65 73 20 22 0a 20 20  ted queries ".  
14020 20 20 20 20 20 20 20 20 22 6f 72 20 76 69 65 77          "or view
14030 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  s");.      goto 
14040 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
14050 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
14060 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
14070 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
14080 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14090 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
140a0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
140b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
140c0 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
140d0 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
140e0 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20  l be using them 
140f0 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  in a callback.  
14100 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
14110 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
14120 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
14130 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   to some other d
14140 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f  estination..  */
14150 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
14160 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
14170 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
14180 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
14190 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
141a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
141b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
141c0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
141d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
141e0 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
141f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
14200 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
14210 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14220 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
14230 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
14240 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
14250 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
14260 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  uthContext = 0;.
14270 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74      int needRest
14280 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20  oreContext;..   
14290 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
142a0 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
142b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
142c0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
142d0 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  ].zName!=0 ){.  
142e0 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f      zSavedAuthCo
142f0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
14300 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
14310 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
14320 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c  hContext = pTabL
14330 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
14340 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
14350 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
14360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14370 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
14380 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
14390 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
143a0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
143b0 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
143c0 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a  SRT_TempTable, .
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
143f0 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
14400 69 73 41 67 67 2c 20 30 2c 20 30 29 3b 0a 20 20  isAgg, 0, 0);.  
14410 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
14420 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
14430 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
14440 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
14450 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
14460 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
14470 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
14480 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
14490 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
144a0 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
144b0 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
144c0 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
144d0 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
144e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
144f0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
14500 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
14510 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
14520 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
14530 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
14540 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
14550 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
14560 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
14570 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
14580 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
14590 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
145a0 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
145b0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
145c0 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
145d0 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
145e0 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
145f0 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
14600 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
14610 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
14620 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
14630 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
14640 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
14650 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
14660 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
14670 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
14680 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
14690 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
146a0 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
146b0 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53   .  */.#ifndef S
146c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
146d0 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
146e0 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
146f0 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
14700 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
14710 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
14720 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
14730 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
14740 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
14750 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
14760 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
14770 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
14780 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
14790 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
147a0 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
147b0 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
147c0 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
147d0 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
147e0 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
147f0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
14800 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14810 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
14820 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14830 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a  pOrderBy->a[i].z
14840 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
14850 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
14860 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20  Expr->pColl = . 
14870 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14880 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
14890 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
148a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31  ->a[i].zName, -1
148b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
148c0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
148d0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
148e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
148f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14900 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
14910 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
14920 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
14930 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
14940 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
14950 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
14960 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
14970 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
14980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
14990 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
149a0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
149b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
149c0 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
149d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
149e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
149f0 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
14a00 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
14a10 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
14a20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
14a30 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  f aggregate expr
14a40 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
14a50 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
14a60 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
14a70 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c  ;.  if( isAgg ||
14a80 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
14a90 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
14aa0 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20  >nAgg==0 );.    
14ab0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66  isAgg = 1;.    f
14ac0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
14ad0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
14ae0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14af0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14b00 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
14b10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
14b30 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
14b40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14b50 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
14b60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
14b70 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
14b80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14b90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
14ba0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
14bb0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
14bc0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
14bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
14be0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
14bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
14c10 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
14c20 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
14c30 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
14c40 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
14c50 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
14c70 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
14c80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
14c90 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
14ca0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
14cb0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
14cc0 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
14cd0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
14ce0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
14cf0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
14d00 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
14d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14d20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74   }..  /* Reset t
14d30 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20  he aggregator.  
14d40 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
14d50 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d  {.    int addr =
14d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d70 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74  p(v, OP_AggReset
14d80 2c 20 28 70 47 72 6f 75 70 42 79 3f 30 3a 31 29  , (pGroupBy?0:1)
14d90 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b  , pParse->nAgg);
14da0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14db0 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
14dc0 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  +){.      FuncDe
14dd0 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  f *pFunc;.      
14de0 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61  if( (pFunc = pPa
14df0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
14e00 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d  nc)!=0 && pFunc-
14e10 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
14e20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14e30 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
14e40 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68  gInit, 0, i, (ch
14e50 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55  ar*)pFunc, P3_FU
14e60 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NCDEF);.      }.
14e70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
14e80 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
14e90 69 6e 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28  int sz = sizeof(
14ea0 4b 65 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f 75  KeyInfo) + pGrou
14eb0 70 42 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f  pBy->nExpr*sizeo
14ec0 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 20  f(CollSeq*);.   
14ed0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
14ee0 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71   = (KeyInfo *)sq
14ef0 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  liteMalloc(sz);.
14f00 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65        if( 0==pKe
14f10 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  y ){.        got
14f20 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
14f30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4b 65 79      }.      pKey
14f40 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  ->enc = pParse->
14f50 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 70  db->enc;.      p
14f60 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 47  Key->nField = pG
14f70 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
14f80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14f90 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
14fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
14fb0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
14fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
14fd0 65 71 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  eq(pParse, pGrou
14fe0 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
14ff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
15000 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  Key->aColl[i] ){
15010 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d  .          pKey-
15020 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72  >aColl[i] = pPar
15030 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
15040 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
15050 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15060 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
15070 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
15080 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
15090 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d  _HANDOFF);.    }
150a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
150b0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
150c0 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66 6f   cell to NULL fo
150d0 72 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20 66  r SRT_Mem or 0 f
150e0 6f 72 20 53 52 54 5f 45 78 69 73 74 73 0a 20 20  or SRT_Exists.  
150f0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
15100 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
15110 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  ==SRT_Exists ){.
15120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15130 64 64 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d 53  ddOp(v, eDest==S
15140 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f 53 74 72 69  RT_Mem ? OP_Stri
15150 6e 67 38 20 3a 20 4f 50 5f 49 6e 74 65 67 65 72  ng8 : OP_Integer
15160 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
15170 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15180 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
15190 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
151a0 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  /* Open a tempor
151b0 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65  ary table to use
151c0 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
151d0 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
151e0 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
151f0 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
15200 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
15210 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78     openTempIndex
15220 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73 74  (pParse, p, dist
15230 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  inct, 0);.  }els
15240 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
15250 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
15260 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
15270 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
15280 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
15290 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
152a0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
152b0 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  re,.            
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
152e0 26 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 46  &pOrderBy, p->pF
152f0 65 74 63 68 29 3b 0a 20 20 69 66 28 20 70 57 49  etch);.  if( pWI
15300 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
15310 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
15320 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
15330 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77   inner loop if w
15340 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e  e are not dealin
15350 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72  g with.  ** aggr
15360 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66  egates.  */.  if
15370 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  ( !isAgg ){.    
15380 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
15390 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
153a0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
153b0 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
153c0 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
153d0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
153e0 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  m, pWInfo->iCont
153f0 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
15400 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20  reak, aff) ){.  
15410 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
15420 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
15430 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
15440 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
15450 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
15460 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
15470 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
15480 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
15490 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78   else{.    AggEx
154a0 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66  pr *pAgg;.    if
154b0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
154c0 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
154d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
154e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
154f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
15500 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15510 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
15520 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
15530 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f     }.      /* No
15540 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15550 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
15560 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50  the following OP
15570 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20  _MakeRecord .   
15580 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65     ** because we
15590 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
155a0 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20  do any coercion 
155b0 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f  of datatypes. */
155c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
155d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
155e0 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70  keRecord, pGroup
155f0 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  By->nExpr, 0);. 
15600 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
15610 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15620 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15630 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15640 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
15650 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
15660 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
15670 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
15680 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
15690 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g++){.        if
156a0 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20  ( pAgg->isAgg ) 
156b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
156c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
156d0 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e  e(pParse, pAgg->
156e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
156f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15700 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
15710 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
15720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15730 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
15740 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bl1);.    }.    
15750 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
15760 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
15770 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
15780 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
15790 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
157a0 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
157b0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
157c0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 2d        if( !pAgg-
157d0 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  >isAgg ) continu
157e0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
157f0 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20   pAgg->pFunc!=0 
15800 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15810 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53   pAgg->pFunc->xS
15820 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tep!=0 );.      
15830 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75  pDef = pAgg->pFu
15840 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  nc;.      pE = p
15850 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Agg->pExpr;.    
15860 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
15870 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15880 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
15890 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
158a0 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
158b0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
158c0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
158d0 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ist);.      sqli
158e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
158f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
15900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
15910 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
15920 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
15930 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
15940 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
15950 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70       for(j=0; !p
15960 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b  Coll && j<nExpr;
15970 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
15980 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
15990 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
159a0 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61  se, pE->pList->a
159b0 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
159c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
159d0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
159e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
159f0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
15a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
15a10 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
15a20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
15a30 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
15a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a50 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
15a60 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
15a70 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
15a80 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  Def, P3_POINTER)
15a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15aa0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
15ab0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
15ac0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
15ad0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
15ae0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72   /* If we are pr
15af0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
15b00 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  tes, we need to 
15b10 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20  set up a second 
15b20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61  loop.  ** over a
15b30 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  ll of the aggreg
15b40 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70  ate values and p
15b50 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a  rocess them..  *
15b60 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
15b70 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20  .    int endagg 
15b80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15b90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
15ba0 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
15bb0 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
15bc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15bd0 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65  OP_AggNext, 0, e
15be0 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72  ndagg);.    pPar
15bf0 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a  se->useAgg = 1;.
15c00 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
15c10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15c20 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
15c30 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
15c40 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
15c50 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
15c60 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15c70 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
15c80 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
15c90 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
15cc0 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29  , endagg, aff) )
15cd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
15ce0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
15cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d00 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
15d10 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20  0, startagg);.  
15d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15d30 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
15d40 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
15d50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15d60 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
15d70 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
15d80 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15d90 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
15da0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
15db0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
15dc0 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
15dd0 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
15de0 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
15df0 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
15e00 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
15e10 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
15e20 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
15e30 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
15e40 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
15e50 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
15e60 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
15e70 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76  subquery, we hav
15e80 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20  e now converted 
15e90 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
15ea0 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  o a.  ** tempora
15eb0 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65  ry table.  So de
15ec0 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72  lete the subquer
15ed0 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  y structure from
15ee0 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
15ef0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   to prevent this
15f00 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
15f10 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
15f20 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
15f30 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75  e the.  ** the u
15f40 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  se of the tempor
15f50 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
15f60 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
15f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15f80 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
15f90 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
15fa0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
15fb0 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
15fc0 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
15fd0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
15fe0 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a  electDelete(p);.
15ff0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
16000 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
16010 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d  pSelect = 0;.  }
16020 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
16030 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
16040 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
16050 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
16060 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
16070 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
16080 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
16090 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
160a0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
160b0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
160c0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
160d0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
160e0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
160f0 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
16100 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73  .select_end:.  s
16110 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
16120 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
16130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.