/ Hex Artifact Content
Login

Artifact 767e9d0f0652ff8d319c13cc72a8eef4098ce30e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 32 35  select.c,v 1.225
0200: 20 32 30 30 35 2f 30 31 2f 31 38 20 31 34 3a 34   2005/01/18 14:4
0210: 35 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a 2a  5:48 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
0a00: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a10: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a20: 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20     u8 nChar;.   
0a30: 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65   u8 code;.  } ke
0a40: 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20  ywords[] = {.   
0a50: 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c   { "natural", 7,
0a60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20   JT_NATURAL },. 
0a70: 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20     { "left",    
0a80: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
0a90: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69  TER },.    { "ri
0aa0: 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49  ght",   5, JT_RI
0ab0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0ac0: 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20      { "full",   
0ad0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
0ae0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0af0: 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20  .    { "outer", 
0b00: 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c    5, JT_OUTER },
0b10: 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20  .    { "inner", 
0b20: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b30: 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20  .    { "cross", 
0b40: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b50: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0b60: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0b70: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0b80: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0b90: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0ba0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0bb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0bc0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0bd0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0be0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
0bf0: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
0c00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
0c10: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
0c20: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
0c30: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
0c40: 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  Cmp(p->z, keywor
0c50: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0c60: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0c70: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0c80: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0c90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0cb0: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0cc0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0cd0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0ce0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0cf0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
0d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d10: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
0d20: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
0d30: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
0d40: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
0d50: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
0d60: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
0d70: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
0d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31  const char *zSp1
0d90: 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73   = " ";.    cons
0da0: 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22  t char *zSp2 = "
0db0: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0dc0: 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20  0 ){ zSp1++; }. 
0dd0: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
0de0: 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71  zSp2++; }.    sq
0df0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0e00: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
0e10: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
0e20: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
0e30: 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20    "%T%s%T%s%T", 
0e40: 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53  pA, zSp1, pB, zS
0e50: 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  p2, pC);.    joi
0e60: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
0e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  ;.  }else if( jo
0e80: 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48  intype & JT_RIGH
0e90: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
0ea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0eb0: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
0ec0: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
0ed0: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
0ee0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
0ef0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
0f00: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
0f10: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
0f20: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
0f30: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
0f40: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
0f50: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
0f60: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
0f70: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
0f80: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
0f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
0fa0: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
0fb0: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
0fc0: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
0fd0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0fe0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
0ff0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1000: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1010: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1020: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1030: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1040: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  -1;.}../*.** Set
1050: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1060: 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30  token to a '\000
1070: 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  '-terminated str
1080: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
1090: 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b  oid setToken(Tok
10a0: 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  en *p, const cha
10b0: 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20  r *z){.  p->z = 
10c0: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c  z;.  p->n = strl
10d0: 65 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20  en(z);.  p->dyn 
10e0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
10f0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
1100: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1110: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
1120: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
1130: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1140: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1150: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1160: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1170: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1180: 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73  hereTerm(.  cons
1190: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
11a0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
11c0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11d0: 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73  b1,      /* Firs
11e0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  t table */.  con
11f0: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c  st Table *pTab2,
1200: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
1210: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  table */.  Expr 
1220: 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20 20  **ppExpr        
1230: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
1240: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
1250: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1260: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  */.){.  Token du
1270: 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  mmy;.  Expr *pE1
1280: 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b  a, *pE1b, *pE1c;
1290: 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a  .  Expr *pE2a, *
12a0: 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45  pE2b, *pE2c;.  E
12b0: 78 70 72 20 2a 70 45 3b 0a 0a 20 20 73 65 74 54  xpr *pE;..  setT
12c0: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 43 6f  oken(&dummy, zCo
12d0: 6c 29 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c  l);.  pE1a = sql
12e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12f0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  0, 0, &dummy);. 
1300: 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45   pE2a = sqlite3E
1310: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1320: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 73 65 74 54   &dummy);.  setT
1330: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 70 54 61  oken(&dummy, pTa
1340: 62 31 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 70 45  b1->zName);.  pE
1350: 31 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1b = sqlite3Expr
1360: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1370: 75 6d 6d 79 29 3b 0a 20 20 73 65 74 54 6f 6b 65  ummy);.  setToke
1380: 6e 28 26 64 75 6d 6d 79 2c 20 70 54 61 62 32 2d  n(&dummy, pTab2-
1390: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 70 45 32 62 20  >zName);.  pE2b 
13a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13b0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13c0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13d0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13e0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
13f0: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1400: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1410: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1420: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1430: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1440: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1450: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1460: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a 70  _FromJoin);.  *p
1470: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1480: 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20  xprAnd(*ppExpr, 
1490: 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  pE);.}../*.** Se
14a0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
14b0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
14c0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
14d0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
14e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
14f0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1500: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1510: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1520: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
1530: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1540: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
1550: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
1560: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
1570: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
1580: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
1590: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
15a0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
15b0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
15c0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
15d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
15e0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
15f0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
1600: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
1610: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
1620: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
1630: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1640: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
1650: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
1660: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
1670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1680: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
1690: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
16a0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
16b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
16c0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65 74  omJoin);.    set
16d0: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
16e0: 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  t);.    p = p->p
16f0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1710: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1720: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1730: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1740: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1750: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1760: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1770: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1780: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1790: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
17a0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
17b0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
17c0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
17d0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
17e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
17f0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1800: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
1810: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
1820: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
1830: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
1840: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
1850: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
1860: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
1870: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
1880: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
1890: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
18a0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
18b0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
18c0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
18d0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
18e0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
18f0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
1900: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
1910: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1920: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1930: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
1940: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
1950: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
1960: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1970: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1980: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1990: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
19a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
19b0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
19c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
19d0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
19e0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a00: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
1a10: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a20: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a50: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
1a60: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
1a70: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
1a80: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
1a90: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1aa0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
1ab0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
1ac0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
1ad0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
1ae0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
1af0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
1b00: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
1b10: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
1b20: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
1b30: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
1b40: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
1b50: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
1b60: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
1b70: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
1b80: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
1b90: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
1ba0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
1bb0: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
1bc0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
1bd0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
1be0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
1bf0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
1c00: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
1c10: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
1c20: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
1c30: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
1c40: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
1c50: 69 66 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  if( pLeft->joint
1c60: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1c70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
1c80: 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66  eft->pOn || pLef
1c90: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
1ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1cb0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1cc0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
1cd0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
1ce0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
1cf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
1d00: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
1d10: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1d20: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1d30: 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  LeftTab->nCol; j
1d40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
1d50: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74  r *zName = pLeft
1d60: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1d70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
1d80: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
1d90: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  htTab, zName)>=0
1da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
1db0: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
1dc0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 52 69 67  , pLeftTab, pRig
1dd0: 68 74 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  htTab, &p->pWher
1de0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e00: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1e10: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1e20: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1e30: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1e40: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
1e50: 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70 55 73 69  n && pLeft->pUsi
1e60: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1e70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e80: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
1e90: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1ea0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1eb0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1ec0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
1ed0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ee0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1ef0: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
1f00: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1f10: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
1f20: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
1f30: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1f40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1f50: 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  eft->pOn ){.    
1f60: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c    setJoinExpr(pL
1f70: 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  eft->pOn);.     
1f80: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
1f90: 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
1fa0: 57 68 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f  Where, pLeft->pO
1fb0: 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 2d  n);.      pLeft-
1fc0: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
1fd0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
1fe0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
1ff0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
2000: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
2010: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
2020: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
2030: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
2040: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
2050: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
2060: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
2070: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
2080: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
2090: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
20a0: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
20b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
20c0: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
20d0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
20e0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
20f0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
2100: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
2110: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
2120: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
2130: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
2140: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
2150: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
2160: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2170: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2180: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
2190: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a   pLeft->pUsing;.
21a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
21b0: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
21c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
21d0: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e  *zName = pList->
21e0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
21f0: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2200: 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e  dex(pLeftTab, zN
2210: 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e  ame)<0 || column
2220: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
2230: 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20   zName)<0 ){.   
2240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2260: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
2270: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
2280: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
2290: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
22a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
22b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
22c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
22e0: 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d  ddWhereTerm(zNam
22f0: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 52 69  e, pLeftTab, pRi
2300: 67 68 74 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ghtTab, &p->pWhe
2310: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2320: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2330: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2340: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2350: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2360: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2370: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2380: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2390: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
23a0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
23b0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
23c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23d0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
23e0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
23f0: 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ete(p->pSrc);.  
2400: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2410: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2420: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2430: 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42  elete(p->pGroupB
2440: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
2450: 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69  rDelete(p->pHavi
2460: 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ng);.  sqlite3Ex
2470: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2480: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
2490: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
24a0: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73  (p->pPrior);.  s
24b0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
24c0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
24d0: 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  e aggregate info
24e0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
24f0: 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
2500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2510: 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
2520: 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20  InfoReset(Parse 
2530: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
2540: 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61  teFree(pParse->a
2550: 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Agg);.  pParse->
2560: 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  aAgg = 0;.  pPar
2570: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
2580: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
2590: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
25a0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
25b0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
25c0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
25d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
25e0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
25f0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
2600: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
2610: 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  orter(Parse *pPa
2620: 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78  rse, Vdbe *v, Ex
2630: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2640: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2650: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
2660: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
2670: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2680: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ode(pParse, pOrd
2690: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
26a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
26b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
26c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64  MakeRecord, pOrd
26d0: 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  erBy->nExpr, 0);
26e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
26f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75  dOp(v, OP_SortPu
2700: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
2710: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2720: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2730: 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 0a 2a 2f  SET and LIMIT.*/
2740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
2750: 65 4c 69 6d 69 74 65 72 28 0a 20 20 56 64 62 65  eLimiter(.  Vdbe
2760: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
2770: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
2780: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
2790: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
27a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
27b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
27c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
27d0: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a  iContinue,    /*
27e0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
27f0: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
2800: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ecord */.  int i
2810: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 2f 2a 20  Break,       /* 
2820: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64  Jump here to end
2830: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
2840: 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20  nt nPop         
2850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
2860: 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b  mes to pop stack
2870: 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f   when jumping */
2880: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
2890: 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  fset>=0 ){.    i
28a0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
28b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
28c0: 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  (v) + 2;.    if(
28d0: 20 6e 50 6f 70 3e 30 20 29 20 61 64 64 72 2b 2b   nPop>0 ) addr++
28e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
2900: 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Incr, p->iOffset
2910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
2920: 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20   nPop>0 ){.     
2930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2940: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f  p(v, OP_Pop, nPo
2950: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p, 0);.    }.   
2960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2970: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2980: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
2990: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29a0: 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20   "# skip OFFSET 
29b0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 7d 0a  records"));.  }.
29c0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
29d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
29e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
29f0: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
2a00: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
2a10: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2a20: 2c 20 22 23 20 65 78 69 74 20 77 68 65 6e 20 4c  , "# exit when L
2a30: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
2a40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a50: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2a60: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2a70: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2a80: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2a90: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2aa0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2ab0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2ac0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2ad0: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2ae0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2af0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2b00: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2b10: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2b20: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2b30: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2b40: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2b50: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2b60: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2b70: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2b80: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2ba0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2bb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2be0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c00: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2c10: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2c20: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2c30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2c40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2c50: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2c60: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2c70: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2c80: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2c90: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2ca0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2cb0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2cc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2cd0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2ce0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2cf0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2d00: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2d10: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2d20: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2d30: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2d40: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2d50: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2d60: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2d70: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2d80: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2d90: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2da0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2db0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2dc0: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2dd0: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2de0: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2df0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2e00: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2e10: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2e20: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2e30: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2e40: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2e60: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2e70: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2e80: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
2e90: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
2ea0: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
2eb0: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
2ec0: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
2ed0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2ee0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2ef0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
2f00: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
2f10: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
2f20: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2f30: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
2f40: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2f50: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2f60: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2f70: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2f80: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2f90: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2fa0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2fb0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2fc0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2fd0: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2fe0: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
2ff0: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
3000: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
3010: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
3020: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
3030: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
3040: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
3050: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
3060: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
3070: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3080: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3090: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
30a0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
30b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
30c0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
30d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
30f0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3110: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
3120: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3130: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
3140: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
3150: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3160: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3170: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3180: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3190: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
31a0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
31b0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
31c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
31d0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
31e0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
31f0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3200: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3210: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3220: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3230: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3240: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
3250: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3270: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
3280: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
3290: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
32a0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
32b0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
32c0: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
32d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
32e0: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
32f0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3300: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
3310: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3320: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3330: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
3340: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
3350: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3360: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3370: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3380: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3390: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
33a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33b0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
33c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
33d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
33e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
33f0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3400: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3410: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69  nt((v, "# skip i
3420: 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64  ndistinct record
3430: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3440: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3450: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
3460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3480: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3490: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   0);.    if( pOr
34a0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
34b0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
34c0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69   p, iContinue, i
34d0: 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Break, nColumn);
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
34f0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
3500: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
3510: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
3520: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
3530: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
3540: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
3550: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3560: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3570: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
3580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3590: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
35a0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
35b0: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
35c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
35e0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
35f0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3600: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3610: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
3620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3630: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3640: 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tStrKey, iParm, 
3650: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
3660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3670: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
3680: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
3690: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
36a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
36b0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
36c0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
36d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
36f0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3700: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
3710: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3720: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
3730: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
3740: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
3750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
3760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3770: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
3780: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37a0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
37b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
37c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
37d0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
37e0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
37f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3800: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3810: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
3820: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
3830: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
3840: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
3850: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
3860: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
3870: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
3880: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
3890: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
38a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
38b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
38c0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
38d0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
38e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
38f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3900: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3910: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
3920: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
3930: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3940: 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP3(v, -1, aff,
3950: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
3960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3970: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
3980: 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b  nd, iParm, addr+
3990: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
39a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
39b0: 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  _Delete, iParm, 
39c0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
39d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
39e0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
39f0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
3a00: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
3a10: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
3a20: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
3a30: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
3a40: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
3a50: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
3a60: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
3a70: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
3a80: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
3a90: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
3aa0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
3ab0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
3ac0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
3ad0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
3ae0: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
3af0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
3b00: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
3b10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b20: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3b30: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3b40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3b60: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
3b70: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3b90: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3ba0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3bb0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3bc0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3bd0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3bf0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69 50    char aff = (iP
3c00: 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20  arm>>16)&0xFF;. 
3c10: 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
3c20: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3c30: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
3c40: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
3c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c60: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
3c70: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
3c80: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 1);.        s
3c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3ca0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3cb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3cd0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3ce0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3cf0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d10: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3d20: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3d30: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3d60: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3d70: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3d80: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3d90: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3da0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3db0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3dc0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3dd0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3de0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3df0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3e00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
3e10: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
3e20: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3e30: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3e40: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3e50: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3e60: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3e70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3e90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3ea0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
3eb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
3ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ed0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3ee0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3f00: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3f10: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3f20: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3f30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f40: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3f50: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3f60: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f70: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3f90: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3fa0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3fb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3fc0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fd0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fe0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4000: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4010: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4020: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4030: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
4040: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4050: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4060: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
4070: 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  oke a subroutine
4080: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72   to handle the r
4090: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62  esults.  The sub
40a0: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20  routine itself. 
40b0: 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73     ** is respons
40c0: 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67  ible for popping
40d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66   the results off
40e0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
40f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4100: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
4110: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4120: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4140: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4150: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4160: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4170: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
4180: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
41a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
41b0: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
41c0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
41d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
41e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
41f0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
4200: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4210: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4220: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4230: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4240: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4250: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4260: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4270: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4280: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4290: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
42a0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
42b0: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
42c0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
42d0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
42e0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
42f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4300: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4310: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4320: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4330: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4340: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4360: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4370: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
4380: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
4390: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
43a0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
43b0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
43c0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
43d0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
43e0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
43f0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4400: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4410: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4420: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4430: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4440: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
4450: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
4460: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
4470: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
44a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
44b0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
44c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
44d0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
44e0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
44f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4500: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4510: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4520: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4530: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4540: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
4550: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
4560: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
4570: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
4580: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
4590: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
45a0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
45b0: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
45c0: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
45d0: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
45e0: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
45f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4600: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4610: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4620: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4630: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4640: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
4650: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4660: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
4670: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4680: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4690: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
46a0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
46b0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
46c0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c  pOrderBy;.  nCol
46d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
46e0: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
46f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4700: 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f  of(*pInfo) + nCo
4710: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
4720: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
4730: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
4740: 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  n;.  pInfo->aSor
4750: 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29  tOrder = (char*)
4760: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43  &pInfo->aColl[nC
4770: 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46  ol];.  pInfo->nF
4780: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66  ield = nCol;.  f
4790: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
47a0: 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  i++){.    /* If 
47b0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
47c0: 65 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69  ence was specifi
47d0: 65 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68  ed explicity, th
47e0: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  en it.    ** is 
47f0: 73 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72  stored in pOrder
4800: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20  By->a[i].zName. 
4810: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
4820: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  he default.    *
4830: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
4840: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
4850: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
4860: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
4880: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
4890: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
48a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e  r);.    if( !pIn
48b0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
48c0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
48d0: 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c  ll[i] = db->pDfl
48e0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
48f0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4900: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
4910: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
4920: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4930: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  dbeOp3(v, OP_Sor
4940: 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  t, 0, 0, (char*)
4950: 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  pInfo, P3_KEYINF
4960: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64  O_HANDOFF);.  ad
4970: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4980: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4990: 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Next, 0, end1);.
49a0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
49b0: 20 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20   p, addr, end2, 
49c0: 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  1);.  switch( eD
49d0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
49e0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
49f0: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
4a00: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
4a10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a20: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72  P_NewRecno, iPar
4a30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
4a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4a50: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4a60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4a80: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
4a90: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4ab0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
4ac0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
4ad0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
4ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4af0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
4b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4b10: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4b30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4b40: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
4b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4b60: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
4b70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4b80: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
4b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4ba0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4bb0: 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33  d, 1, 0, "n", P3
4bc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4be0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
4bf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c10: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28   OP_PutStrKey, (
4c20: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
4c30: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
4c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4c50: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
4c60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4c70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c90: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
4ca0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
4cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cc0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4cd0: 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62  , end1);.      b
4ce0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4cf0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
4d00: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
4d10: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
4d20: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d40: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
4d50: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
4d60: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
4d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4d80: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4d90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4da0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
4db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4dc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4dd0: 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29  Column, -1-i, i)
4de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4df0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
4e00: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
4e10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e20: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4e30: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4e40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
4e70: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4ea0: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
4eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ec0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4ed0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
4ee0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
4ef0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f10: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4f20: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
4f30: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4f40: 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73  el(v, end2);.  s
4f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f60: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4f70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
4f80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
4f90: 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nd1);.  sqlite3V
4fa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4fb0: 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b  ortReset, 0, 0);
4fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4fd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4fe0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
4ff0: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
5000: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
5010: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
5020: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
5030: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
5040: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
5050: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  caller..**.** If
5060: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
5070: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
5080: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
5090: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
50a0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69   from.** the ori
50b0: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
50c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
50d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
50e0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a  s a column..** .
50f0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
5100: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65  on type for an e
5110: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74  xpression is eit
5120: 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49  her TEXT, NUMERI
5130: 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65  C or ANY..** The
5140: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
5150: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
5160: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a  eld is INTEGER..
5170: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5180: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
5190: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
51a0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
51b0: 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
51c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
51d0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Type;.  int j;. 
51e0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
51f0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72   pTabList==0 ) r
5200: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 71 6c 69  eturn 0;..  sqli
5210: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
5220: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
5230: 4c 69 73 74 2c 20 30 2c 20 70 45 78 70 72 2c 20  List, 0, pExpr, 
5240: 31 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  1, 0);.  switch(
5250: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
5260: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
5270: 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  : {.      Table 
5280: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  *pTab;.      int
5290: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
52a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
52b0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
52c0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
52d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
52e0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
52f0: 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61  ; j++){}.      a
5300: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
5310: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
5320: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
5330: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
5340: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
5350: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
5360: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
5370: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
5380: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5390: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
53a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
53b0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
53c0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
53d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
53e0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
53f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
5400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5410: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5420: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
5430: 20 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20   {.      Select 
5440: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
5450: 6c 65 63 74 3b 0a 20 20 20 20 20 20 7a 54 79 70  lect;.      zTyp
5460: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 70  e = columnType(p
5470: 50 61 72 73 65 2c 20 70 53 2d 3e 70 53 72 63 2c  Parse, pS->pSrc,
5480: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30   pS->pEList->a[0
5490: 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20 20 20 20  ].pExpr); .     
54a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
54b0: 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20 20    case TK_AS:.  
54c0: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53      /* The TK_AS
54d0: 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e   operator can on
54e0: 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45  ly occur in ORDE
54f0: 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20  R BY, GROUP BY, 
5500: 48 41 56 49 4e 47 2c 0a 20 20 20 20 20 20 2a 2a  HAVING,.      **
5510: 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73   and LIMIT claus
5520: 65 73 2e 20 20 42 75 74 20 70 45 78 70 72 20 6f  es.  But pExpr o
5530: 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
5540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5550: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
5560: 2e 20 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20  .  So pExpr can 
5570: 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e  never contain an
5580: 20 41 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   AS operator..  
5590: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
55a0: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 20 20  ert( 0 );.      
55b0: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
55c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
55d0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
55e0: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
55f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
5600: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5610: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5620: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
5630: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
5640: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5650: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
5660: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
5670: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
5680: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5690: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
56a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
56b0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
56c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
56d0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
56e0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
56f0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5700: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5710: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5720: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5730: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  e;.  int i;.  fo
5740: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
5750: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5760: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
5770: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5780: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5790: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
57a0: 70 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  pe(pParse, pTabL
57b0: 69 73 74 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ist, p);.    if(
57c0: 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74   zType==0 ) cont
57d0: 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68 65  inue;.    /* The
57e0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
57f0: 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66  it's own copy of
5800: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
5810: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a 20  , in case the . 
5820: 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20     ** schema is 
5830: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
5840: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
5850: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
5860: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
5870: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
5880: 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  , i+pEList->nExp
5890: 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e  r, zType, strlen
58a0: 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a  (zType));.  }.}.
58b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
58c0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
58d0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
58e0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
58f0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
5900: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
5910: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
5920: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
5930: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
5940: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
5950: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5960: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
5970: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
5980: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
5990: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
59a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
59b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
59c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
59d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
59e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
59f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5a00: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5a10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5a20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5a30: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
5a40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5a50: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
5a60: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
5a70: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5a80: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
5a90: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
5aa0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
5ab0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
5ac0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
5ad0: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
5ae0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
5af0: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
5b00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
5b10: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5b20: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
5b30: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
5b40: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
5b50: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
5b60: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
5b70: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
5b80: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5b90: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
5ba0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
5bb0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
5bc0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
5bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
5be0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
5bf0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
5c00: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
5c10: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
5c20: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
5c30: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
5c40: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
5c50: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5c60: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
5c70: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
5c80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
5c90: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61  olName(v, i, zNa
5ca0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
5cb0: 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ));.      contin
5cc0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
5cd0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
5ce0: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
5cf0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
5d00: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
5d10: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
5d20: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
5d30: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
5d40: 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; j<pTabList->n
5d50: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
5d60: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
5d70: 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d  ->iTable; j++){}
5d80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
5d90: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
5da0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
5db0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
5dc0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
5dd0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
5de0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
5df0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
5e00: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
5e10: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
5e20: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
5e30: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
5e40: 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44    zCol = "_ROWID
5e50: 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _";.      }else{
5e60: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
5e70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5e80: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
5e90: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
5ea0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
5eb0: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
5ec0: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
5ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5ee0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
5ef0: 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e  e(v, i, p->span.
5f00: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
5f10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
5f20: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
5f30: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
5f40: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
5f50: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5f60: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
5f70: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
5f80: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5f90: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
5fa0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
5fb0: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
5fc0: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
5fd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
5fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
5ff0: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
6000: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
6010: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6020: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
6030: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33  (v, i, zName, P3
6040: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
6050: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6060: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6070: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c  lName(v, i, zCol
6080: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6090: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
60a0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
60b0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
60c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
60d0: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
60e0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
60f0: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
6100: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
6110: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
6120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6130: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
6140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6150: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
6160: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
6170: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
6180: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
6190: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
61a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
61b0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
61c0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
61d0: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
61e0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
61f0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
6200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  ;.}../*.** Name 
6210: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
6220: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
6230: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
6240: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
6250: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
6260: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
6270: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
6280: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
6290: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
62a0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
62b0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
62c0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
62d0: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
62e0: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
62f0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
6300: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
6310: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
6320: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
6330: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
6340: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
6350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
6360: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
6370: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
6380: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
6390: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a  electStmt(Parse*
63a0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
63b0: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
63c0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
63d0: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
63e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
63f0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
6400: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
6410: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
6420: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
6430: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
6440: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
6450: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
6460: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
6470: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
6480: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
6490: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f  st *pEList;.  Co
64a0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
64b0: 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65  l;..  if( prepSe
64c0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
64d0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
64e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
64f0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61   pTab = sqliteMa
6500: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
6510: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
6520: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
6530: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
6540: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
6550: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
6560: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
6570: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
6580: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
6590: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
65a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
65b0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
65c0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
65d0: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
65e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
65f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
6600: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
6610: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
6620: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
6630: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
6640: 20 20 20 45 78 70 72 20 2a 70 52 3b 0a 20 20 20     Expr *pR;.   
6650: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
6660: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
6670: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
6680: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
6690: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
66a0: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e  pRight==0 || p->
66b0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d  pRight->token.z=
66c0: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
66d0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29  >token.z[0]!=0 )
66e0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
66f0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
6700: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
6710: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
6720: 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a  eStrDup(zName);.
6730: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6740: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
6750: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
6760: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
6770: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
6780: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
6790: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ] ){.      int c
67a0: 6e 74 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  nt;.      zName 
67b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
67c0: 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65  ("%T", &pR->toke
67d0: 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  n);.      for(j=
67e0: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
67f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
6800: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
6810: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
6820: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
6830: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
6840: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
6850: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
6860: 50 72 69 6e 74 66 28 22 25 54 5f 25 64 22 2c 20  Printf("%T_%d", 
6870: 26 70 52 2d 3e 74 6f 6b 65 6e 2c 20 2b 2b 63 6e  &pR->token, ++cn
6880: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20  t);.          j 
6890: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = -1;.        }.
68a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
68b0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
68c0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
68d0: 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
68e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
68f0: 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b  "%T", &p->span);
6900: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6910: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6920: 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e  3MPrintf("column
6930: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
6940: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
6950: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
6960: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
6970: 61 6d 65 3b 0a 0a 20 20 20 20 7a 54 79 70 65 20  ame;..    zType 
6980: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63  = sqliteStrDup(c
6990: 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65  olumnType(pParse
69a0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20  , pSelect->pSrc 
69b0: 2c 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ,p));.    pCol->
69c0: 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20  zType = zType;. 
69d0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
69e0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
69f0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 69 66 28 20  UMERIC;.    if( 
6a00: 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 70  zType ){.      p
6a10: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
6a20: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
6a30: 79 70 65 28 7a 54 79 70 65 2c 20 73 74 72 6c 65  ype(zType, strle
6a40: 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 20 20 7d  n(zType));.    }
6a50: 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  .    pCol->pColl
6a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6a70: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
6a80: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 2d  ;.    if( !pCol-
6a90: 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >pColl ){.      
6aa0: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6ab0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6ac0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oll;.    }.  }. 
6ad0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
6ae0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
6af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
6b00: 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  re a SELECT stat
6b10: 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
6b20: 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68  sing by doing th
6b30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  e following.** t
6b40: 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  hings:.**.**    
6b50: 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
6b60: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
6b70: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
6b80: 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
6b90: 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
6ba0: 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
6bb0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
6bc0: 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
6bd0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
6be0: 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
6bf0: 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
6c00: 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
6c10: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
6c20: 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
6c30: 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
6c40: 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
6c50: 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
6c60: 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
6c70: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
6c80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
6c90: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
6ca0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
6cb0: 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
6cc0: 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
6cd0: 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
6ce0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
6cf0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
6d00: 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
6d10: 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
6d20: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
6d30: 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
6d40: 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
6d50: 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
6d60: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
6d70: 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
6d80: 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
6d90: 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
6da0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
6db0: 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
6dc0: 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
6dd0: 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
6de0: 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
6df0: 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
6e00: 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
6e10: 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
6e20: 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
6e30: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
6e40: 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
6e50: 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
6e60: 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
6e70: 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
6e80: 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
6e90: 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
6ea0: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
6eb0: 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
6ec0: 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
6ed0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
6ee0: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
6ef0: 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
6f00: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
6f10: 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a   in TABLE..**.**
6f20: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
6f30: 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20  cess.  If there 
6f40: 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65  are problems, le
6f50: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
6f60: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
6f70: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
6f80: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
6f90: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
6fa0: 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  tmt(Parse *pPars
6fb0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
6fc0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
6fd0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
6fe0: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
6ff0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
7000: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72 75  le *pTab;.  stru
7010: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7020: 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70  *pFrom;..  if( p
7030: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
7040: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
7050: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
7060: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
7070: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
7080: 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
7090: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
70a0: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
70b0: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
70c0: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
70d0: 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
70e0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
70f0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
7100: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
7110: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b  Parse, p->pSrc);
7120: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
7130: 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
7140: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7150: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
7160: 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
7170: 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
7180: 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
7190: 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
71a0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
71b0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
71c0: 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
71d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
71e0: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
71f0: 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
7200: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
7210: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
7220: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
7230: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
7240: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
7250: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
7260: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
7270: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
7280: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
7290: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
72a0: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
72b0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
72c0: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
72d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
72e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
72f0: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ->zName==0 ){.  
7300: 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
7310: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
7320: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
7330: 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
7340: 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
7350: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
7360: 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d  ( pFrom->zAlias=
7370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
7380: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20  rom->zAlias =.  
7390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
73a0: 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73  Printf("sqlite_s
73b0: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
73c0: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
73d0: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
73e0: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
73f0: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
7400: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
7410: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
7420: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
7430: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
7440: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
7450: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
7460: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7470: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
7480: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
7490: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
74a0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
74b0: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
74c0: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
74d0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
74e0: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
74f0: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
7500: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
7510: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
7520: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
7530: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
7540: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
7550: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
7560: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
7570: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
7580: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
7590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
75a0: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
75b0: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
75c0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
75d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
75e0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
75f0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
7600: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
7610: 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e  e(pParse,pFrom->
7620: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
7630: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
7640: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7650: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7670: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
7680: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
7690: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
76a0: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
76b0: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
76c0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
76d0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
76e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
76f0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
7700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7720: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
7730: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
7740: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
7750: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
7760: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
7770: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
7780: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
7790: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
77a0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
77b0: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
77c0: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
77d0: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
77e0: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
77f0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
7800: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
7810: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
7820: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
7830: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
7840: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7850: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
7860: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
7870: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7880: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
7890: 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
78a0: 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
78b0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
78c0: 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
78d0: 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65   if( sqliteProce
78e0: 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
78f0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
7900: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
7910: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
7920: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
7930: 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
7940: 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
7950: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
7960: 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
7970: 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
7980: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
7990: 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
79a0: 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
79b0: 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
79c0: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
79d0: 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
79e0: 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
79f0: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
7a00: 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
7a10: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
7a20: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
7a30: 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
7a40: 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
7a50: 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
7a60: 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
7a70: 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
7a80: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
7a90: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7aa0: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
7ab0: 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
7ac0: 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
7ad0: 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
7ae0: 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
7af0: 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
7b00: 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
7b10: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
7b20: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
7b30: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7b40: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
7b50: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
7b60: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
7b70: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
7b80: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
7b90: 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70   pE->pRight && p
7ba0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
7bb0: 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26  K_ALL.         &
7bc0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70  & pE->pLeft && p
7bd0: 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
7be0: 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _ID ) break;.  }
7bf0: 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  .  rc = 0;.  if(
7c00: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
7c10: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
7c20: 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
7c30: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
7c40: 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
7c50: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
7c60: 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
7c70: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
7c80: 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
7c90: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
7ca0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
7cb0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
7cc0: 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
7cd0: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
7ce0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
7cf0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7d00: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
7d10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
7d20: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
7d30: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
7d40: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
7d50: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
7d60: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
7d70: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
7d80: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
7d90: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
7da0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
7db0: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
7dc0: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
7dd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
7de0: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
7df0: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
7e00: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
7e10: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
7e20: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
7e30: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
7e40: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
7e50: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
7e60: 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
7e70: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
7e80: 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
7e90: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
7ea0: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
7eb0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
7ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ed0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
7ee0: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
7ef0: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
7f00: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
7f10: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
7f20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7f30: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
7f40: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
7f50: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
7f60: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
7f70: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
7f80: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
7f90: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
7fa0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
7fb0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
7fc0: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
7fd0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
7fe0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7ff0: 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74  Token(&pE->pLeft
8000: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
8010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8020: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
8030: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8040: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
8050: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
8060: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
8070: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
8080: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
8090: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
80a0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
80b0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
80c0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
80d0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
80e0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
80f0: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
8100: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
8110: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
8120: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8130: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
8140: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
8150: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
8160: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
8170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8180: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
8190: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
81a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
81b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
81c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
81d0: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
81e0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
81f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
8200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
8210: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65  xpr *pExpr, *pLe
8220: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
8230: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
8240: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
8250: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
8260: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
8270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8280: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
8290: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
82a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
82b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
82c0: 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e  if( (pLeft->join
82d0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
82e0: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
8310: 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  ft->pTab, zName)
8320: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
8330: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
8340: 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
8350: 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
8360: 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8380: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
8390: 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ht */.          
83a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
83d0: 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
83e0: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69  ndex(pLeft->pUsi
83f0: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
8400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8410: 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
8420: 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
8430: 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
8440: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
8450: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
8460: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
8470: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
8480: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
8490: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
84a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
84b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
84c0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
84d0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
84e0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8500: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
8510: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8520: 73 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74  setToken(&pRight
8530: 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b  ->token, zName);
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8550: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54 61   zTabName && pTa
8560: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
8570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8580: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8590: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
85a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
85b0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
85c0: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c  3Expr(TK_DOT, pL
85d0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
85e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
85f0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72  f( pExpr==0 ) br
8600: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8610: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65     setToken(&pLe
8620: 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e  ft->token, zTabN
8630: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
8640: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45      setToken(&pE
8650: 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74  xpr->span, sqlit
8660: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73  e3MPrintf("%s.%s
8670: 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
8680: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
8690: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
86a0: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  dyn = 1;.       
86b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
86c0: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20  ken.z = 0;.     
86d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
86e0: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20  token.n = 0;.   
86f0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8700: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
8710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
8720: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8730: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
8740: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8750: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
8760: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
8770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8780: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
8790: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
87a0: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
87b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
87c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
87d0: 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
87e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
87f0: 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
8800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8820: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
8830: 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
8840: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8850: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8860: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8870: 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
8880: 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
8890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
88a0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
88b0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
88c0: 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20  eFree(zTName);. 
88d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
88e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
88f0: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
8900: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
8910: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
8920: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8930: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63  This routine rec
8940: 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73  ursively unlinks
8950: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
8960: 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65  .a[].pTab pointe
8970: 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63  rs.** in a selec
8980: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  t structure.  It
8990: 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70   just sets the p
89a0: 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e  ointers to NULL.
89b0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
89c0: 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69  e is recursive i
89d0: 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
89e0: 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70   if the Select.p
89f0: 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a  Src.a[].pSelect.
8a00: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ** pointer is no
8a10: 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75  t NULL, this rou
8a20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
8a30: 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
8a40: 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  at pointer..**.*
8a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8a60: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
8a70: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
8a80: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a   that defines a.
8a90: 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72  ** VIEW in order
8aa0: 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e   to undo any bin
8ab0: 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e  dings to tables.
8ac0: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
8ad0: 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ary.** because t
8ae0: 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68  hose tables migh
8af0: 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61  t be DROPed by a
8b00: 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20   subsequent SQL 
8b10: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74  command..** If t
8b20: 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20  he bindings are 
8b30: 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65  not removed, the
8b40: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
8b50: 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  c->a[].pTab fiel
8b60: 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66  d.** will be lef
8b70: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
8b80: 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c  deallocated Tabl
8b90: 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65  e structure afte
8ba0: 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e  r the.** DROP an
8bb0: 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c  d a coredump wil
8bc0: 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74  l occur the next
8bd0: 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20 69   time the VIEW i
8be0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  s used..*/.void 
8bf0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
8c00: 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ind(Select *p){.
8c10: 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
8c20: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
8c30: 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
8c40: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8c50: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
8c60: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8c70: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  turn;.  for(i=0,
8c80: 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
8c90: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
8ca0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8cb0: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 49 74   if( (pTab = pIt
8cc0: 65 6d 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b 0a  em->pTab)!=0 ){.
8cd0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
8ce0: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
8cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
8d00: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
8d10: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
8d20: 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
8d30: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  0;.      if( pIt
8d40: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
8d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
8d60: 6c 65 63 74 55 6e 62 69 6e 64 28 70 49 74 65 6d  lectUnbind(pItem
8d70: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
8d80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
8d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8da0: 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65  ine associates e
8db0: 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44  ntries in an ORD
8dc0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
8dd0: 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f   list with.** co
8de0: 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c  lumns in a resul
8df0: 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44  t.  For each ORD
8e00: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
8e10: 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a  , the opcode of.
8e20: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
8e30: 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64   node is changed
8e40: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
8e50: 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61  d the iColumn va
8e60: 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  lue of.** the to
8e70: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
8e80: 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63  filled in with c
8e90: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
8ea0: 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76   the iTable.** v
8eb0: 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d  alue of the top-
8ec0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69  level node is fi
8ed0: 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65  lled with iTable
8ee0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
8ef0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70  * If there are p
8f00: 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75  rior SELECT clau
8f10: 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72  ses, they are pr
8f20: 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20  ocessed first.  
8f30: 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e  A match.** in an
8f40: 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20   earlier SELECT 
8f50: 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65  takes precedence
8f60: 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45   over a later SE
8f70: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  LECT..**.** Any 
8f80: 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20  entry that does 
8f90: 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61  not match is fla
8fa0: 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  gged as an error
8fb0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
8fc0: 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65   of errors is re
8fd0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
8fe0: 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72  c int matchOrder
8ff0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  byToColumn(.  Pa
9000: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9010: 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65        /* A place
9020: 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20   to leave error 
9030: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
9040: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
9050: 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
9060: 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  o result columns
9070: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
9080: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9090: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
90a0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c  The ORDER BY val
90b0: 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61  ues to match aga
90c0: 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  inst columns */.
90d0: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
90e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
90f0: 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69  ert this value i
9100: 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  n iTable */.  in
9110: 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20  t mustComplete  
9120: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45        /* If TRUE
9130: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d   all ORDER BYs m
9140: 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  ust match */.){.
9150: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
9160: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
9170: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
9180: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
9190: 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 || pOrderBy==0
91a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
91b0: 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  f( mustComplete 
91c0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
91d0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
91e0: 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42  r; i++){ pOrderB
91f0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
9200: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ; }.  }.  if( pr
9210: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
9220: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
9230: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9240: 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
9250: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
9260: 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79  if( matchOrderby
9270: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
9280: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
9290: 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  , pOrderBy, iTab
92a0: 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  le, 0) ){.      
92b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
92c0: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
92d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
92e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
92f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9300: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
9310: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
9320: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ].pExpr;.    int
9330: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
9340: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
9350: 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  i].done ) contin
9360: 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
9370: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
9380: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
9390: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30       if( iCol<=0
93a0: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
93b0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
93c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
93d0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
93e0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f      "ORDER BY po
93f0: 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64  sition %d should
9400: 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
9410: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
9420: 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
9430: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  Expr);.        n
9440: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Err++;.        b
9450: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9460: 20 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d      if( !mustCom
9470: 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65  plete ) continue
9480: 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a  ;.      iCol--;.
9490: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
94a0: 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70  0; iCol<0 && j<p
94b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
94c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
94d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
94e0: 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   && (pE->op==TK_
94f0: 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b  ID || pE->op==TK
9500: 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20  _STRING) ){.    
9510: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
9520: 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20   *zLabel;.      
9530: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
9540: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
9550: 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73        zLabel = s
9560: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
9570: 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b  ken(&pE->token);
9580: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9590: 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20   zLabel!=0 );.  
95a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
95b0: 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
95c0: 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20  zLabel)==0 ){ . 
95d0: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
95e0: 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
95f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9600: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
9610: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9620: 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
9630: 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69  Compare(pE, pELi
9640: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20  st->a[j].pExpr) 
9650: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20  ){.        iCol 
9660: 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = j;.      }.   
9670: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
9680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e  =0 ){.      pE->
9690: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
96a0: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
96b0: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
96c0: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
96d0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  ble;.      pOrde
96e0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
96f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
9700: 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74  ( iCol<0 && must
9710: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
9720: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9730: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9740: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
9750: 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20   number %d does 
9760: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
9770: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b  sult column", i+
9780: 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  1);.      nErr++
9790: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
97a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
97b0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
97c0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
97d0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
97e0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
97f0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
9800: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
9810: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9820: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
9830: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
9840: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
9850: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
9860: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
9870: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
9880: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9890: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
98a0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
98b0: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
98c0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
98d0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
98e0: 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn v;.}../*.** C
98f0: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
9900: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
9910: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
9920: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
9930: 2a 2a 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f  ** nLimit and nO
9940: 66 66 73 65 74 20 66 69 65 6c 64 73 2e 20 20 6e  ffset fields.  n
9950: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9960: 74 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67  t hold the integ
9970: 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ers.** that appe
9980: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
9990: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
99a0: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
99b0: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
99c0: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 74 68 61  eywords.  Or tha
99d0: 74 20 68 6f 6c 64 20 2d 31 20 61 6e 64 20 30 20  t hold -1 and 0 
99e0: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
99f0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a  s are omitted..*
9a00: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
9a10: 66 73 65 74 20 61 72 65 20 74 68 65 20 69 6e 74  fset are the int
9a20: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
9a30: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
9a40: 0a 2a 2a 20 63 6f 75 6e 74 65 72 73 20 75 73 65  .** counters use
9a50: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
9a60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
9a70: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
9a80: 6e 6f 0a 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 2f  no.** limit and/
9a90: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
9aa0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9ab0: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
9ac0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9ad0: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
9ae0: 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74  values if iLimit
9af0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
9b00: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
9b10: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
9b20: 69 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61  ined by nLimit a
9b30: 6e 64 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd nOffset.  iLi
9b40: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
9b50: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
9b60: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
9b70: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
9b80: 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75  t values.** (usu
9b90: 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77  ally but not alw
9ba0: 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f  ays -1) prior to
9bb0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
9bc0: 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69  utine..** Only i
9bd0: 66 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e  f nLimit>=0 or n
9be0: 4f 66 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20  Offset>0 do the 
9bf0: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
9c00: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
9c10: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
9c20: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
9c30: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
9c40: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
9c50: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
9c60: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
9c70: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
9c80: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
9c90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
9ca0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
9cb0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
9cc0: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
9cd0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
9ce0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 49 66 20 74 68    /* .  ** If th
9cf0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
9d00: 70 2d 3e 6e 4c 69 6d 69 74 3e 30 20 74 68 65 6e  p->nLimit>0 then
9d10: 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 73   "LIMIT 0" shows
9d20: 0a 20 20 2a 2a 20 61 6c 6c 20 72 6f 77 73 2e 20  .  ** all rows. 
9d30: 20 49 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   It is the same 
9d40: 61 73 20 6e 6f 20 6c 69 6d 69 74 2e 20 49 66 20  as no limit. If 
9d50: 74 68 65 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  the comparision 
9d60: 69 73 0a 20 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69  is.  ** p->nLimi
9d70: 74 3e 3d 30 20 74 68 65 6e 20 22 4c 49 4d 49 54  t>=0 then "LIMIT
9d80: 20 30 22 20 73 68 6f 77 20 6e 6f 20 72 6f 77 73   0" show no rows
9d90: 20 61 74 20 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c   at all..  ** "L
9da0: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
9db0: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
9dc0: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
9dd0: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
9de0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
9df0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
9e00: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
9e10: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
9e20: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
9e30: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
9e40: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
9e50: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
9e60: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->nLimit>=0 ){
9e70: 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
9e80: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
9e90: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
9ea0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9eb0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
9ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
9ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9ee0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9ef0: 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b   -p->nLimit, 0);
9f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9f10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
9f20: 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  tore, iMem, 1);.
9f30: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
9f40: 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75  (v, "# LIMIT cou
9f50: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e  nter"));.    p->
9f60: 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  iLimit = iMem;. 
9f70: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66   }.  if( p->nOff
9f80: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  set>0 ){.    int
9f90: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
9fa0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65  nMem++;.    Vdbe
9fb0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
9fc0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
9fd0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
9fe0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
9ff0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a000: 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66  Integer, -p->nOf
a010: 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  fset, 0);.    sq
a020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a030: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
a040: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
a050: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
a060: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
a070: 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  );.    p->iOffse
a080: 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a  t = iMem;.  }.}.
a090: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a0a0: 56 44 42 45 20 69 6e 73 74 72 75 63 74 69 6f 6e  VDBE instruction
a0b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 6f 70 65 6e  s that will open
a0c0: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
a0d0: 6c 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  le that.** will 
a0e0: 62 65 20 75 73 65 64 20 66 6f 72 20 61 6e 20 69  be used for an i
a0f0: 6e 64 65 78 20 6f 72 20 74 6f 20 73 74 6f 72 65  ndex or to store
a100: 20 6b 65 79 65 64 20 72 65 73 75 6c 74 73 20 66   keyed results f
a110: 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  or a compound.**
a120: 20 73 65 6c 65 63 74 2e 20 20 49 6e 20 6f 74 68   select.  In oth
a130: 65 72 20 77 6f 72 64 73 2c 20 6f 70 65 6e 20 61  er words, open a
a140: 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
a150: 20 74 68 61 74 20 6e 65 65 64 73 20 61 0a 2a 2a   that needs a.**
a160: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
a170: 72 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  re.  The number 
a180: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
a190: 65 20 4b 65 79 49 6e 66 6f 20 69 73 20 64 65 74  e KeyInfo is det
a1a0: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
a1b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
a1c0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
a1d0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 73 65 63 6f  ment in the seco
a1e0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
a1f0: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
a200: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a210: 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20   called to open 
a220: 61 6e 20 69 6e 64 65 78 20 74 61 62 6c 65 20 66  an index table f
a230: 6f 72 0a 2a 2a 20 44 49 53 54 49 4e 43 54 2c 20  or.** DISTINCT, 
a240: 55 4e 49 4f 4e 2c 20 49 4e 54 45 52 53 45 43 54  UNION, INTERSECT
a250: 20 61 6e 64 20 45 58 43 45 50 54 20 73 65 6c 65   and EXCEPT sele
a260: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 28 62  ct statements (b
a270: 75 74 20 6e 6f 74 20 0a 2a 2a 20 55 4e 49 4f 4e  ut not .** UNION
a280: 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b   ALL)..**.** Mak
a290: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
a2a0: 61 20 4b 65 79 41 73 44 61 74 61 20 74 61 62 6c  a KeyAsData tabl
a2b0: 65 20 69 66 20 6b 65 79 41 73 44 61 74 61 20 69  e if keyAsData i
a2c0: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s true..**.** Th
a2d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a2e0: 20 69 73 20 74 68 65 20 61 64 64 72 65 73 73 20   is the address 
a2f0: 6f 66 20 74 68 65 20 4f 50 5f 4f 70 65 6e 54 65  of the OP_OpenTe
a300: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  mp instruction..
a310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
a320: 65 6e 54 65 6d 70 49 6e 64 65 78 28 50 61 72 73  enTempIndex(Pars
a330: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
a340: 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20  t *p, int iTab, 
a350: 69 6e 74 20 6b 65 79 41 73 44 61 74 61 29 7b 0a  int keyAsData){.
a360: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
a370: 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  nfo;.  int nColu
a380: 6d 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  mn;.  sqlite3 *d
a390: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a3a0: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20    int i;.  Vdbe 
a3b0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a3c0: 62 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  be;.  int addr;.
a3d0: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
a3e0: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29  tStmt(pParse, p)
a3f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a400: 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ;.  }.  nColumn 
a410: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
a420: 70 72 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  pr;.  pKeyInfo =
a430: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
a440: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
a450: 2b 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28  +nColumn*sizeof(
a460: 43 6f 6c 6c 53 65 71 2a 29 20 29 3b 0a 20 20 69  CollSeq*) );.  i
a470: 66 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  f( pKeyInfo==0 )
a480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4b 65   return 0;.  pKe
a490: 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64 62 2d  yInfo->enc = db-
a4a0: 3e 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  >enc;.  pKeyInfo
a4b0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75  ->nField = nColu
a4c0: 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  mn;.  for(i=0; i
a4d0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
a4e0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
a4f0: 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
a500: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
a510: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
a520: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
a530: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61  if( !pKeyInfo->a
a540: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
a550: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
a560: 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  [i] = db->pDfltC
a570: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oll;.    }.  }. 
a580: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a590: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
a5a0: 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20  nTemp, iTab, 0, 
a5b0: 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b  .      (char*)pK
a5c0: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
a5d0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
a5e0: 66 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a  f( keyAsData ){.
a5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a600: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
a610: 44 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a  Data, iTab, 1);.
a620: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
a630: 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  r;.}..#ifndef SQ
a640: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a650: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
a660: 41 64 64 20 74 68 65 20 61 64 64 72 65 73 73 20  Add the address 
a670: 22 61 64 64 72 22 20 74 6f 20 74 68 65 20 73 65  "addr" to the se
a680: 74 20 6f 66 20 61 6c 6c 20 4f 70 65 6e 54 65 6d  t of all OpenTem
a690: 70 20 6f 70 63 6f 64 65 20 61 64 64 72 65 73 73  p opcode address
a6a0: 65 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 62  es.** that are b
a6b0: 65 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65 64  eing accumulated
a6c0: 20 69 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d   in p->ppOpenTem
a6d0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
a6e0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
a6f0: 54 65 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20  TempAddr(Select 
a700: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
a710: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
a720: 20 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20   *p->ppOpenTemp 
a730: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  = sqlite3IdListA
a740: 70 70 65 6e 64 28 2a 70 2d 3e 70 70 4f 70 65 6e  ppend(*p->ppOpen
a750: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  Temp, 0);.  if( 
a760: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a780: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  MEM;.  }.  pList
a790: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 2d 31  ->a[pList->nId-1
a7a0: 5d 2e 69 64 78 20 3d 20 61 64 64 72 3b 0a 20 20  ].idx = addr;.  
a7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a7c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a7d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a7e0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
a7f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a800: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
a810: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
a820: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
a830: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
a840: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
a850: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
a860: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
a870: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
a880: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
a890: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
a8a0: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
a8b0: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
a8c0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
a8d0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
a8e0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
a8f0: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
a900: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
a910: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
a920: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
a930: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
a940: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
a950: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
a960: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
a970: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
a980: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
a990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
a9a0: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
a9b0: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
a9c0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
a9d0: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
a9e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
a9f0: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
aa00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aa10: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
aa20: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
aa30: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
aa40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
aa50: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
aa60: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
aa70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
aa80: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
aa90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
aaa0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
aab0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aac0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
aad0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
aae0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
aaf0: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
ab00: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
ab10: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
ab20: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
ab30: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
ab40: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
ab50: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
ab60: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ab70: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
ab80: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
ab90: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
aba0: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
abb0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
abc0: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
abd0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
abe0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
abf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ac00: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
ac10: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
ac20: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ac30: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
ac40: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ac50: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
ac60: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ac70: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
ac80: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
ac90: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
aca0: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
acb0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
acc0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
acd0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
ace0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
acf0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
ad00: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
ad10: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
ad20: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
ad30: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
ad40: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ad50: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
ad60: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
ad70: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
ad80: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
ad90: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
adb0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
adc0: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
add0: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
ade0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
adf0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
ae00: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
ae10: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
ae20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ae30: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
ae40: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
ae50: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
ae60: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
ae70: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
ae80: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
ae90: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
aea0: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
aeb0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
aec0: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
aed0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
aee0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
aef0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
af00: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
af10: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
af20: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
af30: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
af40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
af50: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
af60: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
af70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
af80: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
af90: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
afa0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65  coded */.  int e
afb0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
afc0: 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20   /* \___  Store 
afd0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73  query results as
afe0: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20   specified */.  
aff0: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
b000: 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62        /* /     b
b010: 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61  y these two para
b020: 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20  meters.         
b030: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
b040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
b050: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
b060: 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
b070: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
b080: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b090: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
b0a0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
b0b0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
b0c0: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
b0d0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
b0e0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
b0f0: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
b100: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
b110: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
b120: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
b130: 73 20 56 44 42 45 20 2a 2f 0a 20 20 49 64 4c 69  s VDBE */.  IdLi
b140: 73 74 20 2a 70 4f 70 65 6e 54 65 6d 70 20 3d 20  st *pOpenTemp = 
b150: 30 3b 2f 2a 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  0;/* OP_OpenTemp
b160: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6e 65   opcodes that ne
b170: 65 64 20 61 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  ed a KeyInfo */.
b180: 20 20 69 6e 74 20 61 41 64 64 72 5b 35 5d 3b 20    int aAddr[5]; 
b190: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b1a0: 73 73 65 73 20 6f 66 20 53 65 74 4e 75 6d 43 6f  sses of SetNumCo
b1b0: 6c 75 6d 6e 73 20 6f 70 65 72 61 74 6f 72 73 20  lumns operators 
b1c0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 64 64 72 20 3d  */.  int nAddr =
b1d0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75   0;        /* Nu
b1e0: 6d 62 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 69  mber used */.  i
b1f0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
b200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b210: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
b220: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
b230: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
b240: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
b250: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
b260: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
b270: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
b280: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
b290: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
b2a0: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
b2b0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
b2c0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
b2d0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
b2e0: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
b2f0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
b300: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
b310: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
b320: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
b330: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
b340: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
b350: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b360: 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
b370: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
b380: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
b390: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
b3a0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
b3b0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
b3c0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b3d0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
b3e0: 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d  if( pPrior->nLim
b3f0: 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d  it>=0 || pPrior-
b400: 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20  >nOffset>0 ){.  
b410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b420: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
b430: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
b440: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
b450: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
b460: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
b470: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
b480: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
b490: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
b4a0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
b4b0: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
b4c0: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
b4d0: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
b4e0: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
b4f0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
b500: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
b510: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ( v==0 ){.    rc
b520: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
b530: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 2a 70  .  }..  /* If *p
b550: 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
b560: 68 74 2d 6d 6f 73 74 20 73 65 6c 65 63 74 20 73  ht-most select s
b570: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 69  tatement, then i
b580: 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 70  nitialize.  ** p
b590: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 74 6f 20  ->ppOpenTemp to 
b5a0: 70 6f 69 6e 74 20 74 6f 20 70 4f 70 65 6e 54 65  point to pOpenTe
b5b0: 6d 70 2e 20 20 49 66 20 2a 70 20 69 73 20 6e 6f  mp.  If *p is no
b5c0: 74 20 74 68 65 20 72 69 67 68 74 20 6d 6f 73 74  t the right most
b5d0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
b5e0: 74 68 65 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65  then p->ppOpenTe
b5f0: 6d 70 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  mp will have alr
b600: 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61  eady been initia
b610: 6c 69 7a 65 64 0a 20 20 2a 2a 20 62 79 20 61 20  lized.  ** by a 
b620: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
b630: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 64 75 72  is same procedur
b640: 65 2e 20 20 50 61 73 73 20 61 6c 6f 6e 67 20 74  e.  Pass along t
b650: 68 65 20 70 4f 70 65 6e 54 65 6d 70 0a 20 20 2a  he pOpenTemp.  *
b660: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 50 72  * pointer to pPr
b670: 69 6f 72 2c 20 74 68 65 20 6e 65 78 74 20 73 74  ior, the next st
b680: 61 74 65 6d 65 6e 74 20 74 6f 20 6f 75 72 20 6c  atement to our l
b690: 65 66 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eft..  */.  if( 
b6a0: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3d 3d 30  p->ppOpenTemp==0
b6b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 70 4f 70 65   ){.    p->ppOpe
b6c0: 6e 54 65 6d 70 20 3d 20 26 70 4f 70 65 6e 54 65  nTemp = &pOpenTe
b6d0: 6d 70 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  mp;.  }.  pPrior
b6e0: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70  ->ppOpenTemp = p
b6f0: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 0a 20  ->ppOpenTemp;.. 
b700: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
b710: 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
b720: 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
b730: 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
b740: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65  f( eDest==SRT_Te
b750: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61  mpTable ){.    a
b760: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
b770: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
b780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b790: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
b7a0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
b7b0: 6e 41 64 64 72 3d 3d 30 20 29 3b 0a 20 20 20 20  nAddr==0 );.    
b7c0: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
b7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b7e0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
b7f0: 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 30 29  lumns, iParm, 0)
b800: 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52  ;.    eDest = SR
b810: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
b820: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
b830: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
b840: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
b850: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
b860: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
b870: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
b880: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
b890: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
b8a0: 7b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  {.        pPrior
b8b0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c  ->nLimit = p->nL
b8c0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50  imit;.        pP
b8d0: 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d 20  rior->nOffset = 
b8e0: 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->nOffset;.    
b8f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b900: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b910: 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50  Prior, eDest, iP
b920: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  arm, 0, 0, 0, af
b930: 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
b940: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
b950: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
b960: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
b970: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
b980: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
b990: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
b9a0: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
b9b0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
b9c0: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
b9d0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69  ;.        p->nLi
b9e0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
b9f0: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
ba00: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
ba10: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ba20: 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
ba30: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61  Parm, 0, 0, 0, a
ba40: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff);.        p->
ba50: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
ba60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
ba70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
ba80: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ba90: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
baa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bab0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
bac0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
bad0: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
bae0: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
baf0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
bb00: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
bb10: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
bb20: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
bb30: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
bb40: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
bb50: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
bb60: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
bb70: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
bb80: 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20  int op = 0;     
bb90: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
bba0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
bbb0: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
bbc0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
bbd0: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
bbe0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
bbf0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
bc00: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
bc10: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e     int nLimit, n
bc20: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
bc30: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
bc40: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
bc50: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  set */.      Exp
bc60: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
bc70: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
bc80: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65  Y clause for the
bc90: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f   right SELECT */
bca0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
bcb0: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
bcc0: 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  = p->op==TK_ALL 
bcd0: 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52  ? SRT_Table : SR
bce0: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
bcf0: 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  f( eDest==priorO
bd00: 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79  p && p->pOrderBy
bd10: 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74  ==0 && p->nLimit
bd20: 3c 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74  <0 && p->nOffset
bd30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
bd40: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
bd50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bd60: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
bd70: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
bd80: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
bd90: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bda0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50     unionTab = iP
bdb0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
bdc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
bdd0: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
bde0: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
bdf0: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
be00: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
be10: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
be20: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
be30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
be40: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
be50: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Tab++;.        i
be60: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a  f( p->pOrderBy .
be70: 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68          && match
be80: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
be90: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
bea0: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
beb0: 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 1) ){.        
bec0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
bed0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bee0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
bef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
bf00: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
bf10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
bf20: 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  emp, unionTab, 0
bf30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
bf40: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
bf50: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
bf60: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65  ultiSelectOpenTe
bf70: 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b  mpAddr(p, addr);
bf80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
bf90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
bfb0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bfc0: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  d;.          }. 
bfd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bfe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bff0: 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e  KeyAsData, union
c000: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
c010: 20 7d 0a 09 61 73 73 65 72 74 28 20 6e 41 64 64   }..assert( nAdd
c020: 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f  r<sizeof(aAddr)/
c030: 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29  sizeof(aAddr[0])
c040: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 41 64 64   );.        aAdd
c050: 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c  r[nAddr++] = sql
c060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c070: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
c080: 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  s, unionTab, 0);
c090: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c0a0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
c0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c0c0: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
c0d0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
c0e0: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
c0f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c100: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c110: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
c120: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
c130: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
c140: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c150: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c160: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c170: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
c180: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
c190: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
c1a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
c1b0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
c1c0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
c1d0: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
c1e0: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
c1f0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
c200: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
c210: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
c220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
c230: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
c240: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
c250: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c260: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
c270: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72  r = 0;.      pOr
c280: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
c290: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
c2a0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
c2b0: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
c2c0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
c2d0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
c2e0: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
c2f0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
c300: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
c310: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c320: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c330: 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  , op, unionTab, 
c340: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c350: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
c360: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
c370: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
c380: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e  derBy;.      p->
c390: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
c3a0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
c3b0: 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  t = nOffset;.   
c3c0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d     p->iLimit = -
c3d0: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  1;.      p->iOff
c3e0: 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  set = -1;.      
c3f0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c400: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c410: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
c420: 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
c430: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
c440: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c450: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
c460: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
c470: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
c480: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
c490: 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
c4a0: 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72     if( eDest!=pr
c4b0: 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
c4c0: 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  b!=iParm ){.    
c4d0: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
c4e0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
c4f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c500: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
c510: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
c520: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
c530: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
c540: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
c550: 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  rse, 0, p->pELis
c560: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
c570: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
c580: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
c590: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
c5a0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
c5b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c5c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c5d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c5e0: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
c5f0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
c600: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
c610: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
c620: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74   p);.        iSt
c630: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
c640: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
c650: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
c660: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
c670: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
c680: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
c690: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
c6c0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
c6d0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
c700: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
c710: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c720: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
c730: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
c740: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c750: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
c770: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
c780: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
c790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c7a0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
c7b0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
c7c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c7d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
c7e0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
c7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c800: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
c810: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
c820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c830: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c840: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
c850: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
c860: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
c870: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
c880: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
c890: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
c8a0: 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
c8b0: 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ddr;..      /* I
c8c0: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
c8d0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
c8e0: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
c8f0: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
c900: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
c910: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
c920: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
c930: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
c940: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
c950: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
c960: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
c970: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
c980: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
c990: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
c9a0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
c9b0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
c9c0: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
c9d0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
c9e0: 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c  e,p,p->pOrderBy,
c9f0: 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20  tab1,1) ){.     
ca00: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
ca10: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ca20: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
ca30: 7d 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  }..      addr = 
ca40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
ca60: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
ca70: 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
ca80: 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c  tOpenTempAddr(p,
ca90: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 69 66   addr);.      if
caa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cab0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
cac0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
caf0: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
cb00: 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20  , tab1, 1);.    
cb10: 20 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c    assert( nAddr<
cb20: 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69  sizeof(aAddr)/si
cb30: 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29  zeof(aAddr[0]) )
cb40: 3b 0a 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41  ;.      aAddr[nA
cb50: 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  ddr++] = sqlite3
cb60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb70: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74  SetNumColumns, t
cb80: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
cb90: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cba0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
cbb0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
cbc0: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
cbd0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
cbe0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
cbf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
cc00: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
cc10: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
cc20: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
cc30: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
cc40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cc50: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
cc60: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
cc70: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
cc80: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
cc90: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
cca0: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
ccb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
ccc0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ccd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
cce0: 54 65 6d 70 2c 20 74 61 62 32 2c 20 30 29 3b 0a  Temp, tab2, 0);.
ccf0: 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69        rc = multi
cd00: 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64  SelectOpenTempAd
cd10: 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20  dr(p, addr);.   
cd20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cd30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
cd40: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cd50: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
cd60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
cd80: 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b  sData, tab2, 1);
cd90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
cda0: 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64  Addr<sizeof(aAdd
cdb0: 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b  r)/sizeof(aAddr[
cdc0: 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 41 64  0]) );.      aAd
cdd0: 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71  dr[nAddr++] = sq
cde0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cdf0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
ce00: 6e 73 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  ns, tab2, 0);.  
ce10: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
ce20: 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20  0;.      nLimit 
ce30: 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  = p->nLimit;.   
ce40: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d     p->nLimit = -
ce50: 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74  1;.      nOffset
ce60: 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   = p->nOffset;. 
ce70: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
ce80: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
ce90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
cea0: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
ceb0: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
cec0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
ced0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
cee0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  r;.      p->nLim
cef0: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
cf00: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
cf10: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  nOffset;.      i
cf20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
cf30: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
cf40: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
cf50: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
cf60: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
cf70: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
cf80: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
cf90: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
cfa0: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
cfb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cfc0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
cfd0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
cfe0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
cff0: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
d000: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d010: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
d020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
d030: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
d040: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d050: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
d060: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d070: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
d080: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d090: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
d0a0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d0b0: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
d0c0: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
d0d0: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
d0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0f0: 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c  p(v, OP_FullKey,
d100: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
d110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d120: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
d130: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a  , tab2, iCont);.
d140: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
d150: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
d160: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
d170: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
d180: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
d1b0: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
d1c0: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
d1f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
d200: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  rc ){.        rc
d210: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
d220: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d230: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
d240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d250: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
d260: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
d270: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d280: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
d290: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
d2a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d2b0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
d2c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d2d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d2e0: 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d300: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
d310: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
d320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d330: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d340: 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
d350: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
d360: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
d370: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
d380: 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
d390: 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
d3a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
d3b0: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
d3c0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
d3d0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
d3e0: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
d3f0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
d400: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d410: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
d420: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
d430: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
d440: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
d450: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
d460: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
d470: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
d480: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
d490: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d4a0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d4b0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  nd;.  }..  /* Se
d4c0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
d4d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f  columns in tempo
d4e0: 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f  rary tables.  */
d4f0: 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  .  nCol = p->pEL
d500: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68  ist->nExpr;.  wh
d510: 69 6c 65 28 20 6e 41 64 64 72 3e 30 20 29 7b 0a  ile( nAddr>0 ){.
d520: 20 20 20 20 6e 41 64 64 72 2d 2d 3b 0a 20 20 20      nAddr--;.   
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d540: 67 65 50 32 28 76 2c 20 61 41 64 64 72 5b 6e 41  geP2(v, aAddr[nA
d550: 64 64 72 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ddr], nCol);.  }
d560: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
d570: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
d580: 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
d590: 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
d5a0: 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
d5b0: 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
d5c0: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
d5d0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
d5e0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
d5f0: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
d600: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
d610: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
d620: 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
d630: 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
d640: 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
d650: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
d660: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
d670: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
d680: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
d690: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
d6a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d6b0: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
d6c0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
d6d0: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
d6e0: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
d6f0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
d700: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
d710: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
d720: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
d730: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
d740: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
d750: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
d760: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
d770: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
d780: 7c 7c 20 28 70 4f 70 65 6e 54 65 6d 70 20 26 26  || (pOpenTemp &&
d790: 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e   pOpenTemp->nId>
d7a0: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0) ){.    int i;
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d7d0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
d7e0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
d7f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d800: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
d810: 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
d820: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
d830: 73 65 72 74 28 20 70 2d 3e 70 70 4f 70 65 6e 54  sert( p->ppOpenT
d840: 65 6d 70 20 3d 3d 20 26 70 4f 70 65 6e 54 65 6d  emp == &pOpenTem
d850: 70 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  p );.    pKeyInf
d860: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
d870: 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66  (sizeof(*pKeyInf
d880: 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  o)+nCol*sizeof(C
d890: 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 69  ollSeq*));.    i
d8a0: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
d8b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d8c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
d8d0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d8e0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
d8f0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
d900: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
d910: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
d920: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a  nField = nCol;..
d930: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d940: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
d950: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
d960: 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
d970: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
d980: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
d990: 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ( !pKeyInfo->aCo
d9a0: 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
d9b0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
d9c0: 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  [i] = pParse->db
d9d0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
d9e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d9f0: 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65  for(i=0; pOpenTe
da00: 6d 70 20 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d  mp && i<pOpenTem
da10: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
da20: 20 20 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d      int p3type =
da30: 20 28 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46   (i==0?P3_KEYINF
da40: 4f 5f 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59  O_HANDOFF:P3_KEY
da50: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74  INFO);.      int
da60: 20 61 64 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d   addr = pOpenTem
da70: 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20  p->a[i].idx;.   
da80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
da90: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
daa0: 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
dab0: 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 20 20 7d  , p3type);.    }
dac0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  ..    if( p->pOr
dad0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
dae0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
daf0: 74 65 6d 20 2a 70 4f 72 64 65 72 42 79 54 65 72  tem *pOrderByTer
db00: 6d 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  m = p->pOrderBy-
db10: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
db20: 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  0; i<p->pOrderBy
db30: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f  ->nExpr; i++, pO
db40: 72 64 65 72 42 79 54 65 72 6d 2b 2b 29 7b 0a 20  rderByTerm++){. 
db50: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
db60: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 54 65 72  pr = pOrderByTer
db70: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
db80: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
db90: 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e 7a 4e  pOrderByTerm->zN
dba0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
dbb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
dbc0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
dbd0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c  pr->iColumn<nCol
dbe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
dbf0: 72 74 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c  rt( !pExpr->pCol
dc00: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
dc10: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
dc20: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
dc30: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
dc40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
dc50: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
dc60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc70: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
dc80: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
dc90: 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  oll[pExpr->iColu
dca0: 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mn];.        }. 
dcb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e       }.      gen
dcc0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
dcd0: 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70  arse, p, v, p->p
dce0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
dcf0: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
dd00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70   }..    if( !pOp
dd10: 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  enTemp ){.      
dd20: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
dd30: 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e  for UNION ALL ..
dd40: 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  . ORDER BY */.  
dd50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
dd60: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  KeyInfo);.    }.
dd70: 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
dd80: 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70  t_end:.  if( pOp
dd90: 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71  enTemp ){.    sq
dda0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
ddb0: 65 28 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20  e(pOpenTemp);.  
ddc0: 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  }.  p->ppOpenTem
ddd0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
dde0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
ddf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
de00: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
de10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
de20: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53  MIT_VIEW./*.** S
de30: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
de40: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
de50: 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
de60: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
de70: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
de80: 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
de90: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
dea0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
deb0: 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
dec0: 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
ded0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
dee0: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
def0: 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
df00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
df10: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
df20: 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
df30: 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
df40: 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
df50: 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
df60: 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
df70: 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
df80: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
df90: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
dfa0: 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
dfb0: 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
dfc0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
dfd0: 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
dfe0: 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
dff0: 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
e000: 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
e010: 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
e020: 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
e030: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
e040: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
e050: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
e060: 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
e070: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
e080: 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
e090: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
e0a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69  List(ExprList*,i
e0b0: 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20  nt,ExprList*);  
e0c0: 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
e0d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e0e0: 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
e0f0: 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
e100: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
e110: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
e120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e130: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
e140: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
e150: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
e160: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
e170: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
e180: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
e190: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
e1a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
e1b0: 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
e1c0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
e1d0: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
e1e0: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
e1f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e200: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
e210: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
e220: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
e230: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
e240: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
e250: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
e260: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
e270: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
e280: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
e290: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
e2a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e2b0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
e2c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
e2d0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
e2e0: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
e2f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e300: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
e310: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
e320: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
e330: 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
e340: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
e350: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
e360: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
e370: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
e380: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
e390: 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pNew->pList);. 
e3a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
e3b0: 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
e3c0: 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
e3d0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
e3e0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
e3f0: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
e400: 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
e410: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
e420: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
e430: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
e440: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
e450: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
e460: 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
e470: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
e480: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
e490: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
e4a0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
e4b0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
e4c0: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
e4d0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
e4e0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78  ubstExprList(pEx
e4f0: 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c  pr->pList, iTabl
e500: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
e510: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73  }.static void .s
e520: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
e530: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
e540: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
e550: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
e560: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
e570: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
e580: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e590: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e5a0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
e5b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
e5c0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
e5d0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
e5e0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
e5f0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
e600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e610: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
e620: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
e630: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
e640: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
e650: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
e660: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
e670: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
e680: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
e690: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
e6a0: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
e6b0: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
e6c0: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
e6d0: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
e6e0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
e6f0: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
e700: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
e710: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
e720: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
e730: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
e740: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
e750: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
e760: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
e770: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
e780: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
e790: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
e7a0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
e7b0: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
e7c0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
e7d0: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
e7e0: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
e7f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
e800: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
e810: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
e820: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
e830: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
e840: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
e850: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
e860: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
e870: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
e880: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
e890: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
e8a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
e8b0: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
e8c0: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
e8d0: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
e8e0: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
e8f0: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
e900: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
e910: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
e920: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
e930: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
e940: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
e950: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
e960: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
e970: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
e980: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
e990: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
e9a0: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
e9b0: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
e9c0: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
e9d0: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
e9e0: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
e9f0: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
ea00: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
ea10: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
ea20: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
ea30: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
ea40: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
ea50: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
ea60: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
ea70: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
ea80: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
ea90: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
eaa0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
eab0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
eac0: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
ead0: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
eae0: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
eaf0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
eb00: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
eb10: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
eb20: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
eb30: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
eb40: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
eb50: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
eb60: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
eb70: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
eb80: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
eb90: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
eba0: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
ebb0: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
ebc0: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
ebd0: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
ebe0: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
ebf0: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
ec00: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
ec10: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
ec20: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
ec30: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
ec40: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
ec50: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
ec60: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
ec70: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
ec80: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
ec90: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
eca0: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
ecb0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
ecc0: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
ecd0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
ece0: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
ecf0: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
ed00: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
ed10: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ed20: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
ed30: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
ed40: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
ed50: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
ed60: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
ed70: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
ed80: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
ed90: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
eda0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
edb0: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
edc0: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
edd0: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
ede0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
edf0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
ee00: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
ee10: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
ee20: 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
ee30: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
ee40: 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
ee50: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
ee60: 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
ee70: 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
ee80: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
ee90: 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
eea0: 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
eeb0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
eec0: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
eed0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
eee0: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
eef0: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
ef00: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
ef10: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
ef20: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
ef30: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
ef40: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
ef50: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
ef60: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
ef70: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
ef80: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
ef90: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
efa0: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
efb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
efc0: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
efd0: 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
efe0: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
eff0: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
f000: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
f010: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
f020: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
f030: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
f040: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
f050: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
f060: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
f070: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
f080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f090: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
f0a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f0b0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
f0c0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f0d0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
f0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f0f0: 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
f100: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f110: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
f120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
f130: 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
f140: 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
f150: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
f160: 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
f170: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
f180: 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
f190: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
f1a0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
f1b0: 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
f1c0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
f1d0: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
f1e0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
f1f0: 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
f200: 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
f210: 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
f220: 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
f230: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
f240: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
f250: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
f260: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
f270: 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
f280: 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
f290: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
f2a0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
f2b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
f2c0: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
f2d0: 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
f2e0: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
f2f0: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
f300: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
f310: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
f320: 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
f330: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
f340: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f350: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f360: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
f370: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f380: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
f390: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
f3a0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
f3b0: 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
f3c0: 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
f3d0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
f3e0: 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
f3f0: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
f400: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
f410: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
f420: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f430: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
f440: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
f450: 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
f460: 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
f470: 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
f480: 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
f490: 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
f4a0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
f4b0: 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
f4c0: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
f4d0: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
f4e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f4f0: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
f500: 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
f510: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
f520: 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
f530: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
f540: 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70  ubSrc );.  if( p
f550: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
f560: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f570: 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
f580: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69  nct || pSub->nLi
f590: 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72  mit>=0) &&  (pSr
f5a0: 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
f5b0: 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
f5c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
f5d0: 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  (p->isDistinct |
f5e0: 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20  | p->nLimit>=0) 
f5f0: 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
f600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f610: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
f620: 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
f630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
f640: 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  /* Restriction 3
f650: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
f660: 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
f670: 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
f680: 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
f690: 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
f6a0: 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
f6b0: 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
f6c0: 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
f6d0: 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
f6e0: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
f6f0: 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
f700: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
f710: 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
f720: 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
f730: 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
f740: 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
f750: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
f760: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
f770: 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
f780: 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
f790: 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
f7a0: 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  ame thing..  */.
f7b0: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
f7c0: 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30  Src>1 && iFrom>0
f7d0: 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72   && (pSrc->a[iFr
f7e0: 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  om-1].jointype &
f7f0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
f800: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f810: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
f820: 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
f830: 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
f840: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
f850: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
f860: 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
f870: 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
f880: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
f890: 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
f8a0: 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
f8b0: 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
f8c0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
f8d0: 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
f8e0: 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
f8f0: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
f900: 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
f910: 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
f920: 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
f930: 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
f940: 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
f950: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
f960: 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
f970: 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
f980: 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
f990: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
f9a0: 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
f9b0: 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
f9c0: 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
f9d0: 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
f9e0: 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
f9f0: 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  JOIN..  */.  if(
fa00: 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72   iFrom>0 && (pSr
fa10: 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f  c->a[iFrom-1].jo
fa20: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
fa30: 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20  R)!=0 .      && 
fa40: 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20  pSub->pWhere!=0 
fa50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
fa60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
fa70: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
fa80: 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74  t, it means flat
fa90: 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
faa0: 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
fab0: 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
fac0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
fad0: 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  se in the outer 
fae0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  query..  */..  /
faf0: 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
fb00: 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
fb10: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
fb20: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
fb30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
fb40: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
fb50: 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
fb60: 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
fb70: 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
fb80: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
fb90: 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
fba0: 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
fbb0: 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
fbc0: 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
fbd0: 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
fbe0: 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
fbf0: 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
fc00: 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
fc10: 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
fc20: 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
fc30: 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
fc40: 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
fc50: 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
fc60: 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
fc70: 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
fc80: 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
fc90: 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
fca0: 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
fcb0: 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
fcc0: 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
fcd0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
fce0: 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
fcf0: 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
fd00: 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
fd10: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
fd20: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
fd30: 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
fd40: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26  .    if( pTab &&
fd50: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
fd60: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
fd70: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
fd80: 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  , pSubitem->pTab
fd90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fda0: 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
fdb0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
fdc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
fdd0: 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
fde0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
fdf0: 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
fe00: 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
fe10: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
fe20: 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
fe30: 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
fe40: 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =1; i<nSubSrc; i
fe50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  ++){.        pSr
fe60: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
fe70: 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30  stAppend(pSrc, 0
fe80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
fe90: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
fea0: 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
feb0: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d  pSrc->nSrc-1; i-
fec0: 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d  extra>=iFrom; i-
fed0: 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  -){.        pSrc
fee0: 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61  ->a[i] = pSrc->a
fef0: 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20  [i-extra];.     
ff00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
ff10: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
ff20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72   i++){.      pSr
ff30: 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
ff40: 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
ff50: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
ff60: 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
ff70: 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
ff80: 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
ff90: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e   pSrc->a[iFrom+n
ffa0: 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79  SubSrc-1].jointy
ffb0: 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
ffc0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67   }..  /* Now beg
ffd0: 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
ffe0: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
fff0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
10000 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  for .  ** refere
10010 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
10020 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
10030 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20   query..  ** .  
10040 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
10050 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  .  **   SELECT a
10060 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
10070 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
10080 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
10090 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
100a0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
100b0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
100c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
100d0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
100e0 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20          /.  **  
100f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
10100 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
10110 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
10120 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10130 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ___/.  **.  ** W
10140 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
10150 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
10160 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
10170 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
10180 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65   see.  ** "a" we
10190 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
101a0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
101b0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
101c0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
101d0 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45  "..  */.  substE
101e0 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
101f0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
10200 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69  ->pEList);.  pLi
10210 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
10220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10230 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
10240 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
10250 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
10260 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26  >a[i].zName==0 &
10270 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  & (pExpr = pList
10280 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
10290 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  pan.z!=0 ){.    
102a0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
102b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
102c0 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  Dup(pExpr->span.
102d0 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
102e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
102f0 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
10300 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10310 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
10320 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10330 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
10340 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
10350 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10360 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
10370 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
10380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10390 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
103a0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
103b0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
103c0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
103d0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
103e0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
103f0 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
10400 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
10410 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
10420 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
10430 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
10440 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
10450 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10460 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
10470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68    }else{.    pWh
10480 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ere = 0;.  }.  i
10490 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
104a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
104b0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  p->pHaving==0 );
104c0 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
104d0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
104e0 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
104f0 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ere;.    substEx
10500 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
10510 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
10520 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48  List);.    p->pH
10530 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
10540 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e  xprAnd(p->pHavin
10550 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  g, sqlite3ExprDu
10560 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
10570 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10580 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
10590 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
105a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
105b0 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f  stDup(pSub->pGro
105c0 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  upBy);.  }else{.
105d0 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
105e0 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
105f0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10600 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
10610 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
10620 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  p->pWhere, pWher
10630 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
10640 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
10650 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
10660 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
10670 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75  r or the.  ** ou
10680 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
10690 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70  tinct. .  */.  p
106a0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
106b0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
106c0 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
106d0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
106e0 20 74 68 65 20 6c 69 6d 69 74 20 65 78 70 72 65   the limit expre
106f0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73  ssion from the s
10700 75 62 71 75 65 72 79 20 74 6f 20 74 68 65 20 6f  ubquery to the o
10710 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 2e  uter.  ** query.
10720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
10730 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
10740 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74     if( p->nLimit
10750 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  <0 ){.      p->n
10760 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c  Limit = pSub->nL
10770 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  imit;.    }else 
10780 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d  if( p->nLimit+p-
10790 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d  >nOffset > pSub-
107a0 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f  >nLimit+pSub->nO
107b0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
107c0 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
107d0 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e  >nLimit + pSub->
107e0 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66  nOffset - p->nOf
107f0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
10800 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20    p->nOffset += 
10810 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a  pSub->nOffset;..
10820 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
10830 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
10840 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
10850 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
10860 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
10870 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
10880 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
10890 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
108a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
108b0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
108c0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
108d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
108e0 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
108f0 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
10900 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
10910 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
10920 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
10930 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
10940 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
10950 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
10960 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
10970 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
10980 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
10990 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
109a0 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
109b0 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74  s SELECT and ret
109c0 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
109d0 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
109e0 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
109f0 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
10a00 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
10a10 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
10a20 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
10a30 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
10a40 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
10a50 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
10a60 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
10a70 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
10a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
10a90 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
10aa0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
10ab0 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
10ac0 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
10ad0 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
10ae0 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
10af0 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
10b00 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
10b10 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
10b20 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
10b30 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
10b40 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
10b50 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
10b60 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
10b70 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
10b80 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
10b90 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
10ba0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
10bb0 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
10bc0 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  for sqlite3Selec
10bd0 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  t()..** See the 
10be0 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
10bf0 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
10c00 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
10c10 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
10c20 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d  atic int simpleM
10c30 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
10c40 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
10c50 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
10c60 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78  int iParm){.  Ex
10c70 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
10c80 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
10c90 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
10ca0 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
10cb0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
10cc0 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20  t seekOp;.  int 
10cd0 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  cont;.  ExprList
10ce0 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
10cf0 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
10d00 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
10d10 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
10d20 4c 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20 20 2f  List *pSrc;..  /
10d30 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
10d40 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
10d50 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
10d60 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
10d70 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
10d80 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
10d90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
10da0 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
10db0 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
10dc0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
10dd0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
10de0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
10df0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
10e00 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
10e10 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
10e20 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
10e30 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
10e40 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
10e50 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
10e60 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
10e70 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
10e80 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
10e90 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
10ea0 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
10eb0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
10ec0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10ed0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
10ee0 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
10ef0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
10f00 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
10f10 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
10f20 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
10f30 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
10f40 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
10f50 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
10f60 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
10f70 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
10f80 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
10f90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
10fa0 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
10fb0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
10fc0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
10fd0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
10fe0 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
10ff0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
11000 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
11010 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
11020 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
11030 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
11040 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
11050 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
11060 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
11070 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
11080 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
11090 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
110a0 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
110b0 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
110c0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
110d0 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
110e0 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
110f0 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
11100 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
11110 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
11120 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
11130 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
11140 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
11150 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
11160 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
11170 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
11180 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
11190 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
111a0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
111b0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72   pExpr);.    for
111c0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
111d0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
111e0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
111f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11200 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
11210 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
11220 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
11230 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66   && pIdx->keyInf
11240 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c  o.aColl[0]==pCol
11250 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
11260 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
11270 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
11280 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
11290 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
112a0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
112b0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
112c0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
112d0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
112e0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
112f0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
11300 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
11310 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
11320 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
11330 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
11340 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
11350 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
11360 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11370 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11380 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
11390 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
113a0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
113b0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
113c0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
113d0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
113e0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
113f0 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
11400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11410 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
11420 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
11430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11440 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
11450 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 31  olumns, iParm, 1
11460 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
11470 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
11480 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
11490 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
114a0 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
114b0 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
114c0 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
114d0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
114e0 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
114f0 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
11500 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
11510 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
11520 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
11530 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
11540 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
11550 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
11560 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
11570 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
11580 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
11590 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61  pTab->iDb);.  ba
115a0 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  se = pSrc->a[0].
115b0 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75  iCursor;.  compu
115c0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
115d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
115e0 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
115f0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
11600 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
11610 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 62 61  ForReading(v, ba
11620 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20  se, pTab);.  }. 
11630 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56   cont = sqlite3V
11640 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11650 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
11660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11670 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
11680 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65  , base, 0);.  }e
11690 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e  lse{.    /* Even
116a0 20 74 68 6f 75 67 68 20 74 68 65 20 63 75 72 73   though the curs
116b0 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  or used to open 
116c0 74 68 65 20 69 6e 64 65 78 20 68 65 72 65 20 69  the index here i
116d0 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20  s closed.    ** 
116e0 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e  as soon as a sin
116f0 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20 62 65  gle value has be
11700 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c  en read from it,
11710 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20   allocate it.   
11720 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73   ** using (pPars
11730 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72  e->nTab++) to pr
11740 65 76 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72  event the cursor
11750 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a   id from being .
11760 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54      ** reused. T
11770 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
11780 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
11790 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20  of the form .   
117a0 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   ** "INSERT INTO
117b0 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20   x SELECT max() 
117c0 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a  FROM x"..    */.
117d0 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20      int iIdx;.  
117e0 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d    iIdx = pParse-
117f0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
11800 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11810 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
11820 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  x->iDb, 0);.    
11830 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
11840 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
11850 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Idx, pIdx->tnum,
11860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11870 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78      (char*)&pIdx
11880 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  ->keyInfo, P3_KE
11890 59 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20  YINFO);.    if( 
118a0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e  seekOp==OP_Rewin
118b0 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
118c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
118d0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
118e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
118f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
11900 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
11910 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
11920 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
11930 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11940 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
11950 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
11960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11970 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20  v, OP_IdxRecno, 
11980 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
11990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
119a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
119b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
119c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
119d0 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30  _MoveGe, base, 0
119e0 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
119f0 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
11a00 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
11a10 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
11a20 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
11a30 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
11a40 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
11a50 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
11a60 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
11a70 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
11a80 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
11a90 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
11aa0 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cont, 0);.  sqli
11ab0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11ac0 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
11ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ae0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
11af0 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74  se, 0);.  .  ret
11b00 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
11b10 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45  Analyze and ORDE
11b20 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
11b30 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c   clause in a SEL
11b40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
11b50 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
11b60 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
11b70 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52  een..**.** An OR
11b80 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
11b90 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  BY is a list of 
11ba0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66  expressions.  If
11bb0 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 0a   any expression.
11bc0 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
11bd0 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
11be0 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
11bf0 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
11c00 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
11c10 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ing entry in the
11c20 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
11c30 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65  static int proce
11c40 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a  ssOrderGroupBy(.
11c50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11c60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
11c70 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11c80 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
11c90 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
11ca0 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
11cb0 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
11cc0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 53 72  rocessed */.  Sr
11cd0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
11ce0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
11cf0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11d00 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
11d10 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
11d20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  set */.  int isA
11d30 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gg,            /
11d40 2a 20 54 72 75 65 20 69 66 20 61 67 67 72 65 67  * True if aggreg
11d50 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ate functions ar
11d60 65 20 69 6e 76 6f 6c 76 65 64 20 2a 2f 0a 20 20  e involved */.  
11d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
11d80 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
11d90 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
11da0 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
11db0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
11dc0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
11dd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
11de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
11df0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
11e00 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
11e10 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  ;.    Expr *pE =
11e20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11e30 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
11e40 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11e50 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26  ger(pE, &iCol) &
11e60 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  & iCol>0 && iCol
11e70 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
11e80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11e90 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
11ea0 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
11eb0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
11ec0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
11ed0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
11ee0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  1].pExpr);.    }
11ef0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11f00 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
11f10 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
11f20 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 2c 20 69  t, pEList, pE, i
11f30 73 41 67 67 2c 20 31 29 20 29 7b 0a 20 20 20 20  sAgg, 1) ){.    
11f40 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11f50 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
11f60 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
11f70 70 45 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pE) ){.      if(
11f80 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11f90 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
11fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
11fb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11fc0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
11fd0 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d 75   "%s BY terms mu
11fe0 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
11ff0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
12000 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  , zType);.      
12010 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
12020 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
12030 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
12040 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
12050 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12060 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
12070 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
12080 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
12090 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
120a0 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
120b0 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
120c0 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65  1 and %d", zType
120d0 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
120e0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
120f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
12100 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
12110 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
12120 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
12130 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
12140 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
12150 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
12160 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
12170 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
12180 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
12190 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
121a0 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
121b0 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
121c0 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
121d0 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
121e0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
121f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12210 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
12220 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
12230 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
12240 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
12250 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
12260 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
12270 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
12280 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
12290 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
122a0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
122b0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
122c0 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
122d0 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
122e0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
122f0 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
12300 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
12310 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
12320 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
12330 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
12340 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
12350 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
12360 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
12370 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
12380 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
12390 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
123a0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
123b0 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
123c0 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
123d0 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
123e0 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
123f0 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
12400 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
12410 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
12420 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
12430 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
12440 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
12450 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
12460 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
12470 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
12480 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
12490 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
124a0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
124b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
124c0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
124d0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
124e0 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
124f0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12500 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
12510 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
12520 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
12530 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
12540 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
12550 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
12560 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
12570 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
12580 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
12590 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
125a0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
125b0 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
125c0 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
125d0 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
125e0 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
125f0 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
12600 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
12610 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
12620 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
12630 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
12640 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
12650 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
12660 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
12670 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
12680 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
12690 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
126a0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
126b0 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
126c0 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
126d0 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
126e0 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
126f0 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
12700 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
12710 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
12720 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
12730 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
12740 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
12750 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
12760 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
12770 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
12780 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
12790 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
127a0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
127b0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
127c0 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
127d0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
12810 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
12820 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
12830 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
12840 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
12850 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12860 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
12870 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
12880 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
12890 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
128a0 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
128b0 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
128c0 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
128d0 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
128e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
128f0 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
12900 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
12910 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
12920 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
12930 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
12940 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
12950 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
12960 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
12970 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
12980 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
12990 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
129a0 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
129b0 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
129c0 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
129d0 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
129e0 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
129f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
12a00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12a10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12a20 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
12a30 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12a40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12a50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12a60 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
12a70 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
12a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
12a90 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
12aa0 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
12ab0 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
12ac0 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61         /* A para
12ad0 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68  meter used by th
12ae0 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c  e eDest disposal
12af0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c   method */.  Sel
12b00 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
12b10 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
12b20 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
12b30 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
12b40 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
12b50 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
12b60 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
12b70 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
12b80 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
12b90 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
12ba0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
12bb0 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
12bc0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
12bd0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
12be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12bf0 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
12c00 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
12c10 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
12c20 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
12c30 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
12c40 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
12c50 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  sAgg = 0;       
12c60 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
12c70 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
12c80 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
12c90 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
12ca0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
12cb0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
12cc0 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
12cd0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
12ce0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
12cf0 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
12d00 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
12d10 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
12d20 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
12d30 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
12d40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12d50 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
12d60 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
12d70 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
12d80 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
12d90 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
12da0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
12db0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
12dc0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
12dd0 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
12de0 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
12df0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
12e00 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
12e10 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
12e20 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
12e30 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
12e40 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
12e50 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
12e60 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12e70 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
12e80 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
12e90 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
12ea0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
12eb0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
12ec0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
12ed0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
12ee0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
12ef0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
12f00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
12f10 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12f20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12f30 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
12f40 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
12f50 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1;..#ifndef SQLI
12f60 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
12f70 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
12f80 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
12f90 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
12fa0 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
12fb0 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
12fc0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
12fd0 69 6f 72 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ior ){.#ifndef S
12fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f  QLITE_OMIT_CURSO
12ff0 52 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 46 65  R.    if( p->pFe
13000 74 63 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tch ){.      sql
13010 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13020 72 73 65 2c 20 22 63 75 72 73 6f 72 73 20 63 61  rse, "cursors ca
13030 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20  nnot be used on 
13040 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
13050 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ");.      goto s
13060 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13070 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
13080 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
13090 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
130a0 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20   iParm, aff);.  
130b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
130c0 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
130d0 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
130e0 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
130f0 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
13100 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
13110 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
13120 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  re;.  pOrderBy =
13130 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
13140 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
13150 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
13160 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
13170 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
13180 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
13190 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
131a0 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
131b0 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
131c0 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
131d0 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
131e0 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
131f0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
13200 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
13210 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
13220 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13230 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
13240 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29  tStmt(pParse, p)
13250 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
13260 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
13270 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
13280 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  e;.  pEList = p-
13290 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
132a0 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
132b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
132c0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
132d0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
132e0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
132f0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
13300 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
13310 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ut..  */.  if( (
13320 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
13330 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
13340 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ) && pEList->nEx
13350 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  pr>1 ){.    sqli
13360 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13370 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
13380 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
13390 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
133a0 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
133b0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
133c0 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f  ession");.    go
133d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
133e0 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42   }..  /* ORDER B
133f0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
13400 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
13410 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ns..  */.  switc
13420 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
13430 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a  case SRT_Union:.
13440 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
13450 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ept:.    case SR
13460 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20  T_Discard:.     
13470 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
13480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13490 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62  default:.      b
134a0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
134b0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
134c0 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  e should have al
134d0 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20  located all the 
134e0 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a  cursors that we.
134f0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e    ** need to han
13500 64 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e  dle subquerys an
13510 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  d temporary tabl
13520 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  es.  .  **.  ** 
13530 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75  Resolve the colu
13540 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20  mn names and do 
13550 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63  a semantics chec
13560 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  k on all the exp
13570 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
13580 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
13590 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
135a0 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
135b0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
135c0 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
135d0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
135e0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
135f0 4c 69 73 74 2c 20 30 2c 20 70 58 2c 20 31 2c 20  List, 0, pX, 1, 
13600 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  1) ){.      goto
13610 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13620 20 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48   }.    if( ExprH
13630 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
13640 50 5f 41 67 67 29 20 29 20 69 73 41 67 67 20 3d  P_Agg) ) isAgg =
13650 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
13660 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
13670 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
13680 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
13690 70 57 68 65 72 65 2c 20 30 2c 20 31 29 20 29 7b  pWhere, 0, 1) ){
136a0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
136b0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
136c0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69  pHaving ){.    i
136d0 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
136e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
136f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13700 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
13710 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
13720 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
13730 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
13740 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
13750 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13760 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61  ResolveNames(pPa
13770 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
13780 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 2c 20  EList, pHaving, 
13790 31 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 67  1, 1) ){.      g
137a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
137b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78      }.    if( Ex
137c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 48  prHasProperty(pH
137d0 61 76 69 6e 67 2c 20 45 50 5f 41 67 67 29 20 29  aving, EP_Agg) )
137e0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a   isAgg = 1;.  }.
137f0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 26    if( pGroupBy &
13800 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  & !isAgg ){.    
13810 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13820 70 50 61 72 73 65 2c 20 22 47 52 4f 55 50 20 42  pParse, "GROUP B
13830 59 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  Y may only be us
13840 65 64 20 6f 6e 20 61 67 67 72 65 67 61 74 65 20  ed on aggregate 
13850 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 67  queries");.    g
13860 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13870 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73    }.  if( proces
13880 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
13890 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
138a0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
138b0 2c 20 69 73 41 67 67 2c 20 22 4f 52 44 45 52 22  , isAgg, "ORDER"
138c0 29 0a 20 20 20 7c 7c 20 70 72 6f 63 65 73 73 4f  ).   || processO
138d0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
138e0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 54  se, pGroupBy, pT
138f0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
13900 69 73 41 67 67 2c 20 22 47 52 4f 55 50 22 29 0a  isAgg, "GROUP").
13910 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65    ){.    goto se
13920 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
13930 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 75 73   /* We cannot us
13940 65 20 61 20 53 51 4c 20 63 75 72 73 6f 72 20 6f  e a SQL cursor o
13950 6e 20 61 20 6a 6f 69 6e 20 6f 72 20 6f 6e 20 61  n a join or on a
13960 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 0a   DISTINCT query.
13970 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
13980 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52 0a  ITE_OMIT_CURSOR.
13990 20 20 69 66 28 20 70 2d 3e 70 46 65 74 63 68 20    if( p->pFetch 
139a0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  ){.    if( p->is
139b0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
139c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
139d0 67 28 70 50 61 72 73 65 2c 20 22 63 75 72 73 6f  g(pParse, "curso
139e0 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  rs cannot be use
139f0 64 20 6f 6e 20 44 49 53 54 49 4e 43 54 20 71 75  d on DISTINCT qu
13a00 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20 67  eries");.      g
13a10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13a20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
13a30 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29  abList->nSrc>0 )
13a40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13a50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13a60 22 63 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20  "cursors cannot 
13a70 62 65 20 75 73 65 64 20 6f 6e 20 6a 6f 69 6e 73  be used on joins
13a80 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ");.      goto s
13a90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13aa0 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
13ab0 74 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  t->a[0].pSelect 
13ac0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13ad0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13ae0 20 22 63 75 72 73 6f 72 20 63 61 6e 6e 6f 74 20   "cursor cannot 
13af0 62 65 20 75 73 65 64 20 77 69 74 68 20 6e 65 73  be used with nes
13b00 74 65 64 20 71 75 65 72 69 65 73 20 22 0a 20 20  ted queries ".  
13b10 20 20 20 20 20 20 20 20 22 6f 72 20 76 69 65 77          "or view
13b20 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  s");.      goto 
13b30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13b40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13b50 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
13b60 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
13b70 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13b80 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13b90 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
13ba0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
13bb0 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
13bc0 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
13bd0 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20  l be using them 
13be0 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  in a callback.  
13bf0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
13c00 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
13c10 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
13c20 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   to some other d
13c30 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f  estination..  */
13c40 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
13c50 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
13c60 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
13c70 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
13c80 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
13c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
13ca0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
13cb0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
13cc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
13cd0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
13ce0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
13cf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
13d00 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
13d10 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
13d20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
13d30 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20  reContext;..    
13d40 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
13d50 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  i].pSelect==0 ) 
13d60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13d70 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
13d80 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  .zName!=0 ){.   
13d90 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e     zSavedAuthCon
13da0 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
13db0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
13dc0 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
13dd0 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69  Context = pTabLi
13de0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
13df0 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
13e00 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
13e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
13e20 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
13e30 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
13e40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13e50 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
13e60 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53  >a[i].pSelect, S
13e70 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20  RT_TempTable, . 
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
13ea0 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69  Cursor, p, i, &i
13eb0 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  sAgg, 0);.    if
13ec0 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
13ed0 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
13ee0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
13ef0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
13f00 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
13f10 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
13f20 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
13f30 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
13f40 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
13f50 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21  _Union && eDest!
13f60 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65  =SRT_Except && e
13f70 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72  Dest!=SRT_Discar
13f80 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  d ){.      pOrde
13f90 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
13fa0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
13fb0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
13fc0 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
13fd0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
13fe0 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
13ff0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
14000 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
14010 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
14020 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
14030 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
14040 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
14050 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
14060 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
14070 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
14080 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
14090 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20  , iParm) ){.    
140a0 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
140b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
140c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
140d0 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
140e0 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
140f0 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
14100 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
14110 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
14120 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
14130 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
14140 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
14150 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e  ely.  .  */.#ifn
14160 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14170 56 49 45 57 0a 20 20 69 66 28 20 70 50 61 72 65  VIEW.  if( pPare
14180 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67  nt && pParentAgg
14190 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65   &&.      flatte
141a0 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
141b0 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  , pParent, paren
141c0 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67  tTab, *pParentAg
141d0 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  g, isAgg) ){.   
141e0 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50   if( isAgg ) *pP
141f0 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20  arentAgg = 1;.  
14200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14210 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
14220 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
14230 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65  ER BY clause, re
14240 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74  solve any collat
14250 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20  ion sequences.  
14260 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61  ** names that ha
14270 76 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74  ve been explicit
14280 6c 79 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ly specified..  
14290 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
142a0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
142b0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
142c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
142d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
142e0 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
142f0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
14300 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
14310 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
14320 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
14330 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
14340 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  derBy->a[i].zNam
14350 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, -1);.      }.
14360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
14370 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
14380 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
14390 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
143a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
143b0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d  iter..  */.  com
143c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
143d0 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a  rs(pParse, p);..
143e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
143f0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
14400 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
14410 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
14420 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
14430 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
14440 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
14450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14460 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
14470 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
14480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14490 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
144a0 6e 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73  ns, iParm, pELis
144b0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
144c0 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79    /* Do an analy
144d0 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65  sis of aggregate
144e0 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
144f0 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65  */.  sqliteAggre
14500 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50  gateInfoReset(pP
14510 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41  arse);.  if( isA
14520 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
14530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
14540 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b  arse->nAgg==0 );
14550 0a 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a  .    isAgg = 1;.
14560 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14570 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
14580 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
14590 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
145a0 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
145b0 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
145c0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
145d0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
145e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
145f0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
14600 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
14610 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
14620 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14630 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14640 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14650 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47  gates(pParse, pG
14660 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
14670 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
14680 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
14690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
146a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
146b0 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
146c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
146d0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
146e0 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
146f0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
14700 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
14710 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
14720 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14730 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
14740 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
14750 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
14760 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
14770 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
14780 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
14790 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
147a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
147b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
147c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
147d0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
147e0 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  or.  */.  if( is
147f0 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  Agg ){.    int a
14800 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14810 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
14820 52 65 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79  Reset, (pGroupBy
14830 3f 30 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e  ?0:1), pParse->n
14840 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Agg);.    for(i=
14850 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
14860 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
14870 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20  uncDef *pFunc;. 
14880 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20       if( (pFunc 
14890 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
148a0 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70  ].pFunc)!=0 && p
148b0 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  Func->xFinalize!
148c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
148d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
148e0 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69  OP_AggInit, 0, i
148f0 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20  , (char*)pFunc, 
14900 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
14910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14920 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
14930 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 69       int sz = si
14940 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
14950 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a  pGroupBy->nExpr*
14960 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
14970 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
14980 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
14990 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
149a0 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  sz);.      if( 0
149b0 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ==pKey ){.      
149c0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
149d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
149e0 20 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61   pKey->enc = pPa
149f0 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
14a00 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64      pKey->nField
14a10 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
14a20 70 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  pr;.      for(i=
14a30 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
14a40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14a50 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
14a60 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
14a70 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14a80 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
14a90 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
14aa0 66 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b  f( !pKey->aColl[
14ab0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
14ac0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
14ad0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
14ae0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
14af0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14b00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
14b10 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
14b20 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  ar *)pKey, P3_KE
14b30 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
14b40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14b50 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
14b60 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55  emory cell to NU
14b70 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  LL.  */.  if( eD
14b80 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
14b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
14bb0 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  g8, 0, 0);.    s
14bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14bd0 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
14be0 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
14bf0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70    /* Open a temp
14c00 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
14c10 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
14c20 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
14c30 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
14c40 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
14c50 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14c60 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64  .    openTempInd
14c70 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69  ex(pParse, p, di
14c80 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65  stinct, 0);.  }e
14c90 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
14ca0 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
14cb0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
14cc0 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
14cd0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
14ce0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
14cf0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
14d00 68 65 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20  here,.          
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20     pGroupBy ? 0 
14d30 3a 20 26 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  : &pOrderBy, p->
14d40 70 46 65 74 63 68 29 3b 0a 20 20 69 66 28 20 70  pFetch);.  if( p
14d50 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
14d60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
14d70 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
14d80 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66  rd inner loop if
14d90 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c   we are not deal
14da0 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67  ing with.  ** ag
14db0 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20  gregates.  */.  
14dc0 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20  if( !isAgg ){.  
14dd0 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
14de0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
14df0 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
14e00 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
14e10 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20  t, eDest,.      
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
14e30 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  arm, pWInfo->iCo
14e40 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
14e50 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a  iBreak, aff) ){.
14e60 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
14e70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
14e80 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
14e90 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
14ea0 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20  ggregates, then 
14eb0 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61  do the special a
14ec0 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72  ggregate.  ** pr
14ed0 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f  ocessing.  .  */
14ee0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67  .  else{.    Agg
14ef0 45 78 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20  Expr *pAgg;.    
14f00 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
14f10 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a        int lbl1;.
14f20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
14f30 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
14f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14f50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14f60 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
14f70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
14f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
14f90 4e 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  No affinity stri
14fa0 6e 67 20 69 73 20 61 74 74 61 63 68 65 64 20 74  ng is attached t
14fb0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
14fc0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20  OP_MakeRecord . 
14fd0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
14fe0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
14ff0 6f 20 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f  o do any coercio
15000 6e 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20  n of datatypes. 
15010 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
15020 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15030 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f  MakeRecord, pGro
15040 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
15050 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
15060 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15070 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
15080 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15090 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
150a0 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f   lbl1);.      fo
150b0 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72  r(i=0, pAgg=pPar
150c0 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72  se->aAgg; i<pPar
150d0 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70  se->nAgg; i++, p
150e0 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Agg++){.        
150f0 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20  if( pAgg->isAgg 
15100 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15120 6f 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67  ode(pParse, pAgg
15130 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
15140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15150 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c  Op(v, OP_AggSet,
15160 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a   0, i);.      }.
15170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15180 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15190 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20   lbl1);.    }.  
151a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d    for(i=0, pAgg=
151b0 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c  pParse->aAgg; i<
151c0 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
151d0 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20  +, pAgg++){.    
151e0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
151f0 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20    int nExpr;.   
15200 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
15210 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
15220 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  g->isAgg ) conti
15230 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
15240 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d  t( pAgg->pFunc!=
15250 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
15260 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e  t( pAgg->pFunc->
15270 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20  xStep!=0 );.    
15280 20 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70    pDef = pAgg->p
15290 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d  Func;.      pE =
152a0 20 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20   pAgg->pExpr;.  
152b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
152c0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
152d0 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  t( pE->op==TK_AG
152e0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
152f0 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69      nExpr = sqli
15300 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
15310 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
15320 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71  pList);.      sq
15330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15340 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
15350 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
15360 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
15370 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c   ){.        Coll
15380 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
15390 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
153a0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
153b0 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70  !pColl && j<nExp
153c0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
153d0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
153e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
153f0 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d  arse, pE->pList-
15400 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
15410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15420 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
15430 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
15440 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
15450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
15460 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p3(v, OP_CollSeq
15470 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
15480 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45  pColl, P3_COLLSE
15490 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
154a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
154b0 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20  (v, OP_AggFunc, 
154c0 30 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a  0, nExpr, (char*
154d0 29 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45  )pDef, P3_POINTE
154e0 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
154f0 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
15500 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
15510 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68    */.  sqlite3Wh
15520 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
15530 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
15540 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
15550 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74  gates, we need t
15560 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e  o set up a secon
15570 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72  d loop.  ** over
15580 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72   all of the aggr
15590 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64  egate values and
155a0 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20   process them.. 
155b0 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
155c0 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67  ){.    int endag
155d0 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  g = sqlite3VdbeM
155e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
155f0 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
15600 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
15610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15620 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
15630 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
15640 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
15650 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
15660 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
15670 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
15680 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73  arse, pHaving, s
15690 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20  tartagg, 1);.   
156a0 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63   }.    if( selec
156b0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
156c0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
156d0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
156e0 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61     iParm, starta
15710 67 67 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29  gg, endagg, aff)
15720 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
15730 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
15740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15750 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
15760 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a  , 0, startagg);.
15770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15780 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
15790 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  ndagg);.    sqli
157a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
157b0 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
157c0 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
157d0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
157e0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
157f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15800 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
15810 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
15820 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
15830 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
15840 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
15850 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
15860 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
15870 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
15880 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
15890 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
158a0 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , iParm);.  }.. 
158b0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
158c0 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
158d0 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
158e0 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
158f0 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
15900 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
15910 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75  delete the subqu
15920 65 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72  ery structure fr
15930 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20  om the parent.  
15940 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
15950 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d  is subquery from
15960 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
15970 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f   again and to fo
15980 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  rce the.  ** the
15990 20 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70   use of the temp
159a0 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
159b0 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
159c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
159d0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
159e0 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
159f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
15a00 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
15a10 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
15a20 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =p );.    sqlite
15a30 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29  3SelectDelete(p)
15a40 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  ;.    pParent->p
15a50 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
15a60 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  ].pSelect = 0;. 
15a70 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c   }..  /* The SEL
15a80 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
15a90 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
15aa0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
15ab0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
15ac0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
15ad0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
15ae0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
15af0 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
15b00 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
15b10 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
15b20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
15b30 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
15b40 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
15b50 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
15b60 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
15b70 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
15b80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15b90 7d 0a                                            }.