/ Hex Artifact Content
Login

Artifact e90e2a147273cdcdb1ee9e14574ab28f04382e63:


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 31 37 38  select.c,v 1.178
0200: 20 32 30 30 34 2f 30 35 2f 32 36 20 31 36 3a 35   2004/05/26 16:5
0210: 34 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a  4:44 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 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0a00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0a10: 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20 69 6e 74  Keyword;.    int
0a20: 20 6e 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20   nChar;.    int 
0a30: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0a40: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0a50: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0a60: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0a70: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0a80: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0a90: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0aa0: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0ab0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ac0: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0ad0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0ae0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0af0: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0b00: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0b10: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0b20: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0b30: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0b40: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d   JT_INNER },.  }
0b50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
0b60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
0b70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
0b80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
0b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
0ba0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
0bb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
0bc0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
0bd0: 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ; j<sizeof(keywo
0be0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0bf0: 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a  ords[0]); j++){.
0c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
0c10: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
0c20: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
0c30: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
0c40: 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a  p->z, keywords[j
0c50: 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e  ].zKeyword, p->n
0c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
0c70: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77  jointype |= keyw
0c80: 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  ords[j].code;.  
0c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0ca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0cb0: 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79  f( j>=sizeof(key
0cc0: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
0cd0: 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20  ywords[0]) ){.  
0ce0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0cf0: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
0d00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0d10: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
0d20: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
0d30: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
0d40: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0d50: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
0d60: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
0d70: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 73 74 61 74  =0.  ){.    stat
0d80: 69 63 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 20 3d  ic Token dummy =
0d90: 20 7b 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 63   { 0, 0 };.    c
0da0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 2c  har *zSp1 = " ",
0db0: 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20   *zSp2 = " ";.  
0dc0: 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 70    if( pB==0 ){ p
0dd0: 42 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 31  B = &dummy; zSp1
0de0: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 69 66 28 20   = 0; }.    if( 
0df0: 70 43 3d 3d 30 20 29 7b 20 70 43 20 3d 20 26 64  pC==0 ){ pC = &d
0e00: 75 6d 6d 79 3b 20 7a 53 70 32 20 3d 20 30 3b 20  ummy; zSp2 = 0; 
0e10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  }.    sqlite3Set
0e20: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
0e30: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
0e40: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
0e50: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 2c 20  d join type: ", 
0e60: 30 2c 0a 20 20 20 20 20 20 20 70 41 2d 3e 7a 2c  0,.       pA->z,
0e70: 20 70 41 2d 3e 6e 2c 20 7a 53 70 31 2c 20 31 2c   pA->n, zSp1, 1,
0e80: 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e 6e 2c 20 7a   pB->z, pB->n, z
0e90: 53 70 32 2c 20 31 2c 20 70 43 2d 3e 7a 2c 20 70  Sp2, 1, pC->z, p
0ea0: 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  C->n, 0);.    pP
0eb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0ec0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0ed0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
0ee0: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
0ef0: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
0f00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0f10: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
0f20: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
0f30: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
0f40: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
0f50: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
0f60: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
0f80: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
0f90: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
0fa0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
0fb0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
0fc0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
0fd0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
0fe0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
0ff0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1000: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1010: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1020: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1050: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1060: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1070: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1080: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1090: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
10a0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
10b0: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
10c0: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
10d0: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
10e0: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
10f0: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
1100: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
1110: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
1120: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
1130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1140: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63  ddWhereTerm(.  c
1150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1180: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1190: 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46  pTab1,      /* F
11a0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
11b0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11c0: 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  b2,      /* Seco
11d0: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  nd table */.  Ex
11e0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
11f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1200: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1210: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1220: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  on */.){.  Token
1230: 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a   dummy;.  Expr *
1240: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1250: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1260: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1270: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 64    Expr *pE;..  d
1280: 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b 0a 20  ummy.z = zCol;. 
1290: 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65   dummy.n = strle
12a0: 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d 6d 79  n(zCol);.  dummy
12b0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45 31 61  .dyn = 0;.  pE1a
12c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
12d0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
12e0: 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71  my);.  pE2a = sq
12f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1300: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1310: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1320: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1330: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1340: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1350: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1360: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1370: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
1380: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
1390: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
13a0: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
13b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13c0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13d0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13f0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1400: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1410: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1420: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1430: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1440: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1450: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1460: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1470: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66  _FromJoin);.  if
1480: 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20  ( *ppExpr ){.   
1490: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
14a0: 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a  e3Expr(TK_AND, *
14b0: 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a  ppExpr, pE, 0);.
14c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
14d0: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d  Expr = pE;.  }.}
14e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1500: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
1510: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
1520: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1530: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1540: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1550: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1560: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1570: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1580: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1590: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
15a0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
15b0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
15c0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
15d0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
15e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
15f0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1600: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1610: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
1620: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
1630: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
1640: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
1650: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
1660: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
1670: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1680: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1690: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
16a0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
16b0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  NG clause..*/.st
16c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
16d0: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  nExpr(Expr *p){.
16e0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
16f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1700: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
1710: 29 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  );.    setJoinEx
1720: 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
1730: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
1740: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
1750: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
1760: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
1770: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
1780: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1790: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
17a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
17b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
17c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
17d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
17e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
17f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
1800: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
1810: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  erms..**.** This
1820: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1830: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1840: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
1850: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1860: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1870: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
1880: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1890: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
18a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72   int i, j;.  pSr
18b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  c = p->pSrc;.  f
18c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
18d0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  nSrc-1; i++){.  
18e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18f0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26  _item *pTerm = &
1900: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
1910: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1920: 74 65 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  tem *pOther = &p
1930: 53 72 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20  Src->a[i+1];..  
1940: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61    if( pTerm->pTa
1950: 62 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  b==0 || pOther->
1960: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
1970: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
1980: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
1990: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
19a0: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
19b0: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
19c0: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
19d0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
19e0: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
19f0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1a00: 66 28 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79  f( pTerm->jointy
1a10: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
1a20: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1a30: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1a40: 70 54 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54  pTerm->pOn || pT
1a50: 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  erm->pUsing ){. 
1a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a80: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
1a90: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
1aa0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
1ab0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
1ac0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
1ad0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1ae0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 65        pTab = pTe
1af0: 72 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  rm->pTab;.      
1b00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1b10: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1b20: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
1b30: 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61  ndex(pOther->pTa
1b40: 62 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  b, pTab->aCol[j]
1b50: 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20  .zName)>=0 ){.  
1b60: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
1b70: 54 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  Term(pTab->aCol[
1b80: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20  j].zName, pTab, 
1b90: 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70  pOther->pTab, &p
1ba0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
1bb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
1bd0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
1be0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
1bf0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
1c00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1c10: 65 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72  erm->pOn && pTer
1c20: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1c30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c40: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1c50: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
1c60: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
1c70: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
1c80: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
1c90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1cb0: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
1cc0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1cd0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
1ce0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
1cf0: 20 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65    ** and AND ope
1d00: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
1d10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1d20: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
1d30: 6e 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e  nExpr(pTerm->pOn
1d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1d50: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
1d60: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
1d70: 20 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20   pTerm->pOn;.   
1d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d90: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
1da0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1db0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65  , p->pWhere, pTe
1dc0: 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20  rm->pOn, 0);.   
1dd0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
1de0: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
1df0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1e00: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
1e10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
1e30: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
1e40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
1e50: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
1e60: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
1e70: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
1e80: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
1e90: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
1ea0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
1eb0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
1ec0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
1ee0: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
1ef0: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
1f00: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
1f10: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
1f20: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
1f30: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
1f40: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
1f50: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1f60: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
1f70: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
1f80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1f90: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
1fa0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b    IdList *pList;
1fb0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1fc0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 53      assert( i<pS
1fd0: 72 63 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20  rc->nSrc-1 );.  
1fe0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72      pList = pTer
1ff0: 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  m->pUsing;.     
2000: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
2010: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
2020: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
2030: 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61  Index(pTerm->pTa
2040: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  b, pList->a[j].z
2050: 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20  Name)<0 ||.     
2060: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
2070: 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c  ex(pOther->pTab,
2080: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
2090: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
20a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20b0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
20c0: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
20d0: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
20e0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
20f0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2100: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 70 4c 69  oth tables", pLi
2110: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  st->a[j].zName);
2120: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2130: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2140: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2150: 65 72 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  erm(pList->a[j].
2160: 7a 4e 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54  zName, pTerm->pT
2170: 61 62 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62  ab, pOther->pTab
2180: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21b0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
21c0: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
21d0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
21e0: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
21f0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2200: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2210: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
2220: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2230: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  n;.  sqlite3Expr
2240: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2250: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2260: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2270: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
2280: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2290: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
22a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
22b0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
22c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
22d0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22f0: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
2300: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
2310: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
2320: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  rior);.  sqliteF
2330: 72 65 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b  ree(p->zSelect);
2340: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
2350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2360: 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2370: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2380: 20 74 68 65 20 70 61 72 73 65 20 73 74 72 75 63   the parse struc
2390: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
23a0: 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72 65  void sqliteAggre
23b0: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61  gateInfoReset(Pa
23c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23d0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73  sqliteFree(pPars
23e0: 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72  e->aAgg);.  pPar
23f0: 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20  se->aAgg = 0;.  
2400: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
2410: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41  ;.  pParse->useA
2420: 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
2430: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2440: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2450: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2460: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2470: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2480: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a  the sorter..**.*
2490: 2a 20 46 49 58 20 4d 45 3a 20 20 43 68 61 6e 67  * FIX ME:  Chang
24a0: 65 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 69  e this so that i
24b0: 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f 4d 61  t uses the OP_Ma
24c0: 6b 65 4b 65 79 20 6f 70 63 6f 64 65 0a 2a 2a 20  keKey opcode.** 
24d0: 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 53 6f  instead of OP_So
24e0: 72 74 4d 61 6b 65 4b 65 79 2e 20 20 44 65 6c 65  rtMakeKey.  Dele
24f0: 74 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 4d 61  te the OP_SortMa
2500: 6b 65 4b 65 79 20 6f 70 63 6f 64 65 2e 0a 2a 2a  keKey opcode..**
2510: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 73 20 73 68 6f   All columns sho
2520: 75 6c 64 20 68 61 76 65 20 61 66 66 69 6e 69 74  uld have affinit
2530: 79 20 4e 4f 4e 45 2e 20 20 48 61 6e 64 6c 65 20  y NONE.  Handle 
2540: 41 53 43 20 76 65 72 73 75 73 0a 2a 2a 20 44 45  ASC versus.** DE
2550: 53 43 20 73 6f 72 74 20 6f 72 64 65 72 20 62 79  SC sort order by
2560: 20 64 65 66 69 6e 69 6e 67 20 61 20 6c 69 73 74   defining a list
2570: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   of comparison f
2580: 75 6e 63 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 62  unctions to.** b
2590: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  e used by the OP
25a0: 5f 53 6f 72 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f  _Sort opcode..*/
25b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
25c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73  hOntoSorter(Pars
25d0: 65 20 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20  e *pParse, Vdbe 
25e0: 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *v, ExprList *pO
25f0: 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69  rderBy){.  int i
2600: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2610: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
2620: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
2630: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2640: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2650: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73  .pExpr);.  }.  s
2660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2670: 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
2680: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2690: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
26a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
26b0: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
26c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
26d0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
26e0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
26f0: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
2700: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
2710: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
2720: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
2730: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
2740: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
2750: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
2760: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
2770: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2780: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
2790: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
27a0: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
27b0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
27c0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
27d0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
27e0: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
27f0: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
2800: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
2810: 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65  c int selectInne
2820: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
2830: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2840: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2850: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2860: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2870: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
2880: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
2890: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
28a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
28b0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
28c0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
28d0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
28e0: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2900: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
2910: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2920: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
2930: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2940: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2950: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
2960: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2970: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
2980: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
2990: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
29a0: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
29b0: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
29c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
29d0: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
29e0: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
29f0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
2a20: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
2a30: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
2a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2a50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2a60: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
2a70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
2a80: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
2a90: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
2aa0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
2ab0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
2ac0: 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20  reak,           
2ad0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2ae0: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
2af0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
2b00: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
2b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66             /* af
2b20: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66  finity string if
2b30: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
2b40: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ion */.){.  Vdbe
2b50: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2b60: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  dbe;.  int i;.. 
2b70: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2b80: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2b90: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2ba0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2bb0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2bc0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2bd0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2be0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2bf0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2c00: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2c10: 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
2c20: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2c30: 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
2c40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
2c50: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2c60: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2c70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2c90: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66  MemIncr, p->iOff
2ca0: 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  set, addr+2);.  
2cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
2cd0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
2ce0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2cf0: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
2d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
2d20: 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  cr, p->iLimit, i
2d30: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
2d40: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
2d50: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
2d60: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ns..  */.  if( n
2d70: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
2d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
2d90: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2db0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2dc0: 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d  rcTab, i);.    }
2dd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
2de0: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
2df0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
2e00: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
2e10: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2e20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2e30: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
2e40: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2e50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2e60: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
2e70: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
2e80: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
2e90: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
2ea0: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
2eb0: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
2ec0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
2ed0: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
2ee0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
2ef0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
2f00: 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70  distinct>=0 && p
2f10: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
2f20: 3e 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66 20  >nExpr>0 ){.#if 
2f30: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
2f40: 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 33  INCT.    sqlite3
2f50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f60: 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d  IsNull, -pEList-
2f70: 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65 33 56  >nExpr, sqlite3V
2f80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f90: 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  )+7);.#endif.   
2fa0: 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65 6c 79   /* Deliberately
2fb0: 20 6c 65 61 76 65 20 74 68 65 20 61 66 66 69 6e   leave the affin
2fc0: 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66 20 6f  ity string off o
2fd0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2fe0: 4f 50 5f 4d 61 6b 65 4b 65 79 20 2a 2f 0a 20 20  OP_MakeKey */.  
2ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3000: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
3010: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
3020: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3040: 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e  Distinct, distin
3050: 63 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ct, sqlite3VdbeC
3060: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
3070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
3090: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  , pEList->nExpr+
30a0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
30b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
30c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
30d0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
30e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
30f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3120: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3130: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74   0);.  }..  swit
3140: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
3150: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
3160: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
3170: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
3180: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
3190: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
31a0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
31b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
31c0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ion: {.      sql
31d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
31e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
31f0: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3200: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
3210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3220: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
3230: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
3240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3260: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3280: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3290: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
32c0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
32d0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
32e0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
32f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
3300: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
3310: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
3320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3330: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3340: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3350: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3360: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3370: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3380: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3390: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
33a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
33b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
33c0: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
33d0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
33e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33f0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
3400: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3410: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3420: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50  OP_PutIntKey, iP
3430: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
3440: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3450: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
3460: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
3470: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
3480: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
3490: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
34a0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
34b0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
34c0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
34d0: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
34e0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
34f0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
3500: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
3510: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
3520: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
3530: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3550: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3560: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3570: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71  TINCT);.      sq
3580: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3590: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
35a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
35b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35c0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
35d0: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
35e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
3600: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b  lete, iParm, 0);
3610: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3620: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77    }..    /* If w
3630: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
3640: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
3650: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
3660: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
3670: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
3680: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
3690: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
36a0: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
36b0: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
36c0: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
36d0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
36e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
36f0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
3700: 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
3710: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
3720: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
3730: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
3740: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
3750: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
3760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3770: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
3780: 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20  , addr1+3);.    
3790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37a0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
37b0: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32   0);.      addr2
37c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
37d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
37e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
37f0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3800: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
3810: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
3820: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
3830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
3840: 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66 53 74  har const *affSt
3850: 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  r;.        char 
3860: 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36  aff = (iParm>>16
3870: 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  )&0xFF;.        
3880: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
3890: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
38a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
38b0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 61   aff);.        a
38c0: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
38d0: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66  ffinityString(af
38e0: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
38f0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
3900: 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 2c 20  _MakeKey, 1, 0, 
3910: 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54 49  affStr, P3_STATI
3920: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
3930: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3940: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
3950: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3960: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3970: 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50 61  _PutStrKey, (iPa
3980: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
3990: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
39a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
39b0: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c 20  ngeP2(v, addr2, 
39c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
39d0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
39e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
39f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
3a00: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
3a10: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
3a20: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
3a30: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
3a40: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
3a50: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
3a60: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
3a70: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
3a80: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
3a90: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
3aa0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
3ab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
3ac0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
3ad0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
3ae0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
3af0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
3b00: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
3b10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3b30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
3b40: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
3b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3b60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
3b70: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
3b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3b90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3ba0: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
3bb0: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
3bc0: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  k function..    
3bd0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3be0: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
3bf0: 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20 7b  se SRT_Sorter: {
3c00: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3c10: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
3c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3c30: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3c40: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3c50: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
3c60: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
3c70: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
3c80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3c90: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
3ca0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b 0a  SRT_Callback );.
3cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3cd0: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
3ce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3d00: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
3d10: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
3d20: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
3d30: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
3d40: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
3d50: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
3d60: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
3d70: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
3d80: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
3d90: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3da0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
3db0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3dc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3dd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3de0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3df0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3e00: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3e10: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3e20: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3e30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3e50: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
3e60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
3e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3e80: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ..    /* Discard
3e90: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
3ea0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
3eb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ec0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
3ed0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
3ee0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
3ef0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
3f00: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
3f10: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
3f20: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
3f30: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
3f40: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
3f50: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
3f60: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
3f70: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
3f80: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
3f90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
3fa0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
3fb0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3fe0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4010: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4020: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4030: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4040: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
4050: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
4060: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
4070: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
4080: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
4090: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
40a0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
40b0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
40c0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
40d0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
40e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
40f0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4100: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4110: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4120: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4130: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4150: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
4160: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
4170: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4180: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4190: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
41a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
41b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
41c0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
41d0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
41e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
41f0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4200: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
4210: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4220: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4230: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4240: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4250: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4260: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4270: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4280: 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69 74  int end1 = sqlit
4290: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
42a0: 76 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d  v);.  int end2 =
42b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
42c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
42d0: 61 64 64 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  addr;.  KeyInfo 
42e0: 2a 70 49 6e 66 6f 3b 0a 20 20 45 78 70 72 4c 69  *pInfo;.  ExprLi
42f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20  st *pOrderBy;.  
4300: 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73  int nCol, i;.  s
4310: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
4320: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65  se->db;..  if( e
4330: 44 65 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72  Dest==SRT_Sorter
4340: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72   ) return;.  pOr
4350: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
4360: 72 42 79 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f  rBy;.  nCol = pO
4370: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
4380: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d   pInfo = sqliteM
4390: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
43a0: 49 6e 66 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69  Info) + nCol*(si
43b0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
43c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
43d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43e0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
43f0: 72 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 66  r = (char*)&pInf
4400: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a  o->aColl[nCol];.
4410: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
4420: 3d 20 6e 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  = nCol;.  for(i=
4430: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
4440: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  .    pInfo->aCol
4450: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
4460: 43 6f 6c 6c 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Coll;.    pInfo-
4470: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
4480: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
4490: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  sortOrder;.  }. 
44a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
44b0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30  v, OP_Sort, 0, 0
44c0: 2c 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20  , (char*)pInfo, 
44d0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
44e0: 46 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  FF);.  addr = sq
44f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4500: 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30  , OP_SortNext, 0
4510: 2c 20 65 6e 64 31 29 3b 0a 20 20 69 66 28 20 70  , end1);.  if( p
4520: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a  ->iOffset>=0 ){.
4530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4540: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4550: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
4560: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c  addr+4);.    sql
4570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4580: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
4590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
45a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
45b0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20   0, addr);.  }. 
45c0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d   if( p->iLimit>=
45d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
45e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45f0: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d  MemIncr, p->iLim
4600: 69 74 2c 20 65 6e 64 32 29 3b 0a 20 20 7d 0a 20  it, end2);.  }. 
4610: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
4620: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
4630: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
4640: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
4650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4660: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
4670: 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29  Recno, iParm, 0)
4680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
46a0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
46b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
46c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
46d0: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
46e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
46f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  }.    case SRT_S
4700: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
4710: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4720: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4730: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4740: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69  otNull, -1, sqli
4750: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4760: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
4770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4780: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
47a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
47b0: 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Goto, 0, sqlite3
47c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
47d0: 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  v)+3);.      sql
47e0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
47f0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 2c  P_MakeKey, 1, 0,
4800: 20 22 6e 22 2c 20 50 33 5f 53 54 41 54 49 43 29   "n", P3_STATIC)
4810: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4820: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4830: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
4840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4850: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
4860: 72 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30  rKey, (iParm&0x0
4870: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
4880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4890: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
48a0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
48b0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
48c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
48d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
48e0: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
48f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4910: 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Goto, 0, end1);.
4920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4930: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4940: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
4950: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
4960: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e: {.      int i
4970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4980: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4990: 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73  nteger, p->pELis
49a0: 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->nExpr, 0);.  
49b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
49c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
49d0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   1, 0);.      fo
49e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
49f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a10: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d  (v, OP_Column, -
4a20: 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  1-i, i);.      }
4a30: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
4a40: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
4a50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4a70: 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75  _Callback, nColu
4a80: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  mn, 0);.      }e
4a90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4aa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4ab0: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
4ac0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
4ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4af0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  2, 0);.      bre
4b00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4b10: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
4b20: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
4b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4b40: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4b50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4b60: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a  Goto, 0, addr);.
4b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
4b80: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
4b90: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
4ba0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4bb0: 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
4bc0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4bd0: 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73  el(v, end1);.  s
4be0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4bf0: 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c  v, OP_SortReset,
4c00: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
4c10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
4c20: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
4c30: 65 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74  e VDBE the datat
4c40: 79 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  ypes of.** colum
4c50: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
4c60: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
4c70: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65   routine only ge
4c80: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20  nerates code if 
4c90: 74 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77  the "PRAGMA show
4ca0: 5f 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a  _datatypes=on".*
4cb0: 2a 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75  * has been execu
4cc0: 74 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79  ted.  The dataty
4cd0: 70 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  pes are reported
4ce0: 20 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f   out in the azCo
4cf0: 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74  l.** parameter t
4d00: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
4d10: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
4d20: 72 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e  rst N azCol[] en
4d30: 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65  tries.** are the
4d40: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
4d50: 6c 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73  lumns, and the s
4d60: 65 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20  econd N entries 
4d70: 61 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  are the.** datat
4d80: 79 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  ypes for the col
4d90: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  umns..**.** The 
4da0: 22 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61  "datatype" for a
4db0: 20 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20   result that is 
4dc0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79  a column of a ty
4dd0: 70 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74  pe is the.** dat
4de0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
4df0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4e00: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
4e10: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54   statement..** T
4e20: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
4e30: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
4e40: 20 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20   either TEXT or 
4e50: 4e 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a  NUMERIC.  The.**
4e60: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20   datatype for a 
4e70: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
4e80: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
4e90: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
4ea0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
4eb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4ec0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
4ed0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
4ee0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
4ef0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
4f00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
4f10: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
4f20: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
4f30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
4f40: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4f50: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4f60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
4f70: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
4f80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4f90: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
4fa0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
4fb0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
4fc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  = 0;.    if( p==
4fd0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
4fe0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
4ff0: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
5000: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
5010: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
5020: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
5030: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
5040: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
5050: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
5060: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
5070: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
5080: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
5090: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
50a0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
50b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
50c0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
50d0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
50e0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
50f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5100: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
5110: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5120: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
5130: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
5140: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
5150: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c  EGER";.      }el
5160: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70  se{.        zTyp
5170: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
5180: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
5190: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
51a0: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
51b0: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 29 20  ite3ExprType(p) 
51c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
51d0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
51e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
51f0: 58 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  XT";    break;. 
5200: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
5210: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20  TE_AFF_NUMERIC: 
5220: 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d 45 52 49   zType = "NUMERI
5230: 43 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C"; break;.     
5240: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
5260: 70 65 20 3d 20 22 41 4e 59 22 3b 20 20 20 20 20  pe = "ANY";     
5270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5280: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5290: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
52a0: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b 20 70 45  lumnName, i + pE
52b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20  List->nExpr, 0, 
52c0: 7a 54 79 70 65 2c 20 30 29 3b 0a 20 20 7d 0a 7d  zType, 0);.  }.}
52d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
52e0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
52f0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
5300: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
5310: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
5320: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
5330: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
5340: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
5350: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
5360: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
5370: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
5380: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
5390: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
53a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
53b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
53c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
53d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
53e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
53f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5400: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5410: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5420: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5430: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5440: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5450: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
5460: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
5470: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
5480: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
5490: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
54a0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
54b0: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
54c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
54d0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
54e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
54f0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21   }..  assert( v!
5500: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
5510: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5520: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
5530: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
5540: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
5550: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
5560: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
5570: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5580: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
5590: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
55a0: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
55b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
55c0: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
55d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
55e0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
55f0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
5600: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
5610: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5620: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 6e   Expr *p;.    in
5630: 74 20 70 32 20 3d 20 69 3d 3d 70 45 4c 69 73 74  t p2 = i==pEList
5640: 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 70  ->nExpr-1;.    p
5650: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
5660: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
5670: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5680: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
5690: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
56a0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
56b0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
56c0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
56d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
56e0: 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  e(v, i, zName, 0
56f0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
5700: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
5710: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
5720: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5730: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5740: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
5750: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
5760: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
5770: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
5780: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
5790: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
57a0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
57b0: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
57c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
57d0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
57e0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
57f0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
5800: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
5810: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
5820: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
5830: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
5840: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
5850: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5860: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
5870: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
5880: 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f   zCol = "_ROWID_
5890: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
58a0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
58b0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
58c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
58d0: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
58e0: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
58f0: 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20  es && p->span.z 
5900: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5910: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5920: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5930: 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a  (v, i, p->span.z
5940: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
5950: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
5960: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
5970: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
5980: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
5990: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
59a0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
59b0: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
59c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
59d0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
59e0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
59f0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5a00: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
5a10: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
5a20: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
5a30: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
5a40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
5a50: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
5a60: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
5a70: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
5a80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5a90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5aa0: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33  (v, i, zName, P3
5ab0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
5ac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ad0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5ae0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c  lName(v, i, zCol
5af0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5b00: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
5b10: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
5b20: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
5b30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5b40: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
5b50: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5b60: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
5b70: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
5b80: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
5b90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5ba0: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
5bb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5bc0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
5bd0: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
5be0: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
5bf0: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
5c00: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
5c10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5c20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
5c30: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
5c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
5c50: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5c60: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
5c70: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
5c80: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
5c90: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
5ca0: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
5cb0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
5cc0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
5cd0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
5ce0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
5cf0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
5d00: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
5d10: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
5d20: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
5d30: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
5d40: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
5d50: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
5d60: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
5d70: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
5d80: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5d90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
5da0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
5db0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
5dc0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
5dd0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65  ColumnList(Parse
5de0: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a  *, Select*);../*
5df0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
5e00: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
5e10: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
5e20: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
5e30: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
5e40: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
5e50: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
5e60: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
5e70: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
5e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
5e90: 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65   *zTabName, Sele
5ea0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
5eb0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
5ec0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c  nt i, j;.  ExprL
5ed0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43  ist *pEList;.  C
5ee0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 0a 20 20  olumn *aCol;..  
5ef0: 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
5f00: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
5f10: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
5f20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
5f30: 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  b = sqliteMalloc
5f40: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
5f50: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
5f60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5f70: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e  ;.  }.  pTab->zN
5f80: 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f  ame = zTabName ?
5f90: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54   sqliteStrDup(zT
5fa0: 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70  abName) : 0;.  p
5fb0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
5fc0: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d  >pEList;.  pTab-
5fd0: 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  >nCol = pEList->
5fe0: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
5ff0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
6000: 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  .  pTab->aCol = 
6010: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  aCol = sqliteMal
6020: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62  loc( sizeof(pTab
6030: 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d  ->aCol[0])*pTab-
6040: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69  >nCol );.  for(i
6050: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
6060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
6070: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 69 66   *p, *pR;.    if
6080: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
6090: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61 43  Name ){.      aC
60a0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  ol[i].zName = sq
60b0: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
60c0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
60d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
60e0: 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  =pEList->a[i].pE
60f0: 78 70 72 29 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  xpr)->op==TK_DOT
6100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6110: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
6120: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
6130: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
6140: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6150: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 20 20 73  int cnt;.      s
6160: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
6170: 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  (&aCol[i].zName,
6180: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52   pR->token.z, pR
6190: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
61a0: 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30       for(j=cnt=0
61b0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
61c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
61d0: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
61e0: 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69 5d 2e 7a  zName, aCol[i].z
61f0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
6200: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
6210: 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
6220: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [30];.          
6230: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
6240: 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  d",++cnt);.     
6250: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
6260: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
6270: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
6280: 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ng(&aCol[i].zNam
6290: 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  e, pR->token.z, 
62a0: 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 7a 42 75  pR->token.n, zBu
62b0: 66 2c 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  f,n,0);.        
62c0: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
62d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
62e0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
62f0: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6300: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
6310: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26  ite3SetNString(&
6320: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
6330: 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20  ame, p->span.z, 
6340: 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20  p->span.n, 0);. 
6350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6360: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6370: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
6380: 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  f, "column%d", i
6390: 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  +1);.      pTab-
63a0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  >aCol[i].zName =
63b0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42   sqliteStrDup(zB
63c0: 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  uf);.    }.    .
63d0: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
63e0: 69 73 20 61 6c 77 61 79 73 20 4e 4f 4e 45 2c 20  is always NONE, 
63f0: 61 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  as there is no t
6400: 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ype name. */.   
6410: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61   pTab->aCol[i].a
6420: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6430: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  _AFF_NONE;.  }. 
6440: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
6450: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
6460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
6470: 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
6480: 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68  statement, do th
6490: 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a  ree things..**.*
64a0: 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69  *    (1)  Fill i
64b0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
64c0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
64d0: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
64e0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
64f0: 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74 20  defines the set 
6500: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
6510: 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64  hould be scanned
6520: 2e 20 20 46 6f 72 20 76 69 65 77 73 2c 0a 2a 2a  .  For views,.**
6530: 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
6540: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
6550: 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
6560: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
6570: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
6580: 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
6590: 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
65a0: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
65b0: 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
65c0: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
65d0: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
65e0: 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
65f0: 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
6600: 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
6610: 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
6620: 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
6630: 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
6640: 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
6650: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
6660: 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
6670: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 64  **.**    (2)  Ad
6680: 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
6690: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
66a0: 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
66b0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
66c0: 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
66d0: 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
66e0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
66f0: 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
6700: 20 28 33 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (3)  Scan the l
6710: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
6720: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6730: 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
6740: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
6750: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
6760: 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
6770: 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
6780: 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
6790: 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
67a0: 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
67b0: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
67c0: 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
67d0: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
67e0: 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
67f0: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
6800: 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  E..**.** Return 
6810: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  0 on success.  I
6820: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62  f there are prob
6830: 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  lems, leave an e
6840: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
6850: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
6860: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
6870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
6880: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61  lInColumnList(Pa
6890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
68a0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
68b0: 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72  , j, k, rc;.  Sr
68c0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
68d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
68e0: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
68f0: 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  ab;..  if( p==0 
6900: 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29 20  || p->pSrc==0 ) 
6910: 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61 62  return 1;.  pTab
6920: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
6930: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
6940: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  List;..  /* Look
6950: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
6960: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
6970: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
6980: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
6990: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
69a0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
69b0: 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ].pTab ){.      
69c0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
69d0: 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20  has run before! 
69e0: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74   No need to cont
69f0: 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  inue */.      re
6a00: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
6a10: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6a20: 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
6a30: 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
6a40: 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
6a50: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
6a60: 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
6a70: 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e  sert( pTabList->
6a80: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20  a[i].pSelect!=0 
6a90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
6aa0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6ab0: 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  as==0 ){.       
6ac0: 20 63 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65 5b   char zFakeName[
6ad0: 36 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72  60];.        spr
6ae0: 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c 20  intf(zFakeName, 
6af0: 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
6b00: 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20 20 20 20  _%p_",.         
6b10: 20 20 28 76 6f 69 64 2a 29 70 54 61 62 4c 69 73    (void*)pTabLis
6b20: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  t->a[i].pSelect)
6b30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6b40: 33 53 65 74 53 74 72 69 6e 67 28 26 70 54 61 62  3SetString(&pTab
6b50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
6b60: 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20 30 29  s, zFakeName, 0)
6b70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6b80: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6b90: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
6ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
6bb0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
6bc0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
6bd0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20  >a[i].zAlias,.  
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6c10: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
6c20: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
6c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6c40: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
6c50: 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61      /* The isTra
6c60: 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69  nsient flag indi
6c70: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
6c80: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
6c90: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
6ca0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
6cb0: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
6cc0: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
6cd0: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
6ce0: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
6cf0: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
6d00: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
6d10: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
6d20: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
6d30: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
6d40: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
6d50: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54  .      pTab->isT
6d60: 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20  ransient = 1;.  
6d70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
6d80: 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
6d90: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
6da0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
6db0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  use */.      pTa
6dc0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
6dd0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
6de0: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
6df0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54 61  Table(pParse,pTa
6e00: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
6e10: 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  e,pTabList->a[i]
6e20: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
6e30: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
6e40: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6e50: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6e60: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
6e70: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
6e80: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
6e90: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
6ea0: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
6eb0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
6ec0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
6ed0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
6ee0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
6ef0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6f00: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
6f10: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 61 62        /* If pTab
6f20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6f30: 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77  ct!=0 it means w
6f40: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
6f50: 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  th a.        ** 
6f60: 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69  view within a vi
6f70: 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  ew.  The SELECT 
6f80: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c  structure has al
6f90: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20  ready been.     
6fa0: 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20     ** copied by 
6fb0: 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73  the outer view s
6fc0: 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68  o we can skip th
6fd0: 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65  e copy step here
6fe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
6ff0: 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20  he inner view.. 
7000: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7010: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
7020: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
7030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
7040: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
7050: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7060: 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65  ectDup(pTab->pSe
7070: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
7080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7090: 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
70a0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
70b0: 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
70c0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
70d0: 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
70e0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
70f0: 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20  in(pParse, p) ) 
7100: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
7110: 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
7120: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
7130: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
7140: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
7150: 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
7160: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
7170: 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
7180: 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
7190: 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
71a0: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
71b0: 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
71c0: 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
71d0: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
71e0: 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
71f0: 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
7200: 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
7210: 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
7220: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
7230: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
7240: 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
7250: 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
7260: 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
7270: 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
7280: 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
7290: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
72a0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
72b0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
72c0: 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
72d0: 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
72e0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
72f0: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
7300: 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
7310: 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
7320: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
7330: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
7340: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
7350: 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
7360: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
7370: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
7380: 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
7390: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
73a0: 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
73b0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
73c0: 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
73d0: 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
73e0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
73f0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
7400: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70  c = 0;.  if( k<p
7410: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
7420: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
7430: 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
7440: 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
7450: 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
7460: 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
7470: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
7480: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
7490: 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
74a0: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
74b0: 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
74c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
74d0: 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
74e0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
74f0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
7500: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
7510: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
7520: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
7530: 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b   0;.    for(k=0;
7540: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
7550: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
7560: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
7570: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
7580: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
7590: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
75a0: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
75b0: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
75c0: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
75d0: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
75e0: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
75f0: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
7600: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
7610: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
7620: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7630: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7640: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7650: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
7660: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
7670: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
7680: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
7690: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
76a0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
76b0: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
76c0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
76d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
76e0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
76f0: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
7700: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
7710: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
7720: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
7730: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
7740: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
7750: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
7760: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
7770: 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  /.        Token 
7780: 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *pName;         
7790: 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
77a0: 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
77b0: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
77c0: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
77d0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
77e0: 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e     pName = &pE->
77f0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
7800: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7810: 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 30         pName = 0
7820: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7830: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7840: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
7850: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
7860: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
7870: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
7880: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
7890: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
78a0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
78b0: 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  as;.          if
78c0: 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c  ( zTabName==0 ||
78d0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
78e0: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
78f0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
7900: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7910: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7920: 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61 62  ( pName && (zTab
7930: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
7940: 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20  ame[0]==0 || .  
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7960: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
7970: 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d  Name->z, zTabNam
7980: 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20  e, pName->n)!=0 
7990: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
79a0: 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61      zTabName[pNa
79b0: 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20  me->n]!=0) ){.  
79c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
79d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
79e0: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
79f0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
7a00: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
7a10: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
7a30: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
7a40: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
7a50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
7a60: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
7a70: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
7a80: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
7a90: 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   (pTabList->a[i-
7aa0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
7ab0: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  columnIndex(pTab
7ae0: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61  List->a[i-1].pTa
7af0: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b10: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
7b20: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
7b30: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
7b40: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
7b50: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
7b60: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
7b70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7b80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
7b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7ba0: 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49   i>0 && sqlite3I
7bb0: 64 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c  dListIndex(pTabL
7bc0: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69  ist->a[i-1].pUsi
7bd0: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
7be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
7bf0: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
7c00: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
7c10: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
7c20: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
7c30: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
7c40: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
7c50: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
7c60: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
7c70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7c80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c90: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
7ca0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
7cb0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
7cc0: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
7cd0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
7ce0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7cf0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d  ->token.z = zNam
7d00: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e;.            p
7d10: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  Right->token.n =
7d20: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
7d40: 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  ht->token.dyn = 
7d50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
7d60: 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70  f( zTabName && p
7d70: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
7d80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7d90: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
7da0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
7db0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7dc0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
7dd0: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
7de0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
7df0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7e00: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7e10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7e20: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
7e30: 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a  n.z = zTabName;.
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
7e50: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  eft->token.n = s
7e60: 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b  trlen(zTabName);
7e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7e80: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Left->token.dyn 
7e90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7ea0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
7eb0: 69 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45 78  ing((char**)&pEx
7ec0: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61 62  pr->span.z, zTab
7ed0: 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d 65  Name, ".", zName
7ee0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7ef0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
7f00: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70 72  n = strlen(pExpr
7f10: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20  ->span.z);.     
7f20: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7f30: 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  span.dyn = 1;.  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7f50: 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a  r->token.z = 0;.
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
7f70: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  xpr->token.n = 0
7f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7f90: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pExpr->token.dyn
7fa0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7fc0: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
7fd0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
7fe0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
7ff0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b   = pExpr->token;
8000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8010: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
8020: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8030: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45  tAppend(pNew, pE
8040: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
8050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8060: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
8070: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
8080: 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a     if( pName ){.
8090: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
80a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
80b0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
80c0: 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d 65 29 3b  le: %T", pName);
80d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
80e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
80f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8100: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
8110: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
8120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8130: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8140: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8150: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
8160: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
8170: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
8180: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
8190: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
81a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
81b0: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 20  ine recursively 
81c0: 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c 65  unlinks the Sele
81d0: 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62  ct.pSrc.a[].pTab
81e0: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20   pointers.** in 
81f0: 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75  a select structu
8200: 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65 74  re.  It just set
8210: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74  s the pointers t
8220: 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a  o NULL.  This.**
8230: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63 75   routine is recu
8240: 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65 6e  rsive in the sen
8250: 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20 53  se that if the S
8260: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
8270: 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65  Select.** pointe
8280: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
8290: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
82a0: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
82b0: 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74 65  y on that pointe
82c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
82d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
82e0: 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  on the Select st
82f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
8300: 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20 69  ines a.** VIEW i
8310: 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f 20  n order to undo 
8320: 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f 20  any bindings to 
8330: 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69 73  tables.  This is
8340: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65   necessary.** be
8350: 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62 6c  cause those tabl
8360: 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f 50  es might be DROP
8370: 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75 65  ed by a subseque
8380: 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  nt SQL command..
8390: 2a 2a 20 49 66 20 74 68 65 20 62 69 6e 64 69 6e  ** If the bindin
83a0: 67 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76  gs are not remov
83b0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 65 6c  ed, then the Sel
83c0: 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70 54  ect.pSrc->a[].pT
83d0: 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c  ab field.** will
83e0: 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
83f0: 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63 61 74  g to a deallocat
8400: 65 64 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  ed Table structu
8410: 72 65 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  re after the.** 
8420: 44 52 4f 50 20 61 6e 64 20 61 20 63 6f 72 65 64  DROP and a cored
8430: 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72 20 74  ump will occur t
8440: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
8450: 20 56 49 45 57 20 69 73 20 75 73 65 64 2e 0a 2a   VIEW is used..*
8460: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
8470: 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65 63  lectUnbind(Selec
8480: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
8490: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
84a0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61 62  = p->pSrc;.  Tab
84b0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
84c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
84d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
84e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
84f0: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 53    if( (pTab = pS
8500: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21 3d  rc->a[i].pTab)!=
8510: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
8520: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
8530: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8540: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
8550: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8560: 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
8570: 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ].pTab = 0;.    
8580: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
8590: 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  .pSelect ){.    
85a0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
85b0: 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b  tUnbind(pSrc->a[
85c0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
85d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
85e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
85f0: 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20  tine associates 
8600: 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52  entries in an OR
8610: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8620: 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63  n list with.** c
8630: 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75  olumns in a resu
8640: 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52  lt.  For each OR
8650: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8660: 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66  n, the opcode of
8670: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
8680: 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l node is change
8690: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61  d to TK_COLUMN a
86a0: 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76  nd the iColumn v
86b0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  alue of.** the t
86c0: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
86d0: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
86e0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
86f0: 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20  d the iTable.** 
8700: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70  value of the top
8710: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
8720: 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c  illed with iTabl
8730: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  e parameter..**.
8740: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
8750: 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61  prior SELECT cla
8760: 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70  uses, they are p
8770: 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20  rocessed first. 
8780: 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61   A match.** in a
8790: 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54  n earlier SELECT
87a0: 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63   takes precedenc
87b0: 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53  e over a later S
87c0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ELECT..**.** Any
87d0: 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73   entry that does
87e0: 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c   not match is fl
87f0: 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f  agged as an erro
8800: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  r.  The number.*
8810: 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72  * of errors is r
8820: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
8830: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
8840: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50  rbyToColumn(.  P
8850: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8860: 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63         /* A plac
8870: 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72  e to leave error
8880: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
8890: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
88a0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20         /* Match 
88b0: 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  to result column
88c0: 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54  s of this SELECT
88d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
88e0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
88f0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61   The ORDER BY va
8900: 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67  lues to match ag
8910: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ainst columns */
8920: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
8930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8940: 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20  sert this value 
8950: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
8960: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
8970: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
8980: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
8990: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
89a0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
89b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
89c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
89d0: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
89e0: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
89f0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8a00: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
8a10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
8a20: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8a30: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
8a40: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
8a50: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66  0; }.  }.  if( f
8a60: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
8a70: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
8a80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
8a90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
8aa0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
8ab0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
8ac0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
8ad0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
8ae0: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
8af0: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
8b00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8b10: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
8b20: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8b30: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
8b40: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8b50: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8b60: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
8b70: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8b80: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
8b90: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
8ba0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
8bb0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
8bc0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
8bd0: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
8be0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
8bf0: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
8c00: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
8c10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8c20: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
8c30: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
8c40: 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f   position %d sho
8c50: 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31  uld be between 1
8c60: 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20   and %d",.      
8c70: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
8c80: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
8c90: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
8ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8cb0: 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74  .      if( !must
8cc0: 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69  Complete ) conti
8cd0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d  nue;.      iCol-
8ce0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  -;.    }.    for
8cf0: 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20  (j=0; iCol<0 && 
8d00: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
8d10: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
8d20: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
8d30: 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d  ame && (pE->op==
8d40: 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d  TK_ID || pE->op=
8d50: 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20  =TK_STRING) ){. 
8d60: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
8d70: 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20  me, *zLabel;.   
8d80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
8d90: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
8da0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8db0: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a   pE->token.z );.
8dc0: 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d          zLabel =
8dd0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
8de0: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e  E->token.z, pE->
8df0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
8e00: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
8e10: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  (zLabel);.      
8e20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8e30: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
8e40: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
8e50: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
8e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8e70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62   sqliteFree(zLab
8e80: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
8e90: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
8ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
8eb0: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
8ec0: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
8ed0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
8ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ef0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
8f00: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
8f10: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
8f20: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
8f30: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
8f40: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
8f50: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
8f60: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
8f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
8f80: 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70  ol<0 && mustComp
8f90: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  lete ){.      sq
8fa0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8fb0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
8fc0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
8fd0: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
8fe0: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
8ff0: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
9000: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
9010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
9030: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rr;  .}../*.** G
9040: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
9050: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
9060: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
9070: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9080: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9090: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
90a0: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
90b0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
90c0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
90d0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
90e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
90f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
9100: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
9110: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
9120: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9130: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
9140: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
9150: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
9160: 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 2a 2a  ;.}..#if 0  /***
9170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9180: 6e 65 65 64 73 20 64 65 6c 65 74 69 6e 67 20 2a  needs deleting *
9190: 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ****/.static voi
91a0: 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66  d multiSelectAff
91b0: 69 6e 69 74 79 28 53 65 6c 65 63 74 20 2a 70 2c  inity(Select *p,
91c0: 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
91d0: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21 70  int i;..  if( !p
91e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 75 6c   ) return;.  mul
91f0: 74 69 53 65 6c 65 63 74 41 66 66 69 6e 69 74 79  tiSelectAffinity
9200: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 7a 41 66 66  (p->pPrior, zAff
9210: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
9220: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
9230: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
9240: 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c 30 27 20 29   zAff[i]=='\0' )
9250: 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69 5d 20  {.      zAff[i] 
9260: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
9270: 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
9280: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
9290: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
92a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
92b0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
92c0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
92d0: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
92e0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d  d on the.** nLim
92f0: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66  it and nOffset f
9300: 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61  ields.  nLimit a
9310: 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd nOffset hold 
9320: 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  the integers.** 
9330: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
9340: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
9350: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
9360: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
9370: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
9380: 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20  .  Or that hold 
9390: 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73  -1 and 0 if thos
93a0: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
93b0: 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69  mitted..** iLimi
93c0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
93d0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
93e0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
93f0: 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75  mbers for.** cou
9400: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
9410: 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
9420: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
9430: 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c  there is no.** l
9440: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
9450: 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20  et, then iLimit 
9460: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9470: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
9480: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
9490: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
94a0: 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  if iLimit and iO
94b0: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
94c0: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
94d0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
94e0: 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66   nLimit and nOff
94f0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
9500: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
9510: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
9520: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
9530: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
9540: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
9550: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
9560: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
9570: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
9580: 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69  ** Only if nLimi
9590: 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e  t>=0 or nOffset>
95a0: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
95b0: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
95c0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
95d0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
95e0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
95f0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
9600: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
9610: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
9620: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
9630: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
9640: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
9650: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
9660: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
9670: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
9680: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
9690: 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20  ect *p){.  /* . 
96a0: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61   ** If the compa
96b0: 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d  rison is p->nLim
96c0: 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54  it>0 then "LIMIT
96d0: 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61   0" shows.  ** a
96e0: 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20  ll rows.  It is 
96f0: 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c  the same as no l
9700: 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d  imit. If the com
9710: 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a  parision is.  **
9720: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68   p->nLimit>=0 th
9730: 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f  en "LIMIT 0" sho
9740: 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c  w no rows at all
9750: 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31  ..  ** "LIMIT -1
9760: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
9770: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
9780: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
9790: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
97a0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
97b0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
97c0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
97d0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
97e0: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
97f0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
9800: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
9810: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69   */.  if( p->nLi
9820: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit>=0 ){.    in
9830: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
9840: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
9850: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
9860: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9870: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
9880: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
9890: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
98a0: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c  _Integer, -p->nL
98b0: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
98c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
98d0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
98e0: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
98f0: 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  iLimit = iMem;. 
9900: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66   }.  if( p->nOff
9910: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  set>0 ){.    int
9920: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
9930: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65  nMem++;.    Vdbe
9940: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
9950: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
9960: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
9970: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
9980: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9990: 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66  Integer, -p->nOf
99a0: 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  fset, 0);.    sq
99b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
99c0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
99d0: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
99e0: 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a  iOffset = iMem;.
99f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9a00: 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74 72  erate VDBE instr
9a10: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c  uctions that wil
9a20: 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65  l open a transie
9a30: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a  nt table that.**
9a40: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
9a50: 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f  r an index or to
9a60: 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73   store keyed res
9a70: 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ults for a compo
9a80: 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20  und.** select.  
9a90: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
9aa0: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
9ab0: 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64   table that need
9ac0: 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  s a.** KeyInfo s
9ad0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e  tructure.  The n
9ae0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9af0: 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   in the KeyInfo 
9b00: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
9b10: 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20 73   by the result s
9b20: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9b30: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
9b40: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9b50: 74 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68  t..**.** Make th
9b60: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65  e new table a Ke
9b70: 79 41 73 44 61 74 61 20 74 61 62 6c 65 20 69 66  yAsData table if
9b80: 20 6b 65 79 41 73 44 61 74 61 20 69 73 20 74 72   keyAsData is tr
9b90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
9ba0: 69 64 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78  id openTempIndex
9bb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9bc0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
9bd0: 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73 44 61  Tab, int keyAsDa
9be0: 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ta){.  KeyInfo *
9bf0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  pKeyInfo;.  int 
9c00: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69 74  nColumn;.  sqlit
9c10: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
9c20: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  db;.  int i;.  V
9c30: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9c40: 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66 28 20 66  >pVdbe;..  if( f
9c50: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
9c60: 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
9c70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9c80: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c  nColumn = p->pEL
9c90: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b  ist->nExpr;.  pK
9ca0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
9cb0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
9cc0: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e  KeyInfo)+nColumn
9cd0: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
9ce0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  ) );.  if( pKeyI
9cf0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
9d00: 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  .  pKeyInfo->nFi
9d10: 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  eld = nColumn;. 
9d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
9d30: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  umn; i++){.    p
9d40: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
9d50: 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  ] = db->pDfltCol
9d60: 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
9d70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
9d80: 65 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c  enTemp, iTab, 0,
9d90: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
9da0: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
9db0: 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79  DOFF);.  if( key
9dc0: 41 73 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71  AsData ){.    sq
9dd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9de0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
9df0: 69 54 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  iTab, 1);.  }.}.
9e00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9e10: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
9e20: 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79   process a query
9e30: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20   that is really 
9e40: 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20  the union.** or 
9e50: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
9e60: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
9e70: 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a  rate queries..**
9e80: 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
9e90: 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
9ea0: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
9eb0: 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
9ec0: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
9ed0: 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
9ee0: 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
9ef0: 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
9f00: 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
9f10: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
9f20: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
9f30: 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
9f40: 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
9f50: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
9f60: 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
9f70: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9f80: 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
9f90: 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
9fa0: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
9fb0: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
9fc0: 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
9fd0: 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
9fe0: 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
9ff0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
a000: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
a010: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
a020: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
a030: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
a040: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
a050: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
a060: 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
a070: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
a080: 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
a090: 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
a0a0: 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
a0b0: 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
a0c0: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
a0d0: 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
a0e0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
a0f0: 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
a100: 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
a110: 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
a120: 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
a130: 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
a140: 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
a150: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a160: 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
a170: 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
a180: 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
a190: 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
a1a0: 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
a1b0: 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
a1c0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
a1d0: 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
a1e0: 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
a1f0: 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
a200: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
a210: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
a220: 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
a230: 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
a240: 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
a250: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
a260: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
a270: 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20  arse, .  Select 
a280: 2a 70 2c 20 0a 20 20 69 6e 74 20 65 44 65 73 74  *p, .  int eDest
a290: 2c 20 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  , .  int iParm, 
a2a0: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
a2b0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
a2c0: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
a2d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
a2e0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
a2f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a300: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
a310: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
a320: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
a330: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20  *pPrior;     /* 
a340: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
a350: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
a360: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
a370: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
a380: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a390: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
a3a0: 0a 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20 55 53  .#if 0 /* NOT US
a3b0: 45 44 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ED */.  char *af
a3c0: 66 53 74 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  fStr = 0;..  if(
a3d0: 20 21 61 66 66 20 29 7b 0a 20 20 20 20 69 6e 74   !aff ){.    int
a3e0: 20 6c 65 6e 3b 0a 20 20 20 20 72 63 20 3d 20 66   len;.    rc = f
a3f0: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
a400: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
a410: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a420: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
a430: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
a440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
a450: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
a460: 70 72 2b 31 3b 0a 20 20 20 20 61 66 66 53 74 72  pr+1;.    affStr
a470: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
a480: 65 4d 61 6c 6c 6f 63 28 70 2d 3e 70 45 4c 69 73  eMalloc(p->pELis
a490: 74 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20  t->nExpr+1);.   
a4a0: 20 69 66 28 20 21 61 66 66 53 74 72 20 29 7b 0a   if( !affStr ){.
a4b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a4c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
a4d0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
a4e0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
a4f0: 6d 65 6d 73 65 74 28 61 66 66 53 74 72 2c 20 28  memset(affStr, (
a500: 69 6e 74 29 53 51 4c 49 54 45 5f 41 46 46 5f 4e  int)SQLITE_AFF_N
a510: 55 4d 45 52 49 43 2c 20 6c 65 6e 2d 31 29 3b 0a  UMERIC, len-1);.
a520: 20 20 20 20 61 66 66 20 3d 20 61 66 66 53 74 72      aff = affStr
a530: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
a540: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
a550: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
a560: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
a570: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
a580: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
a590: 68 65 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  he last SELECT i
a5a0: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
a5b0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
a5c0: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
a5d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
a5e0: 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
a5f0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
a600: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
a610: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69  _end;.  }.  pPri
a620: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
a630: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
a640: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
a650: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a660: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
a670: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
a680: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
a690: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
a6a0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
a6b0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
a6c0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
a6d0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
a6e0: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69   if( pPrior->nLi
a6f0: 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72  mit>=0 || pPrior
a700: 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ->nOffset>0 ){. 
a710: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a720: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
a730: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
a740: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
a750: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
a760: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
a770: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
a780: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
a790: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
a7a0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
a7b0: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
a7c0: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
a7d0: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
a7e0: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
a7f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
a800: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
a810: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( v==0 ){.    r
a820: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
a830: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
a840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
a850: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
a860: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
a870: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
a880: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
a890: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
a8a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a8b0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
a8c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a8d0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
a8e0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
a8f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a900: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
a910: 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 70 2d 3e  umns, iParm, p->
a920: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
a930: 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f      eDest = SRT_
a940: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
a950: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
a960: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
a970: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
a980: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
a990: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
a9a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
a9b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
a9c0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  >pOrderBy==0 ){.
a9d0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
a9e0: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
a9f0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
aa00: 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d  or->nOffset = p-
aa10: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >nOffset;.      
aa20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
aa30: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
aa40: 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  ior, eDest, iPar
aa50: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  m, 0, 0, 0, aff)
aa60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
aa70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
aa80: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
aa90: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
aaa0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
aab0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
aac0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
aad0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
aae0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
aaf0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
ab00: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69          p->nLimi
ab10: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
ab20: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
ab30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ab40: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ab50: 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
ab60: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
ab70: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  );.        p->pP
ab80: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
ab90: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
aba0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
abb0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
abc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
abd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
abe0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
abf0: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
ac00: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
ac10: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
ac20: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
ac30: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
ac40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
ac50: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
ac60: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
ac70: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
ac80: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
ac90: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
aca0: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
acb0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  t op;          /
acc0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
acd0: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
ace0: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
acf0: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
ad00: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
ad10: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
ad20: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
ad30: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
ad40: 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66   int nLimit, nOf
ad50: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
ad60: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
ad70: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
ad80: 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  t */.      ExprL
ad90: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
ada0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
adb0: 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 72  clause for the r
adc0: 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 0a  ight SELECT */..
add0: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
ade0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
adf0: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
ae00: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
ae10: 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20   eDest==priorOp 
ae20: 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  && p->pOrderBy==
ae30: 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30  0 && p->nLimit<0
ae40: 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d   && p->nOffset==
ae50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
ae60: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
ae70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
ae80: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
ae90: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
aea0: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
aeb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
aec0: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72   unionTab = iPar
aed0: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
aee0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
aef0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
af00: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
af10: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
af20: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
af30: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
af40: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
af50: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
af60: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
af70: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
af80: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20   p->pOrderBy .  
af90: 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72        && matchOr
afa0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
afb0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
afc0: 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  erBy, unionTab, 
afd0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
afe0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
aff0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b000: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
b010: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
b020: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
b030: 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 54 65            openTe
b040: 6d 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  mpIndex(pParse, 
b050: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b  p, unionTab, 1);
b060: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b070: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b080: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b090: 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e  _OpenTemp, union
b0a0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
b0b0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
b0c0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
b0d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b0e0: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
b0f0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
b100: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
b110: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
b120: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b130: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
b140: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
b150: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
b160: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
b170: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
b180: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b190: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
b1a0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op==TK_ALL ){. 
b1b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b1c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
b1d0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69  tNumColumns, uni
b1e0: 6f 6e 54 61 62 2c 20 70 50 72 69 6f 72 2d 3e 70  onTab, pPrior->p
b1f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
b200: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b210: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
b220: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
b230: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
b240: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
b250: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
b260: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
b270: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
b280: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b290: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
b2a0: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
b2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b2c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
b2d0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
b2e0: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
b2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
b300: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
b310: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
b320: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
b330: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
b340: 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20  .      nLimit = 
b350: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
b360: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->nLimit = -1;
b370: 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d  .      nOffset =
b380: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
b390: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
b3a0: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
b3b0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
b3c0: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
b3d0: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
b3e0: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
b3f0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
b400: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
b410: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
b420: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
b430: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
b440: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
b450: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
b460: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
b470: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b480: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
b490: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
b4a0: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
b4b0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
b4c0: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
b4d0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
b4e0: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
b4f0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
b500: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
b510: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
b520: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
b530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b540: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
b550: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
b560: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
b570: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b580: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
b590: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
b5a0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
b5b0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
b5c0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
b5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
b5e0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
b5f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
b600: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
b610: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
b620: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
b630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b640: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
b650: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
b660: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
b670: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
b680: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
b690: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
b6a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
b6b0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
b6c0: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
b6d0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
b6e0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
b6f0: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
b700: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
b730: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
b740: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
b770: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b780: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
b790: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
b7a0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b7b0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
b7c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
b7d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b7e0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
b7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
b810: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
b820: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
b830: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b840: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
b850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b870: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
b880: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
b890: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
b8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
b8b0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
b8c0: 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45  rse, p, v, p->pE
b8d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
b8e0: 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20  st, iParm);.    
b8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b910: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
b920: 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
b930: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
b940: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
b950: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
b960: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
b970: 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 20  t, nOffset;..   
b980: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
b990: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
b9a0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
b9b0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
b9c0: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
b9d0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
b9e0: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
b9f0: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
ba00: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
ba10: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
ba20: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
ba30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ba40: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
ba50: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
ba60: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
ba70: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
ba80: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74  >pOrderBy && mat
ba90: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
baa0: 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f  n(pParse,p,p->pO
bab0: 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29  rderBy,tab1,1) )
bac0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
bad0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
bae0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
baf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
bb00: 70 65 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61  penTempIndex(pPa
bb10: 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 20 31 29  rse, p, tab1, 1)
bb20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bb30: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
bb40: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
bb50: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
bb60: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
bb70: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
bb80: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bb90: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
bba0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
bbb0: 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
bbc0: 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b1, 0, 0, 0, aff
bbd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
bbe0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bbf0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bc00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bc10: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
bc20: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
bc30: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bc40: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
bc50: 0a 20 20 20 20 20 20 6f 70 65 6e 54 65 6d 70 49  .      openTempI
bc60: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
bc70: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
bc80: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
bc90: 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d       nLimit = p-
bca0: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >nLimit;.      p
bcb0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
bcc0: 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70       nOffset = p
bcd0: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->nOffset;.     
bce0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
bcf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
bd00: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
bd10: 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  , p, SRT_Union, 
bd20: 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab2, 0, 0, 0, a
bd30: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
bd40: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
bd50: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
bd60: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
bd70: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
bd80: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
bd90: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
bda0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bdb0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
bdc0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
bdd0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
bde0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
bdf0: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
be00: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
be10: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
be20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
be30: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
be40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
be50: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
be60: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
be70: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
be80: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
be90: 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
bea0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
beb0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
bec0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
bed0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
bee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bef0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
bf00: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
bf10: 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  eak);.      comp
bf20: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
bf30: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
bf40: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
bf50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bf60: 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62   OP_FullKey, tab
bf70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
bf80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bf90: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
bfa0: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
bfb0: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
bfc0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
bfd0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
bfe0: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
bff0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
c020: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
c030: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c050: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
c060: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c070: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
c080: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
c090: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c0b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c0c0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
c0d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c0e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
c0f0: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
c100: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c110: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
c120: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
c130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c140: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c150: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
c160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c170: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
c180: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
c190: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
c1a0: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  ){.        gener
c1b0: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
c1c0: 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  se, p, v, p->pEL
c1d0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
c1e0: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t, iParm);.     
c1f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c200: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
c210: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
c220: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
c230: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
c240: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
c250: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
c260: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c270: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c280: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
c290: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
c2a0: 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
c2b0: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
c2c0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
c2d0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
c2e0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
c2f0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
c300: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c310: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
c320: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c330: 3a 0a 23 69 66 20 30 20 20 2f 2a 2a 2a 20 4e 4f  :.#if 0  /*** NO
c340: 54 20 55 53 45 44 20 2a 2a 2a 2a 2f 0a 20 20 69  T USED ****/.  i
c350: 66 28 20 61 66 66 53 74 72 20 29 7b 0a 20 20 20  f( affStr ){.   
c360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c370: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
c380: 74 65 46 72 65 65 28 61 66 66 53 74 72 29 3b 0a  teFree(affStr);.
c390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c3a0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66 69   multiSelectAffi
c3b0: 6e 69 74 79 28 70 2c 20 61 66 66 53 74 72 29 3b  nity(p, affStr);
c3c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c3d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70  beOp3(v, OP_Noop
c3e0: 2c 20 30 2c 20 30 2c 20 61 66 66 53 74 72 2c 20  , 0, 0, affStr, 
c3f0: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
c400: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c410: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c420: 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
c430: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c440: 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
c450: 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
c460: 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
c470: 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
c480: 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
c490: 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
c4a0: 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
c4b0: 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
c4c0: 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
c4d0: 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
c4e0: 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
c4f0: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
c500: 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
c510: 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
c520: 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
c530: 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
c540: 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
c550: 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
c560: 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
c570: 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
c580: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
c590: 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
c5a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
c5b0: 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
c5c0: 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
c5d0: 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
c5e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
c5f0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
c600: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
c610: 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
c620: 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
c630: 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
c640: 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
c650: 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
c660: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
c670: 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
c680: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
c690: 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
c6a0: 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74  st*,int,ExprList
c6b0: 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20  *);  /* Forward 
c6c0: 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76  Decl */.static v
c6d0: 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45 78  oid substExpr(Ex
c6e0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69  pr *pExpr, int i
c6f0: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
c700: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20  *pEList){.  if( 
c710: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
c720: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
c730: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
c740: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
c750: 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
c760: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
c770: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
c780: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
c790: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c7a0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
c7b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
c7c0: 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
c7d0: 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
c7e0: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
c7f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
c800: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
c810: 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
c820: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
c830: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
c840: 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
c850: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
c860: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
c870: 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  w!=0 );.      pE
c880: 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e  xpr->op = pNew->
c890: 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  op;.      assert
c8a0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
c8b0: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
c8c0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
c8d0: 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
c8e0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Left);.      ass
c8f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
c900: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
c910: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
c920: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e  qlite3ExprDup(pN
c930: 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  ew->pRight);.   
c940: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c950: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
c960: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
c970: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c980: 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73  stDup(pNew->pLis
c990: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
c9a0: 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
c9b0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
c9c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
c9d0: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
c9e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
c9f0: 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20  = pNew->iAgg;.  
ca00: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
ca10: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Copy(&pExpr->tok
ca20: 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
ca30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ca40: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72  TokenCopy(&pExpr
ca50: 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73  ->span, &pNew->s
ca60: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pan);.    }.  }e
ca70: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
ca80: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
ca90: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
caa0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
cab0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
cac0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
cad0: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
cae0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
caf0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
cb00: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
cb10: 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73  id .substExprLis
cb20: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
cb30: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
cb40: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
cb50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
cb60: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
cb70: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
cb80: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
cb90: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
cba0: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
cbb0: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
cbc0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
cbd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cbe0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
cbf0: 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
cc00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
cc10: 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
cc20: 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
cc30: 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
cc40: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
cc50: 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
cc60: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
cc70: 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
cc80: 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
cc90: 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
cca0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
ccb0: 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
ccc0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
ccd0: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
cce0: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
ccf0: 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
cd00: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
cd10: 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
cd20: 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
cd30: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
cd40: 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
cd50: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
cd60: 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
cd70: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
cd80: 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
cd90: 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
cda0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cdb0: 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
cdc0: 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
cdd0: 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
cde0: 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
cdf0: 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
ce00: 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
ce10: 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
ce20: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
ce30: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
ce40: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
ce50: 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
ce60: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
ce70: 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
ce80: 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
ce90: 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
cea0: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
ceb0: 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
cec0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ced0: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
cee0: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
cef0: 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
cf00: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
cf10: 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
cf20: 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
cf30: 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
cf40: 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
cf50: 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
cf60: 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
cf70: 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
cf80: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
cf90: 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
cfa0: 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
cfb0: 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
cfc0: 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
cfd0: 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
cfe0: 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
cff0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
d000: 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
d010: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
d020: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
d030: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
d040: 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
d050: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
d060: 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
d070: 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
d080: 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
d090: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
d0a0: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
d0b0: 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
d0c0: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
d0d0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
d0e0: 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
d0f0: 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  n, or.**        
d100: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
d110: 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69  not itself a joi
d120: 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36  n.  (Ticket #306
d130: 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
d140: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
d150: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
d160: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
d170: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
d180: 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
d190: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
d1a0: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
d1b0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
d1c0: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
d1d0: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
d1e0: 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
d1f0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
d200: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
d210: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
d220: 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
d230: 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
d240: 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
d250: 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
d260: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
d270: 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
d280: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d290: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
d2a0: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
d2b0: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
d2c0: 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
d2d0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
d2e0: 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
d2f0: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
d300: 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
d310: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
d320: 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
d330: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
d340: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
d350: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
d360: 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
d370: 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
d380: 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
d390: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
d3a0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
d3b0: 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
d3c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
d3d0: 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68  .**.**  (12)  Th
d3e0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
d3f0: 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  t the right term
d400: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
d410: 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20   JOIN or the.** 
d420: 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
d430: 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
d440: 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20  use.  (added by 
d450: 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a  ticket #350).**.
d460: 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
d470: 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
d480: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
d490: 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
d4a0: 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
d4b0: 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
d4c0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
d4d0: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
d4e0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
d4f0: 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
d500: 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
d510: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
d520: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
d530: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
d540: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
d550: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
d560: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
d570: 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
d580: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
d590: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
d5a0: 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
d5b0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
d5c0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
d5d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
d5e0: 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
d5f0: 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
d600: 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
d610: 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
d620: 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
d630: 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
d640: 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
d650: 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
d660: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
d670: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
d680: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
d690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
d6a0: 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
d6b0: 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
d6c0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
d6d0: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
d6e0: 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
d6f0: 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
d700: 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
d710: 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
d720: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
d730: 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
d740: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
d750: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
d760: 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
d770: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
d780: 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
d790: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
d7a0: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ons */.){.  Sele
d7b0: 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
d7c0: 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
d7d0: 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
d7e0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d7f0: 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
d800: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d810: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d820: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
d830: 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
d840: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
d850: 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
d860: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d870: 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
d880: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
d890: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
d8a0: 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
d8b0: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
d8c0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
d8d0: 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
d8e0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
d8f0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
d900: 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  Where;..  /* Che
d910: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
d920: 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
d930: 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
d940: 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  if not..  */.  i
d950: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
d960: 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
d970: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
d980: 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
d990: 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
d9a0: 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d  nSrc );.  pSub =
d9b0: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
d9c0: 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
d9d0: 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
d9e0: 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
d9f0: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
da00: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62  urn 0;.  if( sub
da10: 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
da20: 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
da30: 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63  urn 0;.  pSubSrc
da40: 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
da50: 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
da60: 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72   );.  if( pSubSr
da70: 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
da80: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53  urn 0;.  if( (pS
da90: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
daa0: 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d  | pSub->nLimit>=
dab0: 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53  0) &&  (pSrc->nS
dac0: 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
dad0: 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
dae0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69  .  }.  if( (p->i
daf0: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e  sDistinct || p->
db00: 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75  nLimit>=0) && su
db10: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
db20: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
db30: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
db40: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
db50: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65  turn 0;..  /* Re
db60: 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
db70: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
db80: 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
db90: 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
dba0: 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
dbb0: 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
dbc0: 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
dbd0: 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
dbe0: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
dbf0: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
dc00: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
dc10: 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
dc20: 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
dc30: 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
dc40: 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
dc50: 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
dc60: 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
dc70: 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
dc80: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
dc90: 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
dca0: 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
dcb0: 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
dcc0: 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
dcd0: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
dce0: 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28   && iFrom>0 && (
dcf0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d  pSrc->a[iFrom-1]
dd00: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
dd10: 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
dd20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
dd30: 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
dd40: 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
dd50: 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
dd60: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
dd70: 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
dd80: 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
dd90: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
dda0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
ddb0: 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
ddc0: 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
ddd0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
dde0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
ddf0: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
de00: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
de10: 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
de20: 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
de30: 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
de40: 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
de50: 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
de60: 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
de70: 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
de80: 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
de90: 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
dea0: 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
deb0: 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
dec0: 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
ded0: 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
dee0: 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
def0: 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
df00: 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
df10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f  .  */.  if( iFro
df20: 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b  m>0 && (pSrc->a[
df30: 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70  iFrom-1].jointyp
df40: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
df50: 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d   .      && pSub-
df60: 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
df70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
df80: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
df90: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
dfa0: 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
dfb0: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
dfc0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
dfd0: 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
dfe0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
dff0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
e000: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
e010: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
e020: 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
e030: 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
e040: 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
e050: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
e060: 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
e070: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
e080: 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
e090: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
e0a0: 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
e0b0: 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
e0c0: 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
e0d0: 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
e0e0: 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
e0f0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
e100: 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
e110: 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
e120: 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
e130: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
e140: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
e150: 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
e160: 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
e170: 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
e180: 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
e190: 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
e1a0: 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
e1b0: 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
e1c0: 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
e1d0: 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  iParent = pSrc->
e1e0: 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  a[iFrom].iCursor
e1f0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
e200: 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
e210: 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
e220: 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63 2d 3e  ointype = pSrc->
e230: 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
e240: 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  e;..    if( pSrc
e250: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20  ->a[iFrom].pTab 
e260: 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  && pSrc->a[iFrom
e270: 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
e280: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
e290: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
e2a0: 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  0, pSrc->a[iFrom
e2b0: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
e2c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
e2d0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61  rc->a[iFrom].zDa
e2e0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
e2f0: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e300: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iFrom].zName);. 
e310: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
e320: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c  rc->a[iFrom].zAl
e330: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
e340: 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
e350: 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
e360: 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
e370: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
e380: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
e390: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
e3a0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
e3b0: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
e3c0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
e3d0: 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
e3e0: 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
e3f0: 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
e400: 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
e410: 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
e420: 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
e430: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
e450: 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
e460: 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
e470: 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
e480: 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
e490: 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
e4a0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
e4b0: 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
e4c0: 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
e4d0: 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a  rom+nSubSrc-1].j
e4e0: 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
e4f0: 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
e500: 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
e510: 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
e520: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
e530: 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
e540: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
e550: 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
e560: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
e570: 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
e580: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
e590: 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
e5a0: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
e5b0: 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
e5c0: 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
e5d0: 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
e600: 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
e610: 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
e620: 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
e630: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
e640: 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
e650: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e660: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
e670: 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
e680: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
e690: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
e6a0: 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
e6b0: 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
e6c0: 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
e6d0: 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
e6e0: 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
e6f0: 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
e700: 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73  "y+10"..  */.  s
e710: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
e720: 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
e730: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
e740: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
e750: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
e760: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
e770: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
e780: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
e790: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
e7a0: 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
e7b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e7c0: 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
e7d0: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
e7e0: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
e7f0: 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
e800: 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
e810: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
e820: 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
e830: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
e840: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
e850: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
e860: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
e870: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
e880: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e890: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
e8a0: 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
e8b0: 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
e8c0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
e8d0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
e8e0: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
e8f0: 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
e900: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
e910: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
e920: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
e930: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
e940: 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
e950: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
e960: 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
e970: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
e980: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
e990: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
e9a0: 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
e9b0: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
e9c0: 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
e9d0: 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
e9e0: 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
e9f0: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
ea00: 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
ea10: 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
ea20: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
ea30: 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
ea40: 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
ea50: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
ea60: 69 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  if( pSub->pHavin
ea70: 67 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  g ){.      Expr 
ea80: 2a 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  *pHaving = sqlit
ea90: 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
eaa0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20  pHaving);.      
eab0: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
eac0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
ead0: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
eae0: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48  pr(TK_AND, p->pH
eaf0: 61 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20  aving, pHaving, 
eb00: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
eb10: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76  .        p->pHav
eb20: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
eb30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
eb40: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
eb50: 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  upBy==0 );.    p
eb60: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
eb70: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
eb80: 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b  pSub->pGroupBy);
eb90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
eba0: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
ebb0: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
ebc0: 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ere;.  }else{.  
ebd0: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
ebe0: 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
ebf0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
ec00: 20 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b     if( pWhere ){
ec10: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
ec20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
ec30: 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65  K_AND, p->pWhere
ec40: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
ec50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
ec60: 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
ec70: 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
ec80: 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
ec90: 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75  r or the.  ** ou
eca0: 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
ecb0: 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70  tinct. .  */.  p
ecc0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
ecd0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
ece0: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
ecf0: 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
ed00: 20 74 68 65 20 6c 69 6d 69 74 20 65 78 70 72 65   the limit expre
ed10: 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73  ssion from the s
ed20: 75 62 71 75 65 72 79 20 74 6f 20 74 68 65 20 6f  ubquery to the o
ed30: 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 2e  uter.  ** query.
ed40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
ed50: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
ed60: 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74     if( p->nLimit
ed70: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  <0 ){.      p->n
ed80: 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c  Limit = pSub->nL
ed90: 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  imit;.    }else 
eda0: 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d  if( p->nLimit+p-
edb0: 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d  >nOffset > pSub-
edc0: 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f  >nLimit+pSub->nO
edd0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
ede0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
edf0: 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e  >nLimit + pSub->
ee00: 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66  nOffset - p->nOf
ee10: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
ee20: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20    p->nOffset += 
ee30: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a  pSub->nOffset;..
ee40: 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
ee50: 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
ee60: 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
ee70: 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
ee80: 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
ee90: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
eea0: 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
eeb0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
eec0: 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
eed0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
eee0: 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
eef0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
ef00: 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
ef10: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
ef20: 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
ef30: 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
ef40: 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
ef50: 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
ef60: 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
ef70: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
ef80: 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
ef90: 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
efa0: 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
efb0: 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
efc0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
efd0: 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
efe0: 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
eff0: 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
f000: 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
f010: 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
f020: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
f030: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
f040: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
f050: 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
f060: 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
f070: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
f080: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
f090: 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
f0a0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
f0b0: 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
f0c0: 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
f0d0: 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
f0e0: 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
f0f0: 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
f100: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
f110: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
f120: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
f130: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
f140: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
f150: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
f160: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
f170: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
f180: 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
f190: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
f1a0: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
f1b0: 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
f1c0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
f1d0: 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
f1e0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
f1f0: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
f200: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
f210: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
f220: 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
f230: 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
f240: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
f250: 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
f260: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
f270: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
f280: 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
f290: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
f2a0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
f2b0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
f2c0: 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e  int seekOp;.  in
f2d0: 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69  t cont;.  ExprLi
f2e0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69  st *pEList, *pLi
f2f0: 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72  st, eList;.  str
f300: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
f310: 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53  m eListItem;.  S
f320: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
f330: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
f340: 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
f350: 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
f360: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
f370: 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
f380: 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
f390: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
f3a0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
f3b0: 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
f3c0: 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
f3d0: 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
f3e0: 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  Src;.  if( pSrc-
f3f0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
f400: 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
f410: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
f420: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
f430: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
f440: 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
f450: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
f460: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
f470: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
f480: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74  eturn 0;.  pList
f490: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
f4a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
f4b0: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  || pList->nExpr!
f4c0: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
f4d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
f4e0: 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
f4f0: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
f500: 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
f510: 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
f520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
f530: 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
f540: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f550: 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72  e3StrNICmp(pExpr
f560: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c  ->token.z,"max",
f570: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
f580: 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20  kOp = OP_Last;. 
f590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
f5a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70  rn 0;.  }.  pExp
f5b0: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  r = pList->a[0].
f5c0: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
f5d0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
f5e0: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
f5f0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
f600: 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20  olumn;.  pTab = 
f610: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
f620: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
f630: 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
f640: 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
f650: 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
f660: 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
f670: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
f680: 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
f690: 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
f6a0: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
f6b0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
f6c0: 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
f6d0: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
f6e0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
f6f0: 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
f700: 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
f710: 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
f720: 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
f730: 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
f740: 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
f750: 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
f760: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
f770: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
f780: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
f790: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f7a0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f7b0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f7c0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
f7d0: 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
f7e0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
f7f0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20  lumn[0]==iCol ) 
f800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f810: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
f820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f830: 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
f840: 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
f850: 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
f860: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
f870: 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
f880: 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
f890: 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
f8a0: 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
f8b0: 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
f8c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f8d0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f8e0: 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
f8f0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
f900: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
f910: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f920: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
f930: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
f940: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
f950: 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
f960: 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
f970: 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
f980: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
f990: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
f9a0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
f9b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f9c0: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
f9d0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
f9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f9f0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
fa00: 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ns, iParm, 1);. 
fa10: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
fa20: 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
fa30: 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
fa40: 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
fa50: 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
fa60: 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
fa70: 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
fa80: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
fa90: 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
faa0: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
fab0: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
fac0: 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
fad0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
fae0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
faf0: 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
fb00: 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
fb10: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ble..  */.  sqli
fb20: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
fb30: 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
fb40: 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d  ->iDb);.  base =
fb50: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
fb60: 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  sor;.  computeLi
fb70: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
fb80: 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
fb90: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
fba0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
fbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fbc0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
fbd0: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
fbe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fbf0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fc00: 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
fc10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fc20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
fc30: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73  tNumColumns, bas
fc40: 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  e, pTab->nCol);.
fc50: 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c    }.  cont = sql
fc60: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
fc70: 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78  l(v);.  if( pIdx
fc80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fc90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
fca0: 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
fcb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
fcc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fcd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
fce0: 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
fcf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
fd00: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fd10: 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e  base+1, pIdx->tn
fd20: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
fd30: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
fd40: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33  Idx->keyInfo, P3
fd50: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
fd60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fd70: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
fd80: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fd90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fda0: 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
fdb0: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
fdc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fdd0: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
fde0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fdf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fe00: 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30  _MoveGe, base, 0
fe10: 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
fe20: 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
fe30: 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
fe40: 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
fe50: 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
fe60: 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
fe70: 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
fe80: 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
fe90: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
fea0: 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
feb0: 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
fec0: 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
fed0: 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cont, 0);.  sqli
fee0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
fef0: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
ff00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff10: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
ff20: 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74  se, 0);.  .  ret
ff30: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
ff40: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
ff50: 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
ff60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
ff70: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
ff80: 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
ff90: 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
ffa0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
ffb0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65  .** value of eDe
ffc0: 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a  st and iParm..**
ffd0: 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61  .**     eDest Va
ffe0: 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74  lue       Result
fff0: 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
10000 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10030 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43  ---.**     SRT_C
10040 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b  allback    Invok
10050 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
10060 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
10070 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
10080 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
10090 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74       Store first
100a0 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72   result in memor
100b0 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a  y cell iParm.**.
100c0 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
100d0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
100e0 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
100f0 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
10100 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
10110 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
10120 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
10130 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10140 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
10150 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
10160 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
10170 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
10180 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
10190 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
101a0 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
101b0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
101c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
101d0 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  rm.**.** The tab
101e0 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f  le above is inco
101f0 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f  mplete.  Additio
10200 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20  nal eDist value 
10210 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a  have be added.**
10220 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d   since this comm
10230 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e  ent was written.
10240 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74    See the select
10250 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63  InnerLoop() func
10260 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f  tion for.** a co
10270 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f  mplete listing o
10280 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61  f the allowed va
10290 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e  lues of eDest an
102a0 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73  d their meanings
102b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
102c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
102d0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
102e0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
102f0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
10300 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
10310 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
10320 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
10330 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
10340 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
10350 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
10360 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
10370 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
10380 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
10390 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
103a0 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
103b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  t..**.** The pPa
103c0 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
103d0 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67   and *pParentAgg
103e0 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c   fields are fill
103f0 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ed in if this.**
10400 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62   SELECT is a sub
10410 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75  query.  This rou
10420 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20  tine may try to 
10430 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c  combine this SEL
10440 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20  ECT.** with its 
10450 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61  parent to form a
10460 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65   single flat que
10470 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ry.  In so doing
10480 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68  , it might.** ch
10490 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20  ange the parent 
104a0 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e  query from a non
104b0 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e  -aggregate to an
104c0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
104d0 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65  ..** For that re
104e0 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e  ason, the pParen
104f0 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73  tAgg flag is pas
10500 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
10510 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62  , so it.** can b
10520 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
10530 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68   Example 1:   Th
10540 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
10550 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
10560 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  er..**.**    SEL
10570 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f  ECT * FROM t1 JO
10580 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f  IN (SELECT x, co
10590 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20  unt(*) FROM t2) 
105a0 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c  JOIN t3;.**    \
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73        \_______ s
105d0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f  ubquery _______/
105e0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
105f0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
10630 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
10640 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
10650 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
10660 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54  _______/.**.** T
10670 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10680 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75  alled for the ou
10690 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e  ter query first.
106a0 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c     For that call
106b0 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c  ,.** pParent wil
106c0 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69  l be NULL.  Duri
106d0 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ng the processin
106e0 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  g of the outer q
106f0 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72  uery, this .** r
10700 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10710 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
10720 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75  handle the subqu
10730 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65  ery.  For the re
10740 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c  cursive.** call,
10750 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f   pParent will po
10760 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72  int to the outer
10770 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65   query.  Because
10780 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10790 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
107a0 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65  lement in a thre
107b0 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20  e-way join, the 
107c0 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65  parentTab parame
107d0 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31  ter will.** be 1
107e0 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20   (the 2nd value 
107f0 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61  of a 0-indexed a
10800 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  rray.).*/.int sq
10810 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
10820 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
10840 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
10850 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10860 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
10870 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10880 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
10890 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
108a0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
108b0 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
108c0 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
108d0 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
108e0 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
108f0 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
10900 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
10910 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
10920 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
10930 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
10940 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
10950 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
10960 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
10970 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
10980 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
10990 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
109a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
109b0 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20  *pParentAgg,    
109c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
109d0 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
109e0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
109f0 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
10a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
10a10 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
10a20 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
10a30 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
10a40 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 49   int i;.  WhereI
10a50 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56  nfo *pWInfo;.  V
10a60 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73  dbe *v;.  int is
10a70 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Agg = 0;        
10a80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
10a90 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
10aa0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
10ab0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
10ac0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
10ad0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
10ae0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
10af0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
10b00 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
10b10 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
10b20 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
10b30 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
10b40 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10b50 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
10b60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10b70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
10b80 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
10b90 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
10ba0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10bb0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
10bc0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
10bd0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
10be0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
10bf0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
10c00 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
10c10 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
10c20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
10c30 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
10c40 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
10c50 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
10c60 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
10c70 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
10c80 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
10c90 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
10ca0 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
10cb0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
10cc0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
10cd0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
10ce0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  s function */.. 
10cf0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
10d00 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
10d10 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
10d20 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10d30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10d40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10d50 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
10d60 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
10d70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
10d80 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
10d90 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
10da0 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
10db0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
10dc0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
10dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
10de0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
10df0 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
10e00 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f  , aff);.  }..  /
10e10 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
10e20 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
10e30 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
10e40 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
10e50 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
10e60 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
10e70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
10e80 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
10e90 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
10ea0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
10eb0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
10ec0 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
10ed0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
10ee0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10ef0 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72  VDBE cursors for
10f00 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
10f10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
10f20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
10f30 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
10f40 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10f50 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  st);..  /* .  **
10f60 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
10f70 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
10f80 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
10f90 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
10fa0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
10fb0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
10fc0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
10fd0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10fe0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
10ff0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70  t_end;..  /* Exp
11000 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d  and any "*" term
11010 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
11020 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70  set.  (For examp
11030 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20  le the "*" in.  
11040 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
11050 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c  M t1")  The fill
11060 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72  InColumnlist() r
11070 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
11080 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72   some.  ** other
11090 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20   housekeeping - 
110a0 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  see the header c
110b0 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69  omment for detai
110c0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  ls..  */.  if( f
110d0 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
110e0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
110f0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11100 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20  d;.  }.  pWhere 
11110 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
11120 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
11130 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
11140 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
11150 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
11160 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
11170 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
11180 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
11190 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
111a0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
111b0 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  */.  if( (eDest=
111c0 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
111d0 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
111e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
111f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11200 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
11210 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
11220 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
11230 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
11240 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
11250 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
11260 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
11270 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
11280 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
11290 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
112a0 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
112b0 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  */.  switch( eDe
112c0 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
112d0 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61  RT_Union:.    ca
112e0 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20  se SRT_Except:. 
112f0 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63     case SRT_Disc
11300 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65  ard:.      pOrde
11310 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  rBy = 0;.      b
11320 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
11330 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t:.      break;.
11340 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
11350 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75  s point, we shou
11360 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ld have allocate
11370 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72  d all the cursor
11380 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e  s that we.  ** n
11390 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75  eed to handle su
113a0 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70  bquerys and temp
113b0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a  orary tables.  .
113c0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76    **.  ** Resolv
113d0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
113e0 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61  es and do a sema
113f0 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61  ntics check on a
11400 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
11410 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
11420 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
11430 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
11440 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
11450 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
11460 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45   pTabList, 0, pE
11470 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11480 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11490 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
114a0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
114b0 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
114c0 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
114d0 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67  pExpr, 1, &isAgg
114e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
114f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11500 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  }.  }.  if( pWhe
11510 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  re ){.    if( sq
11520 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
11530 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11540 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57  List, pEList, pW
11550 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67  here) ){.      g
11560 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11570 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
11580 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
11590 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30  Parse, pWhere, 0
115a0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  , 0) ){.      go
115b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
115c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
115d0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
115e0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
115f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
11600 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11610 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
11620 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
11630 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
11640 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11650 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
11660 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
11670 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
11680 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11690 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  st, pHaving) ){.
116a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
116b0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
116c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
116d0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48  Check(pParse, pH
116e0 61 76 69 6e 67 2c 20 31 2c 20 26 69 73 41 67 67  aving, 1, &isAgg
116f0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11700 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11710 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64  }.  }.  if( pOrd
11720 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
11730 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
11740 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11750 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
11760 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
11770 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
11780 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
11790 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
117a0 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26  ger(pE, &iCol) &
117b0 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  & iCol>0 && iCol
117c0 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
117d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
117e0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
117f0 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
11800 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
11810 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
11820 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
11830 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
11840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11850 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11860 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11870 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11880 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
11890 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
118a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
118b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
118c0 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20  eck(pParse, pE, 
118d0 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20  isAgg, 0) ){.   
118e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
118f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
11900 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11910 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
11920 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
11930 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11940 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
11950 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11960 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11970 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
11980 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
11990 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
119a0 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
119b0 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20  nstants");.     
119c0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
119d0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  _end;.        }e
119e0 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20  lse if( iCol<=0 
119f0 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
11a00 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
11a10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11a20 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
11a30 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
11a40 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
11a50 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
11a60 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
11a70 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74              "bet
11a80 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
11a90 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
11aa0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
11ab0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11ac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11ad0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11ae0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
11af0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
11b00 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
11b10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
11b20 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
11b30 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  *pE = pGroupBy->
11b40 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11b50 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11b60 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
11b70 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20  iCol) && iCol>0 
11b80 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d  && iCol<=pEList-
11b90 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11ba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11bb0 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20  ete(pE);.       
11bc0 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e   pE = pGroupBy->
11bd0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
11be0 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
11bf0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
11c00 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
11c10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11c20 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
11c30 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
11c40 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
11c50 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11c60 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11c70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11c80 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
11c90 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
11ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
11cb0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11cc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
11cd0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
11ce0 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
11cf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11d00 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11d10 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20   &iCol)==0 ){.  
11d20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11d30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
11d40 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f              "GRO
11d50 55 50 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74  UP BY terms must
11d60 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65   not be non-inte
11d70 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b  ger constants");
11d80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11d90 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11da0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
11db0 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45  ol<=0 || iCol>pE
11dc0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
11dd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11de0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47  .             "G
11e00 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e  ROUP BY column n
11e10 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20  umber %d out of 
11e20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
11e30 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
11e40 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
11e50 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73  %d", iCol, pELis
11e60 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
11e70 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11e80 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
11e90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11ea0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
11eb0 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
11ec0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11ed0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11ee0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
11ef0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11f00 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
11f10 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
11f20 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
11f30 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
11f40 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
11f50 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
11f60 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
11f70 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
11f80 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
11f90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
11fa0 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
11fb0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
11fc0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
11fd0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
11fe0 69 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 31  ist);.  }..#if 1
11ff0 20 20 2f 2a 20 49 20 64 6f 20 6e 6f 74 20 74 68    /* I do not th
12000 69 6e 6b 20 77 65 20 6e 65 65 64 20 74 68 65 20  ink we need the 
12010 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61  following code a
12020 6e 79 20 6d 6f 72 65 2e 2e 2e 2e 20 2a 2f 0a 20  ny more.... */. 
12030 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
12040 6e 61 74 69 6f 6e 20 69 73 20 53 52 54 5f 55 6e  nation is SRT_Un
12050 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 74 68  ion, then set th
12060 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
12070 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  mns in.  ** the 
12080 72 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c  records that wil
12090 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
120a0 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
120b0 20 74 61 62 6c 65 2e 20 54 68 65 20 63 61 6c 6c   table. The call
120c0 65 72 0a 20 20 2a 2a 20 63 6f 75 6c 64 6e 27 74  er.  ** couldn't
120d0 20 64 6f 20 74 68 69 73 2c 20 69 6e 20 63 61 73   do this, in cas
120e0 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
120f0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
12100 20 66 6f 72 6d 20 0a 20 20 2a 2a 20 22 53 45 4c   form .  ** "SEL
12110 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 2e 22  ECT * FROM ...."
12120 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  . .  **.  ** We 
12130 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
12140 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 20  before we start 
12150 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64  inserting record
12160 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  s into the .  **
12170 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12180 20 28 77 68 69 63 68 20 68 61 73 20 68 61 64 20   (which has had 
12190 4f 50 5f 4b 65 79 41 73 44 61 74 61 20 65 78 65  OP_KeyAsData exe
121a0 63 75 74 65 64 20 6f 6e 20 69 74 29 2c 20 62 65  cuted on it), be
121b0 63 61 75 73 65 0a 20 20 2a 2a 20 69 74 20 69 73  cause.  ** it is
121c0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
121d0 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   key comparison 
121e0 66 75 6e 63 74 69 6f 6e 2e 20 53 6f 20 64 6f 20  function. So do 
121f0 69 74 20 6e 6f 77 2c 20 65 76 65 6e 0a 20 20 2a  it now, even.  *
12200 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20 6d 65  * though this me
12210 61 6e 73 20 74 68 61 74 20 4f 50 5f 53 65 74 4e  ans that OP_SetN
12220 75 6d 43 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  umColumns may be
12230 20 65 78 65 63 75 74 65 64 20 6f 6e 20 74 68 65   executed on the
12240 20 73 61 6d 65 0a 20 20 2a 2a 20 63 75 72 73 6f   same.  ** curso
12250 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  r more than once
12260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
12270 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b  st==SRT_Union ){
12280 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12290 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
122a0 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d  umColumns, iParm
122b0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
122c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
122d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
122e0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
122f0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
12300 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
12310 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
12320 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
12330 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12340 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
12350 74 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  t;.    int needR
12360 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a  estoreContext;..
12370 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
12380 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[i].pSelect==
12390 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
123a0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
123b0 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b  a[i].zName!=0 ){
123c0 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
123d0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
123e0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
123f0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
12400 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54  AuthContext = pT
12410 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
12420 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
12430 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
12440 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12450 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
12460 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
12470 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12480 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
12490 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
124a0 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t, SRT_TempTable
124b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
124c0 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
124d0 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69  i].iCursor, p, i
124e0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
124f0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
12500 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
12510 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
12520 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
12530 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
12540 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
12550 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
12560 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
12570 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
12580 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
12590 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
125a0 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
125b0 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
125c0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
125d0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
125e0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
125f0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
12600 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
12610 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
12620 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
12630 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  t;.  }..  /* Che
12640 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
12650 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
12660 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
12670 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
12680 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
12690 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
126a0 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
126b0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
126c0 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
126d0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
126e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
126f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
12700 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
12710 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
12720 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
12730 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
12740 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
12750 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
12760 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
12770 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
12780 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
12790 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
127a0 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
127b0 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
127c0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
127d0 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
127e0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
127f0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
12800 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
12810 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
12820 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
12830 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
12840 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  r..  */.  comput
12850 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12860 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f  pParse, p);..  /
12870 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
12880 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
12890 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
128a0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
128b0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
128c0 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
128d0 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
128e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
128f0 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
12900 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
12910 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12920 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
12930 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e   iParm, pEList->
12940 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
12950 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  * Do an analysis
12960 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78   of aggregate ex
12970 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
12980 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74    sqliteAggregat
12990 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73  eInfoReset(pPars
129a0 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20  e);.  if( isAgg 
129b0 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  || pGroupBy ){. 
129c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
129d0 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20  e->nAgg==0 );.  
129e0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
129f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12a00 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12a10 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12a20 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
12a30 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
12a40 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
12a50 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
12a60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12a80 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
12a90 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
12aa0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
12ab0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12ac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12ad0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
12ae0 65 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  es(pParse, pGrou
12af0 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
12b10 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12b30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12b40 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
12b50 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
12b60 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
12b70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20  Having) ){.     
12b80 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12ba0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12bb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
12bc0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
12bd0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
12be0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
12bf0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
12c00 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
12c10 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
12c20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
12c30 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
12c40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12c50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
12c60 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a   the aggregator.
12c70 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
12c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12c90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
12ca0 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72  ggReset, 0, pPar
12cb0 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66  se->nAgg);.    f
12cc0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
12cd0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
12ce0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
12cf0 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  nc;.      if( (p
12d00 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61  Func = pParse->a
12d10 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30  Agg[i].pFunc)!=0
12d20 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61   && pFunc->xFina
12d30 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
12d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
12d50 33 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c  3(v, OP_AggInit,
12d60 20 30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46   0, i, (char*)pF
12d70 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
12d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d90 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
12da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
12db0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12dc0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
12dd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12de0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12df0 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b  AggFocus, 0, 0);
12e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12e10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
12e20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e  memory cell to N
12e30 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ULL.  */.  if( e
12e40 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b  Dest==SRT_Mem ){
12e50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
12e70 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
12e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12e90 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
12ea0 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
12eb0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70    /* Open a temp
12ec0 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
12ed0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
12ee0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
12ef0 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
12f00 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
12f10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12f20 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64  .    openTempInd
12f30 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69  ex(pParse, p, di
12f40 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65  stinct, 0);.  }e
12f50 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
12f60 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
12f70 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
12f80 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
12f90 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
12fa0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
12fb0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
12fc0 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  here, 0, .      
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f        pGroupBy ?
12ff0 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b   0 : &pOrderBy);
13000 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
13010 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
13020 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68  nd;..  /* Use th
13030 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
13040 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20   loop if we are 
13050 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68  not dealing with
13060 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
13070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
13080 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65  gg ){.    if( se
13090 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
130a0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
130b0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
130c0 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
130d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
130e0 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
130f0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
13100 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
13110 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67  aff) ){.       g
13120 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13140 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
13150 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
13160 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73  s, then do the s
13170 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
13180 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
13190 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
131a0 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 70 41  .    AggExpr *pA
131b0 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  gg;.    if( pGro
131c0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
131d0 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f  t lbl1;.      fo
131e0 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
131f0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
13200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13210 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
13220 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
13230 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
13240 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e       /* No affin
13250 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 74  ity string is at
13260 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f  tached to the fo
13270 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 4b  llowing OP_MakeK
13280 65 79 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  ey .      ** bec
13290 61 75 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  ause we do not n
132a0 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20 63 6f  eed to do any co
132b0 65 72 63 69 6f 6e 20 6f 66 20 64 61 74 61 74 79  ercion of dataty
132c0 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  pes. */.      sq
132d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
132e0 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47  , OP_MakeKey, pG
132f0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30  roupBy->nExpr, 0
13300 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
13310 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13320 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
13330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13340 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
13350 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  0, lbl1);.      
13360 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
13370 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
13380 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
13390 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
133a0 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67    if( pAgg->isAg
133b0 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
133c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
133d0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 41  rCode(pParse, pA
133e0 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  gg->pExpr);.    
133f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13400 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65  ddOp(v, OP_AggSe
13410 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
13420 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
13430 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13440 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a  v, lbl1);.    }.
13450 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67      for(i=0, pAg
13460 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20  g=pParse->aAgg; 
13470 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
13480 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20  i++, pAgg++){.  
13490 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
134a0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
134b0 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
134c0 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ef;.      if( !p
134d0 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e  Agg->isAgg ) con
134e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
134f0 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63  ert( pAgg->pFunc
13500 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
13510 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63  ert( pAgg->pFunc
13520 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20  ->xStep!=0 );.  
13530 20 20 20 20 70 44 65 66 20 3d 20 70 41 67 67 2d      pDef = pAgg-
13540 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 45  >pFunc;.      pE
13550 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a   = pAgg->pExpr;.
13560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13570 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
13580 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pE->op==TK_
13590 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
135a0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71        nExpr = sq
135b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
135c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
135d0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
135e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13600 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
13610 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
13620 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45  P_AggFunc, 0, nE
13630 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66  xpr, (char*)pDef
13640 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
13650 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45     }.  }..  /* E
13660 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
13670 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a  scan loop..  */.
13680 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
13690 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
136a0 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65   If we are proce
136b0 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73  ssing aggregates
136c0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74  , we need to set
136d0 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f   up a second loo
136e0 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20  p.  ** over all 
136f0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
13700 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63   values and proc
13710 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ess them..  */. 
13720 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
13730 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73    int endagg = s
13740 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
13750 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
13760 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74  startagg;.    st
13770 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65 33  artagg = sqlite3
13780 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13790 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61  AggNext, 0, enda
137a0 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  gg);.    pParse-
137b0 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20  >useAgg = 1;.   
137c0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
137d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
137e0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
137f0 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61   pHaving, starta
13800 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  gg, 1);.    }.  
13810 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
13820 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
13830 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
13840 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
13850 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20  t, eDest,.      
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
13870 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65  arm, startagg, e
13880 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20  ndagg, aff) ){. 
13890 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
138a0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
138b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
138c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
138d0 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73  startagg);.    s
138e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
138f0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67  eLabel(v, endagg
13900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13910 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
13920 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  op, 0, 0);.    p
13930 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
13940 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
13950 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
13960 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
13970 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
13980 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
13990 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
139a0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
139b0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
139c0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
139d0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
139e0 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
139f0 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
13a00 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
13a10 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rm);.  }..  /* I
13a20 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
13a30 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
13a40 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
13a50 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
13a60 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
13a70 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74  table.  So delet
13a80 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73  e the subquery s
13a90 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
13aa0 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f  e parent.  ** to
13ab0 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75   prevent this su
13ac0 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e  bquery from bein
13ad0 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  g evaluated agai
13ae0 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74  n and to force t
13af0 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20  he.  ** the use 
13b00 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
13b10 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
13b20 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
13b30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
13b40 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
13b50 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
13b60 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
13b70 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
13b80 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
13b90 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
13ba0 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20  ctDelete(p);.   
13bb0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
13bc0 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
13bd0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lect = 0;.  }.. 
13be0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
13bf0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
13c00 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
13c10 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
13c20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
13c30 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
13c40 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
13c50 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
13c60 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
13c70 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
13c80 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
13c90 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
13ca0 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
13cb0 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
13cc0 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  lect_end:.  sqli
13cd0 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
13ce0 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20  eset(pParse);.  
13cf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.