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

Artifact d8f5c8b44922d9e295a32be941d0a416cda94f98:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 33 32  select.c,v 1.232
0200: 20 32 30 30 35 2f 30 31 2f 32 30 20 32 32 3a 34   2005/01/20 22:4
0210: 38 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a 2a  8: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 63 68 61 72 20 2a 7a 41 6c 69 61 73 31  st char *zAlias1
1200: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1210: 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20  or first table. 
1220: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1230: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
1240: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
1250: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
1260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69  const char *zAli
1270: 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61  as2,     /* Alia
1280: 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62  s for second tab
1290: 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  le.  May be NULL
12a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
12b0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
12c0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
12d0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
12e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
12f0: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1300: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1310: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1320: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1330: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1340: 70 45 3b 0a 0a 20 20 73 65 74 54 6f 6b 65 6e 28  pE;..  setToken(
1350: 26 64 75 6d 6d 79 2c 20 7a 43 6f 6c 29 3b 0a 20  &dummy, zCol);. 
1360: 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 45   pE1a = sqlite3E
1370: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1380: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61   &dummy);.  pE2a
1390: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
13a0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
13b0: 6d 79 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  my);.  if( zAlia
13c0: 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s1==0 ){.    zAl
13d0: 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e  ias1 = pTab1->zN
13e0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 73 65 74 54 6f  ame;.  }.  setTo
13f0: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 41 6c 69  ken(&dummy, zAli
1400: 61 73 31 29 3b 0a 20 20 70 45 31 62 20 3d 20 73  as1);.  pE1b = s
1410: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
1420: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1430: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1440: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1450: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1460: 0a 20 20 7d 0a 20 20 73 65 74 54 6f 6b 65 6e 28  .  }.  setToken(
1470: 26 64 75 6d 6d 79 2c 20 7a 41 6c 69 61 73 32 29  &dummy, zAlias2)
1480: 3b 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74  ;.  pE2b = sqlit
1490: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
14a0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70   0, &dummy);.  p
14b0: 45 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70  E1c = sqlite3Exp
14c0: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20  r(TK_DOT, pE1b, 
14d0: 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63  pE1a, 0);.  pE2c
14e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
14f0: 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32  K_DOT, pE2b, pE2
1500: 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71  a, 0);.  pE = sq
1510: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 45 51 2c  lite3Expr(TK_EQ,
1520: 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b   pE1c, pE2c, 0);
1530: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
1540: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1550: 69 6e 29 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d  in);.  *ppExpr =
1560: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1570: 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a  *ppExpr, pE);.}.
1580: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
1590: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
15a0: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
15b0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
15c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
15d0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
15e0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
15f0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1600: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1610: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1620: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1630: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
1640: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
1650: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
1660: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
1670: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
1680: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1690: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
16a0: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
16b0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
16c0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
16d0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
16e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
16f0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
1700: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
1710: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
1720: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
1730: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
1740: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1750: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  G clause..*/.sta
1760: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
1770: 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
1780: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
1790: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
17a0: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
17b0: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
17c0: 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  r(p->pLeft);.   
17d0: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
17e0: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
17f0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
1800: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
1810: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
1820: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1830: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
1840: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
1850: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
1860: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
1870: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1880: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
1890: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
18a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
18b0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
18c0: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
18d0: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
18e0: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
18f0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
1900: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
1910: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
1920: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
1930: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
1940: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
1950: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
1960: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
1970: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
1980: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
1990: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
19a0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
19b0: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
19c0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
19d0: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
19e0: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
19f0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
1a00: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
1a10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
1a20: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
1a30: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1a40: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
1a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1a60: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1a70: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
1a80: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
1a90: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
1aa0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
1ab0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1ac0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
1ad0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
1ae0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
1af0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
1b00: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1b10: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1b30: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1b40: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b50: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
1b60: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
1b70: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
1b80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b90: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
1ba0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
1bb0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
1bc0: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
1bd0: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
1be0: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
1bf0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
1c00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
1c10: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
1c20: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
1c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1c40: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
1c50: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
1c60: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
1c70: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20  Right->pTab;..  
1c80: 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d    if( pLeftTab==
1c90: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
1ca0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1cb0: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1cc0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1cd0: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
1ce0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1cf0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
1d00: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
1d10: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
1d20: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
1d30: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
1d40: 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ft->jointype & J
1d50: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1d60: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
1d70: 6e 20 7c 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69  n || pLeft->pUsi
1d80: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1d90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1da0: 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c  arse, "a NATURAL
1db0: 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61   join may not ha
1dc0: 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ve ".           
1dd0: 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  "an ON or USING 
1de0: 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20  clause", 0);.   
1df0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1e10: 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62  (j=0; j<pLeftTab
1e20: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1e30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1e40: 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43  e = pLeftTab->aC
1e50: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
1e60: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
1e70: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
1e80: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1e90: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
1ea0: 65 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74  erm(zName, pLeft
1eb0: 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69  Tab, pLeft->zAli
1ec0: 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  as, .           
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52     pRightTab, pR
1ef0: 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70  ight->zAlias, &p
1f00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
1f10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
1f30: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
1f40: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
1f50: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
1f60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1f70: 65 66 74 2d 3e 70 4f 6e 20 26 26 20 70 4c 65 66  eft->pOn && pLef
1f80: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
1f90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fa0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1fb0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
1fc0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
1fd0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
1fe0: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
1ff0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
2010: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
2020: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
2030: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2040: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
2050: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
2060: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
2070: 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20   if( pLeft->pOn 
2080: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
2090: 45 78 70 72 28 70 4c 65 66 74 2d 3e 70 4f 6e 29  Expr(pLeft->pOn)
20a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
20b0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
20c0: 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 4c  nd(p->pWhere, pL
20d0: 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  eft->pOn);.     
20e0: 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b   pLeft->pOn = 0;
20f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2100: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2110: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2120: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2130: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2140: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2150: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2160: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2170: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2180: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2190: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
21a0: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
21b0: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
21c0: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
21d0: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
21e0: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
21f0: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2200: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2210: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2220: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2230: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2240: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2250: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2260: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2270: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2280: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2290: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
22a0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
22b0: 70 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  pList = pLeft->p
22c0: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
22d0: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
22e0: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
22f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2300: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
2310: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2320: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
2330: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
2340: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2350: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
2360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2380: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
2390: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
23a0: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
23b0: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
23c0: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
23d0: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
23e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2400: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2410: 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  rm(zName, pLeftT
2420: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
2430: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
2460: 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70  t->zAlias, &p->p
2470: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
2480: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
24a0: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
24b0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
24c0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
24d0: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
24e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
24f0: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
2500: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
2510: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
2520: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2530: 65 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ete(p->pEList);.
2540: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2550: 44 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b  Delete(p->pSrc);
2560: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2570: 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b  lete(p->pWhere);
2580: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2590: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f  stDelete(p->pGro
25a0: 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  upBy);.  sqlite3
25b0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48  ExprDelete(p->pH
25c0: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
25d0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
25e0: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
25f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2600: 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  ete(p->pPrior);.
2610: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
2620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2630: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69   the aggregate i
2640: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2650: 74 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74  the parse struct
2660: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2670: 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67  oid sqliteAggreg
2680: 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72  ateInfoReset(Par
2690: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
26a0: 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65  qliteFree(pParse
26b0: 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73  ->aAgg);.  pPars
26c0: 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->aAgg = 0;.  p
26d0: 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b  Parse->nAgg = 0;
26e0: 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  .  pParse->useAg
26f0: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2700: 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f  Insert code into
2710: 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70   "v" that will p
2720: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f  ush the record o
2730: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
2740: 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74  .** stack into t
2750: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
2760: 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e  atic void pushOn
2770: 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a  toSorter(Parse *
2780: 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c  pParse, Vdbe *v,
2790: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
27a0: 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rBy){.  int i;. 
27b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
27c0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
27d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
27e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
27f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2800: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xpr);.  }.  sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2820: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
2830: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2840: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2860: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
2880: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2890: 4f 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54  OFFSET and LIMIT
28a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28b0: 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20 20 56  codeLimiter(.  V
28c0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
28d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
28e0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
28f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2910: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2920: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
2930: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2940: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2950: 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e   skip the curren
2960: 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  t record */.  in
2970: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
2980: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2990: 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  end the loop */.
29a0: 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20    int nPop      
29b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29c0: 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74   times to pop st
29d0: 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67  ack when jumping
29e0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
29f0: 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20  iOffset>=0 ){.  
2a00: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2a10: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2a20: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
2a30: 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61 64 64  if( nPop>0 ) add
2a40: 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r++;.    sqlite3
2a50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2a60: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66  MemIncr, p->iOff
2a70: 73 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  set, addr);.    
2a80: 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20  if( nPop>0 ){.  
2a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
2ab0: 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nPop, 0);.    }.
2ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
2ae0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
2af0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2b00: 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53  (v, "# skip OFFS
2b10: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
2b20: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d   }.  if( p->iLim
2b30: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
2b40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2b50: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2b60: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2b70: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
2b80: 28 28 76 2c 20 22 23 20 65 78 69 74 20 77 68 65  ((v, "# exit whe
2b90: 6e 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  n LIMIT reached"
2ba0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
2bb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2bc0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2bd0: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2be0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2bf0: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2c00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2c10: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c20: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c30: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c40: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c50: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2c60: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2c70: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2c80: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2c90: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2ca0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2cb0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2cc0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2cd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2ce0: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2cf0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d00: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d30: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d40: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d60: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2d70: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2d80: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2d90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2da0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2db0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2dc0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2dd0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2df0: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2e00: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2e10: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e30: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e40: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e50: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2e60: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2e70: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2e80: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2e90: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2ea0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2eb0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2ec0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2ed0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2ee0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2ef0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2f00: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2f10: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f20: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f30: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f40: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f50: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2f60: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2f80: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2f90: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2fa0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
2fd0: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
2fe0: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
2ff0: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
3000: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
3010: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
3020: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
3030: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3040: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3050: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
3060: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
3070: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3080: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3090: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
30a0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
30b0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
30c0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
30d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
30e0: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
30f0: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3100: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3110: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3120: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3130: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3140: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61  utput..  */.  ha
3150: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
3160: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3170: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
3180: 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  pr>0;.  if( pOrd
3190: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
31a0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
31b0: 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c  odeLimiter(v, p,
31c0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65   iContinue, iBre
31d0: 61 6b 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ak, 0);.  }..  /
31e0: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
31f0: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
3200: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
3210: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
3220: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
3230: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
3240: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3250: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
3260: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
3270: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20  se{.    nColumn 
3280: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
3290: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
32a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
32b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
32c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
32d0: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
32e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
32f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
3300: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
3310: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
3320: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3330: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
3340: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
3350: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
3360: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
3370: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
3380: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
3390: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
33a0: 74 69 6e 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c  tinct ){.#if NUL
33b0: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
33c0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  T.    sqlite3Vdb
33d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
33e0: 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45  ull, -pEList->nE
33f0: 78 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  xpr, sqlite3Vdbe
3400: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3410: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
3420: 20 44 65 6c 69 62 65 72 61 74 65 6c 79 20 6c 65   Deliberately le
3430: 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
3440: 20 73 74 72 69 6e 67 20 6f 66 66 20 6f 66 20 74   string off of t
3450: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
3460: 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   ** OP_MakeRecor
3470: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
3480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3490: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 45 4c 69  MakeRecord, pELi
34a0: 73 74 2d 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20  st->nExpr * -1, 
34b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
34c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
34d0: 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63  istinct, distinc
34e0: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
34f0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
3500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3520: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31   pEList->nExpr+1
3530: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3540: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3550: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3560: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3570: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
3580: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
3590: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
35a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
35b0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
35c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
35d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
35e0: 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69 6e  utStrKey, distin
35f0: 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
3600: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
3610: 20 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72       codeLimiter
3620: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3630: 2c 20 69 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d  , iBreak, nColum
3640: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
3650: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
3660: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
3670: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
3680: 45 4c 45 43 54 0a 20 20 20 20 2f 2a 20 49 6e 20  ELECT.    /* In 
3690: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
36a0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
36b0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
36c0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
36d0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
36e0: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
36f0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
3700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3720: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
3730: 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  , NULL_ALWAYS_DI
3740: 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73  STINCT);.      s
3750: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3760: 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50  P3(v, -1, aff, P
3770: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
3780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3790: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
37a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37c0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
37d0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
37e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
37f0: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
3800: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
3810: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
3820: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
3830: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
3840: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
3850: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
3860: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
3870: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
3880: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
3890: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
38a0: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
38b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
38c0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
38d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
38e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
38f0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3900: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3920: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3930: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
3940: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3950: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3960: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
3970: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
3980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3990: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
39a0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
39b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
39c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
39d0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
39e0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
39f0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
3a00: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
3a10: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
3a20: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
3a30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3a40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3a60: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
3a70: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3a80: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3a90: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3aa0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ad0: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50   OP_NewRecno, iP
3ae0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  arm, 0);.       
3af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b00: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
3b10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3b30: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
3b40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3b50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3b60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3b70: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
3b80: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
3b90: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
3ba0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
3bb0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
3bc0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
3bd0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
3be0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
3bf0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
3c00: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
3c10: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
3c20: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
3c30: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
3c40: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
3c50: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3c60: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
3c70: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
3c80: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
3c90: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
3ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3cb0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
3cc0: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ce0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
3cf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
3d00: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3d20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3d30: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3d40: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
3d50: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
3d60: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
3d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3d80: 63 68 61 72 20 61 66 66 20 3d 20 28 69 50 61 72  char aff = (iPar
3d90: 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20  m>>16)&0xFF;.   
3da0: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
3db0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
3dc0: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
3dd0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 20 20  Expr, aff);.    
3de0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
3df0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
3e00: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 2c  ord, 1, 0, &aff,
3e10: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
3e20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3e30: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
3e40: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3e60: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69  OP_PutStrKey, (i
3e70: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
3e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3ea0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32  hangeP2(v, addr2
3eb0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3ec0: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
3ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ee0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
3ef0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
3f00: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
3f10: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
3f20: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
3f30: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
3f40: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
3f50: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
3f60: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
3f70: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
3f80: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
3f90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
3fa0: 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  s:.    case SRT_
3fb0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
3fc0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3fd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3fe0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3ff0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4000: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
4010: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
4020: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4030: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4040: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
4050: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 1);.        s
4060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4070: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4080: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  Break);.      }.
4090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20   }..    /* Send 
40b0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
40c0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
40d0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
40e0: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
40f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f  .    case SRT_So
4100: 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66  rter: {.      if
4110: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4140: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4150: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4160: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4170: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4180: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4190: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
41a0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
41b0: 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ack );.        s
41c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
41d0: 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
41e0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
41f0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4200: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4210: 49 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75 74  Invoke a subrout
4220: 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ine to handle th
4230: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
4240: 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c  subroutine itsel
4250: 66 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73 70  f.    ** is resp
4260: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70 70  onsible for popp
4270: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
4280: 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63 6b  off of the stack
4290: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
42a0: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
42b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
42c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
42d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
42e0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
42f0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
4300: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
4310: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
4320: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
4330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4350: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
4360: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
4370: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4390: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
43a0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
43b0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
43c0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
43d0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
43e0: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
43f0: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
4400: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
4410: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
4420: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
4430: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
4440: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
4450: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
4460: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
4470: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
4480: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
4490: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
44a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
44b0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
44c0: 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
44d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
44e0: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  P_Pop, nColumn, 
44f0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4510: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4520: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
4530: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
4540: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
4550: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
4560: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
4570: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
4580: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
4590: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
45a0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
45b0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
45c0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
45d0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
45e0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
45f0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
4600: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
4610: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
4620: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
4630: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
4640: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
4650: 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  arse,   /* The p
4660: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4670: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
4680: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
4690: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
46a0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
46b0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
46c0: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
46d0: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
46e0: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  umn,     /* Numb
46f0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
4700: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65   data */.  int e
4710: 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57  Dest,       /* W
4720: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
4730: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
4740: 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20    int iParm     
4750: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70     /* Optional p
4760: 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61  arameter associa
4770: 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a  ted with eDest *
4780: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20  /.){.  int end1 
4790: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
47a0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
47b0: 20 65 6e 64 32 20 3d 20 73 71 6c 69 74 65 33 56   end2 = sqlite3V
47c0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
47d0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b  .  int addr;.  K
47e0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
47f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4800: 72 42 79 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  rBy;.  int nCol,
4810: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
4820: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4830: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4840: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
4850: 6e 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  n;.  pOrderBy = 
4860: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e  p->pOrderBy;.  n
4870: 43 6f 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Col = pOrderBy->
4880: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
4890: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
48a0: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
48b0: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
48c0: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
48d0: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65  f( pInfo==0 ) re
48e0: 74 75 72 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  turn;.  pInfo->a
48f0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61  SortOrder = (cha
4900: 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  r*)&pInfo->aColl
4910: 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d  [nCol];.  pInfo-
4920: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4940: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  l; i++){.    /* 
4950: 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  If a collation s
4960: 65 71 75 65 6e 63 65 20 77 61 73 20 73 70 65 63  equence was spec
4970: 69 66 69 65 64 20 65 78 70 6c 69 63 69 74 79 2c  ified explicity,
4980: 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
4990: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 4f 72  is stored in pOr
49a0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  derBy->a[i].zNam
49b0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  e. Otherwise, us
49c0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  e the default.  
49d0: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
49e0: 79 70 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  ype for the expr
49f0: 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ession..    */. 
4a00: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
4a10: 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
4a20: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
4a30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
4a40: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21  Expr);.    if( !
4a50: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4a60: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
4a70: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70  aColl[i] = db->p
4a80: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
4a90: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
4aa0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
4ab0: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
4ac0: 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  der;.  }.  sqlit
4ad0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
4ae0: 53 6f 72 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  Sort, 0, 0, (cha
4af0: 72 2a 29 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  r*)pInfo, P3_KEY
4b00: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
4b10: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
4b20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4b30: 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31  ortNext, 0, end1
4b40: 29 3b 0a 20 20 63 6f 64 65 4c 69 6d 69 74 65 72  );.  codeLimiter
4b50: 28 76 2c 20 70 2c 20 61 64 64 72 2c 20 65 6e 64  (v, p, addr, end
4b60: 32 2c 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28  2, 1);.  switch(
4b70: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4b80: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4b90: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
4ba0: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
4bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4bc0: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
4bd0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4bf0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
4c00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4c10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4c20: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
4c30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4c50: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4c60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4c70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c90: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4ca0: 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -1, sqlite3VdbeC
4cb0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4ce0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
4cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d00: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4d10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4d20: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d40: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4d50: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c  cord, 1, 0, "n",
4d60: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d80: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4d90: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
4da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4db0: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
4dc0: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
4dd0: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
4de0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4df0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
4e00: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  :.    case SRT_M
4e10: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4e20: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4e30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4e40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4e50: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
4e60: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4e70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4e80: 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b  _Goto, 0, end1);
4e90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ea0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
4eb0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
4ec0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
4ed0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
4ee0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
4ef0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4f00: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69  Integer, p->pELi
4f10: 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  st->nExpr, 0);. 
4f20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4f40: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 1, 0);.      f
4f50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
4f60: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
4f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f80: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
4f90: 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20  -1-i, i);.      
4fa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
4fb0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
4fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4fd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4fe0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4ff0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
5000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5020: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
5030: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
5040: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5050: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
5060: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   2, 0);.      br
5070: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5080: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5090: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
50a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50b0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
50c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
50d0: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
50e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
50f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
5100: 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  d2);.  sqlite3Vd
5110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
5120: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, 1, 0);.  sqli
5130: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5140: 62 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20  bel(v, end1);.  
5150: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5160: 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74  (v, OP_SortReset
5170: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
5180: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
5190: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
51a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
51b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
51c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
51d0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
51e0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
51f0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
5200: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
5210: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65 63  **.** If the dec
5220: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
5230: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
5240: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
5250: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
5260: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43 52   the original CR
5270: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5280: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
5290: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
52a0: 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  mn..** .** The d
52b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
52c0: 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f  for an expressio
52d0: 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58 54  n is either TEXT
52e0: 2c 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e 59  , NUMERIC or ANY
52f0: 2e 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  ..** The declara
5300: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
5310: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
5320: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
5330: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
5340: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
5350: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
5360: 2a 70 54 61 62 4c 69 73 74 2c 20 45 78 70 72 20  *pTabList, Expr 
5370: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
5380: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20 20  const *zType;.  
5390: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
53a0: 70 72 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73  pr==0 || pTabLis
53b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
53c0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 52  ..  sqlite3ExprR
53d0: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72  esolveNames(pPar
53e0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c  se, pTabList, 0,
53f0: 20 30 2c 20 70 45 78 70 72 2c 20 31 2c 20 30 29   0, pExpr, 1, 0)
5400: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41  ;..  /* The TK_A
5410: 53 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f  S operator can o
5420: 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44  nly occur in ORD
5430: 45 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c  ER BY, GROUP BY,
5440: 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e   HAVING,.  ** an
5450: 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2e  d LIMIT clauses.
5460: 20 20 42 75 74 20 70 45 78 70 72 20 6f 72 69 67    But pExpr orig
5470: 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 72 65  inates in the re
5480: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 0a 20 20  sult set of a.  
5490: 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53 6f 20 70  ** SELECT.  So p
54a0: 45 78 70 72 20 63 61 6e 20 6e 65 76 65 72 20 63  Expr can never c
54b0: 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20 6f 70 65  ontain an AS ope
54c0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  rator..  */.  as
54d0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
54e0: 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69  =TK_AS );..  swi
54f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5500: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
5510: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61  LUMN: {.      Ta
5520: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
5530: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
5540: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
5550: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
5560: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
5570: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
5580: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
5590: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
55a0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
55b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
55c0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
55d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
55e0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
55f0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
5600: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
5610: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
5620: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
5630: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
5640: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5650: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  <0 ){.        zT
5660: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
5670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5680: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
5690: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
56a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Type;.      }.  
56b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
56c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
56d0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 53 65 6c  ECT: {.      Sel
56e0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
56f0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
5700: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
5710: 70 65 28 70 50 61 72 73 65 2c 20 70 53 2d 3e 70  pe(pParse, pS->p
5720: 53 72 63 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d  Src, pS->pEList-
5730: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20  >a[0].pExpr); . 
5740: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5750: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
5760: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
5770: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
5780: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
5790: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
57a0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
57b0: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
57c0: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
57d0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
57e0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
57f0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5800: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
5810: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5820: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
5830: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
5840: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5850: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
5860: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5870: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5880: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5890: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
58a0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
58b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
58c0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
58d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
58e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
58f0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
5900: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5910: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
5920: 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e   *zType = column
5930: 54 79 70 65 28 70 50 61 72 73 65 2c 20 70 54 61  Type(pParse, pTa
5940: 62 4c 69 73 74 2c 20 70 29 3b 0a 20 20 20 20 69  bList, p);.    i
5950: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
5960: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
5970: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
5980: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
5990: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
59a0: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
59b0: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
59c0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
59d0: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
59e0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
59f0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5a00: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5a10: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
5a20: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
5a30: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
5a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5a50: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5a60: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5a70: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5a80: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5a90: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
5aa0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
5ab0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
5ac0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
5ad0: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
5ae0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
5af0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
5b00: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
5b10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b20: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5b30: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
5b40: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
5b50: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
5b60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5b70: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
5b80: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5b90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5ba0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5bb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5bc0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
5bd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5be0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
5bf0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
5c00: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
5c10: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
5c20: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5c30: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
5c40: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
5c50: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
5c60: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
5c70: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
5c80: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5c90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
5ca0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
5cb0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
5cc0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5cd0: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5ce0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5cf0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
5d00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5d10: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
5d20: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
5d30: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5d40: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
5d50: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
5d60: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
5d70: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
5d80: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
5d90: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5da0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5db0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
5dc0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5dd0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5de0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5df0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5e00: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5e10: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5e20: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5e40: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
5e50: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
5e60: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
5e70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5e80: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
5e90: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
5ea0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
5eb0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
5ec0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
5ed0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
5ee0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
5ef0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
5f00: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
5f10: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
5f20: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
5f30: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
5f40: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
5f50: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
5f60: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5f70: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
5f80: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
5f90: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
5fa0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
5fb0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
5fc0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
5fd0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
5fe0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
5ff0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
6000: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
6010: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
6020: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
6030: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
6040: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
6050: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
6060: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
6070: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6080: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
6090: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
60a0: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
60b0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
60c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
60d0: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
60e0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
60f0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
6100: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
6110: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
6120: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
6130: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
6140: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
6150: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
6160: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
6170: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
6180: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
61a0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
61b0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
61c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
61d0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
61e0: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
61f0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
6200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
6220: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
6230: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
6240: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
6250: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6260: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6270: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
6280: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6290: 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e  me(v, i, p->span
62a0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
62b0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
62c0: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
62d0: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
62e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
62f0: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
6300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6310: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
6320: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
6330: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
6340: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
6350: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
6360: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6370: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6380: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
6390: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
63a0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
63b0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
63c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
63d0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
63e0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
63f0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
6400: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
6410: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
6420: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
6430: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
6440: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
6450: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
6460: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
6470: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
6480: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
6490: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
64a0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
64b0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
64c0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
64d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
64e0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
64f0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
6500: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6510: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
6520: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
6530: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
6540: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
6550: 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20  ectStmt(Parse*, 
6560: 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Select*);../*.**
6570: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
6580: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
6590: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
65a0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
65b0: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
65c0: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
65d0: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
65e0: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
65f0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
6600: 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a  *pParse, char *z
6610: 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20  TabName, Select 
6620: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
6630: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
6640: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
6650: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
6660: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
6670: 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ..  if( prepSele
6680: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
6690: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
66a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
66b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Tab = sqliteMall
66c0: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
66d0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
66e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
66f0: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
6700: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
6710: 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   ? sqliteStrDup(
6720: 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20  zTabName) : 0;. 
6730: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
6740: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61  t->pEList;.  pTa
6750: 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74  b->nCol = pEList
6760: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
6770: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
6780: 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20  );.  pTab->aCol 
6790: 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d  = aCol = sqliteM
67a0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54  alloc( sizeof(pT
67b0: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
67c0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72  b->nCol );.  for
67d0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
67e0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
67f0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
6800: 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20   Expr *p, *pR;. 
6810: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
6820: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
6830: 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65  .    char *zBase
6840: 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63 6e  name;.    int cn
6850: 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47  t;.    .    /* G
6860: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
6870: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
6880: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
6890: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
68a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
68b0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
68c0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
68d0: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d  token.z==0 || p-
68e0: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
68f0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  [0]!=0 );.    if
6900: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
6910: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
6920: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
6930: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
6940: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
6950: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
6960: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
6970: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6980: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6990: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  (zName);.    }el
69a0: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
69b0: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
69c0: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
69d0: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
69e0: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
69f0: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
6a00: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
6a10: 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e  s of the from A.
6a20: 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e  B use B as the n
6a30: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
6a40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
6a50: 6e 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74  ntf("%T", &pR->t
6a60: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oken);.    }else
6a70: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
6a80: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
6a90: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74  {.      /* Use t
6aa0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
6ab0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
6ac0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
6ad0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
6ae0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
6af0: 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e  rintf("%T", &p->
6b00: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
6b10: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c  {.      /* If al
6b20: 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61  l else fails, ma
6b30: 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a  ke up a name */.
6b40: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
6b50: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f  lite3MPrintf("co
6b60: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
6b70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6b80: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
6b90: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
6ba0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
6bb0: 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
6bc0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
6bd0: 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
6be0: 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72  append a integer
6bf0: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
6c00: 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
6c10: 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
6c20: 20 20 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a     zBasename = z
6c30: 4e 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  Name;.    for(j=
6c40: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
6c50: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
6c60: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
6c70: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
6c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
6c90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
6ca0: 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 7a  rintf("%s:%d", z
6cb0: 42 61 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29  Basename, ++cnt)
6cc0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
6cd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6ce0: 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61 6d      if( zBasenam
6cf0: 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  e!=zName ){.    
6d00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 61    sqliteFree(zBa
6d10: 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  sename);.    }. 
6d20: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
6d30: 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20   zName;..    /* 
6d40: 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65  Get the typename
6d50: 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c  , type affinity,
6d60: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
6d70: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a  equence for the.
6d80: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20      ** column.. 
6d90: 20 20 20 2a 2f 0a 20 20 20 20 7a 54 79 70 65 20     */.    zType 
6da0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63  = sqliteStrDup(c
6db0: 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65  olumnType(pParse
6dc0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20  , pSelect->pSrc 
6dd0: 2c 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ,p));.    pCol->
6de0: 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20  zType = zType;. 
6df0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
6e00: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
6e10: 55 4d 45 52 49 43 3b 0a 20 20 20 20 69 66 28 20  UMERIC;.    if( 
6e20: 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 70  zType ){.      p
6e30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
6e40: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
6e50: 79 70 65 28 7a 54 79 70 65 2c 20 73 74 72 6c 65  ype(zType, strle
6e60: 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 20 20 7d  n(zType));.    }
6e70: 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  .    pCol->pColl
6e80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6e90: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
6ea0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 2d  ;.    if( !pCol-
6eb0: 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >pColl ){.      
6ec0: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6ed0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6ee0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oll;.    }.  }. 
6ef0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
6f00: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
6f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
6f20: 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  re a SELECT stat
6f30: 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
6f40: 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68  sing by doing th
6f50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  e following.** t
6f60: 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  hings:.**.**    
6f70: 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
6f80: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
6f90: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
6fa0: 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
6fb0: 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
6fc0: 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
6fd0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
6fe0: 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
6ff0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
7000: 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
7010: 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
7020: 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
7030: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
7040: 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
7050: 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
7060: 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
7070: 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
7080: 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
7090: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
70a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
70b0: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
70c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
70d0: 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
70e0: 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
70f0: 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
7100: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
7110: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
7120: 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
7130: 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
7140: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
7150: 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
7160: 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
7170: 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
7180: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
7190: 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
71a0: 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
71b0: 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
71c0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
71d0: 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
71e0: 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
71f0: 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
7200: 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
7210: 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
7220: 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
7230: 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
7240: 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
7250: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
7260: 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
7270: 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
7280: 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
7290: 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
72a0: 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
72b0: 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
72c0: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
72d0: 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
72e0: 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
72f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
7300: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
7310: 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
7320: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
7330: 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a   in TABLE..**.**
7340: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
7350: 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20  cess.  If there 
7360: 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65  are problems, le
7370: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
7380: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
7390: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
73a0: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
73b0: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
73c0: 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  tmt(Parse *pPars
73d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
73e0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
73f0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
7400: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
7410: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
7420: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72 75  le *pTab;.  stru
7430: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7440: 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70  *pFrom;..  if( p
7450: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
7460: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
7470: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
7480: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
7490: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
74a0: 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
74b0: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
74c0: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
74d0: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
74e0: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
74f0: 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
7500: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
7510: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
7520: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
7530: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b  Parse, p->pSrc);
7540: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
7550: 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
7560: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7570: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
7580: 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
7590: 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
75a0: 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
75b0: 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
75c0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
75d0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
75e0: 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
75f0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
7600: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
7610: 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
7620: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
7630: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
7640: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
7650: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
7660: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
7670: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
7680: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
7690: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
76a0: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
76b0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
76c0: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
76d0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
76e0: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
76f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7700: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
7710: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ->zName==0 ){.  
7720: 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
7730: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
7740: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
7750: 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
7760: 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
7770: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
7780: 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d  ( pFrom->zAlias=
7790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
77a0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20  rom->zAlias =.  
77b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
77c0: 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73  Printf("sqlite_s
77d0: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
77e0: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
77f0: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
7800: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
7810: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
7820: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
7830: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
7840: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
7850: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
7860: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
7870: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
7880: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7890: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
78a0: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
78b0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
78c0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
78d0: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
78e0: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
78f0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
7900: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
7910: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
7920: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
7930: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
7940: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
7950: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
7960: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
7970: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
7980: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
7990: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
79a0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
79b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
79c0: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
79d0: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
79e0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
79f0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
7a00: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
7a10: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
7a20: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
7a30: 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e  e(pParse,pFrom->
7a40: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
7a50: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
7a60: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7a70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7a90: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
7aa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
7ab0: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
7ac0: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
7ad0: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
7ae0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
7af0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
7b00: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
7b10: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
7b20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7b30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b40: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
7b50: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
7b60: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
7b70: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
7b80: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
7b90: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
7ba0: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
7bb0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
7bc0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
7bd0: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
7be0: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
7bf0: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
7c00: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
7c10: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
7c20: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
7c30: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
7c40: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
7c50: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
7c60: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7c70: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
7c80: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
7c90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7ca0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
7cb0: 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
7cc0: 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
7cd0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
7ce0: 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
7cf0: 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65   if( sqliteProce
7d00: 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
7d10: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
7d20: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
7d30: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
7d40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
7d50: 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
7d60: 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
7d70: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
7d80: 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
7d90: 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
7da0: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
7db0: 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
7dc0: 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
7dd0: 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
7de0: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
7df0: 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
7e00: 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
7e10: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
7e20: 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
7e30: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
7e40: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
7e50: 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
7e60: 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
7e70: 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
7e80: 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
7e90: 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
7ea0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
7eb0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7ec0: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
7ed0: 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
7ee0: 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
7ef0: 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
7f00: 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
7f10: 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
7f20: 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
7f30: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
7f40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
7f50: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7f60: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
7f70: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
7f80: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
7f90: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
7fa0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
7fb0: 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70   pE->pRight && p
7fc0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
7fd0: 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26  K_ALL.         &
7fe0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70  & pE->pLeft && p
7ff0: 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
8000: 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _ID ) break;.  }
8010: 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  .  rc = 0;.  if(
8020: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
8030: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
8040: 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
8050: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
8060: 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
8070: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
8080: 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
8090: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
80a0: 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
80b0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
80c0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
80d0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
80e0: 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
80f0: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
8100: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
8110: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8120: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
8130: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
8140: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
8150: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
8160: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
8170: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
8180: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
8190: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
81a0: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
81b0: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
81c0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
81d0: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
81e0: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
81f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
8200: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
8210: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
8220: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
8230: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
8240: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
8250: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
8260: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
8270: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
8280: 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
8290: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
82a0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
82b0: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
82c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
82d0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
82e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
82f0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
8300: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
8310: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
8320: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
8330: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
8340: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
8350: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
8360: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
8370: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
8380: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
8390: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
83a0: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
83b0: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
83c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
83d0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
83e0: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
83f0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
8400: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
8410: 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74  Token(&pE->pLeft
8420: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
8430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8440: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
8450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8460: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
8470: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
8480: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
8490: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
84a0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
84b0: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
84c0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
84d0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
84e0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
84f0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
8500: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
8510: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
8520: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
8530: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
8540: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8550: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
8560: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
8570: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
8580: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
8590: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
85a0: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
85b0: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
85c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
85d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
85e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
85f0: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
8600: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8610: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
8620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
8630: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65  xpr *pExpr, *pLe
8640: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
8650: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
8660: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
8670: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
8680: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
86a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
86b0: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
86c0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
86d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
86e0: 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e  if( (pLeft->join
86f0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
8700: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
8730: 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  ft->pTab, zName)
8740: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
8750: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
8760: 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
8770: 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
8780: 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
87a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
87b0: 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ht */.          
87c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
87f0: 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
8800: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69  ndex(pLeft->pUsi
8810: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
8820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8830: 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
8840: 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
8850: 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
8860: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
8870: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
8880: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
8890: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
88a0: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
88b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
88c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
88d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
88e0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
88f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
8900: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
8910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8920: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
8930: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8940: 73 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74  setToken(&pRight
8950: 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b  ->token, zName);
8960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8970: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54 61   zTabName && pTa
8980: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
8990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
89a0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
89b0: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
89c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
89d0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
89e0: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c  3Expr(TK_DOT, pL
89f0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
8a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8a10: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72  f( pExpr==0 ) br
8a20: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8a30: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65     setToken(&pLe
8a40: 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e  ft->token, zTabN
8a50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
8a60: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45      setToken(&pE
8a70: 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74  xpr->span, sqlit
8a80: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73  e3MPrintf("%s.%s
8a90: 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
8aa0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
8ab0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
8ac0: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  dyn = 1;.       
8ad0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
8ae0: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20  ken.z = 0;.     
8af0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8b00: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20  token.n = 0;.   
8b10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8b20: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
8b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
8b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8b50: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
8b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8b70: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
8b80: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
8b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ba0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
8bb0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
8bc0: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
8bd0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
8be0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8c00: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
8c10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
8c20: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
8c30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8c50: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
8c60: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
8c70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8c90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8ca0: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
8cb0: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
8cc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
8cd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
8ce0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
8cf0: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
8d00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
8d10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8d20: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
8d30: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
8d40: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
8d50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
8d60: 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73  s routine recurs
8d70: 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68  ively unlinks th
8d80: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
8d90: 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a  ].pTab pointers.
8da0: 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73  ** in a select s
8db0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75  tructure.  It ju
8dc0: 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e  st sets the poin
8dd0: 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54  ters to NULL.  T
8de0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
8df0: 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20 74  s recursive in t
8e00: 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 66  he sense that if
8e10: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
8e20: 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20  .a[].pSelect.** 
8e30: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
8e40: 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ULL, this routin
8e50: 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
8e60: 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20  rsively on that 
8e70: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
8e80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8e90: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c  alled on the Sel
8ea0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74 68  ect structure th
8eb0: 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20  at defines a.** 
8ec0: 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f  VIEW in order to
8ed0: 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e   undo any bindin
8ee0: 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54  gs to tables.  T
8ef0: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
8f00: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73  .** because thos
8f10: 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62  e tables might b
8f20: 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73 75  e DROPed by a su
8f30: 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d  bsequent SQL com
8f40: 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mand..** If the 
8f50: 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74  bindings are not
8f60: 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74   removed, then t
8f70: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e  he Select.pSrc->
8f80: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a  a[].pTab field.*
8f90: 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  * will be left p
8fa0: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61  ointing to a dea
8fb0: 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73  llocated Table s
8fc0: 74 72 75 63 74 75 72 65 20 61 66 74 65 72 20 74  tructure after t
8fd0: 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61  he.** DROP and a
8fe0: 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f   coredump will o
8ff0: 63 63 75 72 20 74 68 65 20 6e 65 78 74 20 74 69  ccur the next ti
9000: 6d 65 20 74 68 65 20 56 49 45 57 20 69 73 20 75  me the VIEW is u
9010: 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 30 0a 76 6f  sed..*/.#if 0.vo
9020: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
9030: 55 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70  Unbind(Select *p
9040: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  ){.  int i;.  Sr
9050: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
9060: 3e 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  >pSrc;.  struct 
9070: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
9080: 74 65 6d 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  tem;.  Table *pT
9090: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
90a0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
90b0: 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  =0, pItem=pSrc->
90c0: 61 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  a; i<pSrc->nSrc;
90d0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
90e0: 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
90f0: 70 49 74 65 6d 2d 3e 70 54 61 62 29 21 3d 30 20  pItem->pTab)!=0 
9100: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
9110: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
9120: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9130: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
9140: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
9150: 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
9160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
9170: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
9180: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9190: 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 49  3SelectUnbind(pI
91a0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
91b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
91c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
91d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
91e0: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
91f0: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
9200: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
9210: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
9220: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
9230: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
9240: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
9250: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
9260: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
9270: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
9280: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
9290: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
92a0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
92b0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
92c0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
92d0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
92e0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
92f0: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
9300: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
9310: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
9320: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
9330: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
9340: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
9350: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
9360: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
9370: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
9380: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
9390: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
93a0: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
93b0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
93c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
93d0: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
93e0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
93f0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
9400: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
9410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9420: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
9430: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
9440: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9450: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
9460: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
9470: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
9480: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
9490: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
94a0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
94b0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
94c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
94d0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
94e0: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
94f0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
9500: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
9510: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
9520: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
9530: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
9540: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
9550: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
9560: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
9570: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
9580: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
9590: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
95a0: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
95b0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
95c0: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
95d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
95e0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
95f0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
9600: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
9610: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
9620: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
9630: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
9640: 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  }.  if( prepSele
9650: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
9660: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
9670: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
9680: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
9690: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
96a0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
96b0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
96c0: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
96d0: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
96e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
96f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
9700: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
9710: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
9720: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
9730: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9740: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
9750: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
9760: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
9770: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
9780: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
9790: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
97a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
97b0: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
97c0: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
97d0: 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
97e0: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
97f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9800: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9810: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f  se,.          "O
9820: 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e  RDER BY position
9830: 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65   %d should be be
9840: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
9850: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c  .          iCol,
9860: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
9870: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
9880: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
98a0: 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  ( !mustComplete 
98b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
98c0: 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a    iCol--;.    }.
98d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f      for(j=0; iCo
98e0: 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d  l<0 && j<pEList-
98f0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
9900: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
9910: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
9920: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
9930: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
9940: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
9950: 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62  ar *zName, *zLab
9960: 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  el;.        zNam
9970: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  e = pEList->a[j]
9980: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
9990: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
99a0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
99b0: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  E->token);.     
99c0: 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65     assert( zLabe
99d0: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
99e0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
99f0: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
9a00: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
9a10: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
9a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9a30: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
9a40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9a50: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
9a60: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9a70: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
9a80: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
9a90: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
9aa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9ab0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
9ac0: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
9ad0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
9ae0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
9af0: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
9b00: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
9b10: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
9b20: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
9b30: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
9b40: 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65  <0 && mustComple
9b50: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
9b60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9b70: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44  se,.        "ORD
9b80: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
9b90: 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  r %d does not ma
9ba0: 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63  tch any result c
9bb0: 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20  olumn", i+1);.  
9bc0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
9bd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9be0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
9bf0: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ;  .}../*.** Get
9c00: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
9c10: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
9c20: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
9c30: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
9c40: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
9c50: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9c60: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
9c70: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
9c80: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
9c90: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
9ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
9cb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9cc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
9cd0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
9ce0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
9cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
9d00: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
9d10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
9d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
9d30: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
9d40: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
9d50: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
9d60: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69  ed on the.** nLi
9d70: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20  mit and nOffset 
9d80: 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20  fields.  nLimit 
9d90: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
9da0: 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   the integers.**
9db0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
9dc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
9dd0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
9de0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
9df0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
9e00: 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64  s.  Or that hold
9e10: 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f   -1 and 0 if tho
9e20: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
9e30: 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d  omitted..** iLim
9e40: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
9e50: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
9e60: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
9e70: 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f  umbers for.** co
9e80: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
9e90: 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
9ea0: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
9eb0: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
9ec0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
9ed0: 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74  set, then iLimit
9ee0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
9ef0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
9f00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
9f10: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
9f20: 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   if iLimit and i
9f30: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
9f40: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
9f50: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
9f60: 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  y nLimit and nOf
9f70: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
9f80: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
9f90: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
9fa0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
9fb0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
9fc0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
9fd0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
9fe0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
9ff0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
a000: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d  .** Only if nLim
a010: 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74  it>=0 or nOffset
a020: 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  >0 do the limit 
a030: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
a040: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
a050: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
a060: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
a070: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
a080: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
a090: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
a0a0: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
a0b0: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
a0c0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
a0d0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
a0e0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
a0f0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
a100: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a110: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a  lect *p){.  /* .
a120: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70    ** If the comp
a130: 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69  arison is p->nLi
a140: 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49  mit>0 then "LIMI
a150: 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20  T 0" shows.  ** 
a160: 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73  all rows.  It is
a170: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20   the same as no 
a180: 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f  limit. If the co
a190: 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a  mparision is.  *
a1a0: 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74  * p->nLimit>=0 t
a1b0: 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68  hen "LIMIT 0" sh
a1c0: 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c  ow no rows at al
a1d0: 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  l..  ** "LIMIT -
a1e0: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
a1f0: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
a200: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
a210: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
a220: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
a230: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
a240: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
a250: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
a260: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
a270: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
a280: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
a290: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
a2a0: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
a2b0: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
a2c0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
a2d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a2e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a2f0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a300: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
a310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a320: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
a330: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
a340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a350: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
a360: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64  iMem, 1);.    Vd
a370: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
a380: 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29   LIMIT counter")
a390: 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
a3a0: 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69   = iMem;.  }.  i
a3b0: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  f( p->nOffset>0 
a3c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  ){.    int iMem 
a3d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
a3e0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
a3f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a400: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a410: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
a420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a430: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
a440: 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  r, -p->nOffset, 
a450: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
a460: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a470: 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31  emStore, iMem, 1
a480: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
a490: 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54  nt((v, "# OFFSET
a4a0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
a4b0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d   p->iOffset = iM
a4c0: 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  em;.  }.}../*.**
a4d0: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 69   Generate VDBE i
a4e0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
a4f0: 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61   will open a tra
a500: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61  nsient table tha
a510: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65  t.** will be use
a520: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  d for an index o
a530: 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64  r to store keyed
a540: 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63   results for a c
a550: 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63  ompound.** selec
a560: 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
a570: 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73  ds, open a trans
a580: 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20  ient table that 
a590: 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e  needs a.** KeyIn
a5a0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
a5b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
a5c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49  umns in the KeyI
a5d0: 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nfo is determine
a5e0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75  d.** by the resu
a5f0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a600: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
a610: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  n the second arg
a620: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65  ument..**.** Spe
a630: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
a640: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a650: 64 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64  d to open an ind
a660: 65 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20  ex table for.** 
a670: 44 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c  DISTINCT, UNION,
a680: 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45   INTERSECT and E
a690: 58 43 45 50 54 20 73 65 6c 65 63 74 20 73 74 61  XCEPT select sta
a6a0: 74 65 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74  tements (but not
a6b0: 20 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   .** UNION ALL).
a6c0: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20  .**.** Make the 
a6d0: 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41  new table a KeyA
a6e0: 73 44 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b  sData table if k
a6f0: 65 79 41 73 44 61 74 61 20 69 73 20 74 72 75 65  eyAsData is true
a700: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
a710: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
a720: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
a730: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73   OP_OpenTemp ins
a740: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  truction..*/.sta
a750: 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70  tic int openTemp
a760: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
a770: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
a780: 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65  int iTab, int ke
a790: 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49  yAsData){.  KeyI
a7a0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
a7b0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20   int nColumn;.  
a7c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a7d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
a7e0: 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  i;.  Vdbe *v = p
a7f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a800: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66 28  int addr;..  if(
a810: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
a820: 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
a830: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a840: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70    nColumn = p->p
a850: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
a860: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
a870: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
a880: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75  *pKeyInfo)+nColu
a890: 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  mn*sizeof(CollSe
a8a0: 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65  q*) );.  if( pKe
a8b0: 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  yInfo==0 ) retur
a8c0: 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d  n 0;.  pKeyInfo-
a8d0: 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a  >enc = db->enc;.
a8e0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
a8f0: 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ld = nColumn;.  
a900: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
a910: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b  mn; i++){.    pK
a920: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
a930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
a940: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
a950: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
a960: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
a970: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
a980: 5d 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49  ] ){.      pKeyI
a990: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
a9a0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
a9b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20     }.  }.  addr 
a9c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  = sqlite3VdbeOp3
a9d0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
a9e0: 20 69 54 61 62 2c 20 30 2c 20 0a 20 20 20 20 20   iTab, 0, .     
a9f0: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
aa00: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
aa10: 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79  DOFF);.  if( key
aa20: 41 73 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71  AsData ){.    sq
aa30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
aa40: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
aa50: 69 54 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  iTab, 1);.  }.  
aa60: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
aa70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aa80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
aa90: 45 43 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  ECT./*.** Add th
aaa0: 65 20 61 64 64 72 65 73 73 20 22 61 64 64 72 22  e address "addr"
aab0: 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 61   to the set of a
aac0: 6c 6c 20 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f  ll OpenTemp opco
aad0: 64 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a 20  de addresses.** 
aae0: 74 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 61  that are being a
aaf0: 63 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d  ccumulated in p-
ab00: 3e 70 70 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a  >ppOpenTemp..*/.
ab10: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
ab20: 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64  SelectOpenTempAd
ab30: 64 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  dr(Select *p, in
ab40: 74 20 61 64 64 72 29 7b 0a 20 20 49 64 4c 69 73  t addr){.  IdLis
ab50: 74 20 2a 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70  t *pList = *p->p
ab60: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69  pOpenTemp = sqli
ab70: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
ab80: 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20  *p->ppOpenTemp, 
ab90: 30 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  0);.  if( pList=
aba0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
abb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
abc0: 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c   }.  pList->a[pL
abd0: 69 73 74 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20  ist->nId-1].idx 
abe0: 3d 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e  = addr;.  return
abf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
ac00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ac10: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
ac20: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
ac30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ac40: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
ac50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
ac60: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
ac70: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
ac80: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
ac90: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
aca0: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
acb0: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
acc0: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
acd0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
ace0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
acf0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
ad00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
ad10: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
ad20: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
ad30: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
ad40: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
ad50: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
ad60: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
ad70: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
ad80: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
ad90: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
ada0: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
adb0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
adc0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
add0: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
ade0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
adf0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
ae00: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
ae10: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
ae20: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
ae30: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
ae40: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
ae50: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
ae60: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
ae70: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
ae80: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
ae90: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
aea0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
aeb0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
aec0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
aed0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
aee0: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
aef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
af00: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
af10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
af20: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
af30: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
af40: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
af50: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
af60: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
af70: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
af80: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
af90: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
afa0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
afb0: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
afc0: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
afd0: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
afe0: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
aff0: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
b000: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
b010: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
b020: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
b030: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
b040: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
b050: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
b060: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
b070: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
b080: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
b090: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
b0a0: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
b0b0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
b0c0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
b0d0: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
b0e0: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
b0f0: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
b100: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
b110: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
b120: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
b130: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
b140: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
b150: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
b160: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
b170: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
b180: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
b190: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
b1a0: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
b1b0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
b1c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b1d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
b1e0: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
b1f0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
b200: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
b210: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
b220: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
b230: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
b240: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
b250: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
b260: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
b270: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
b280: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
b290: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
b2a0: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
b2b0: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
b2c0: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
b2d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
b2e0: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
b2f0: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
b300: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
b310: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
b320: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
b330: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
b340: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
b350: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
b360: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
b370: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b380: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
b390: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b3a0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
b3b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
b3c0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
b3d0: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
b3e0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
b3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f             /* \_
b400: 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20  __  Store query 
b410: 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69  results as speci
b420: 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  fied */.  int iP
b430: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
b440: 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73  /* /     by thes
b450: 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73  e two parameters
b460: 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63  .         */.  c
b470: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
b480: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
b490: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
b4a0: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
b4b0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
b4c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
b4d0: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
b4e0: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
b4f0: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
b500: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
b510: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
b520: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
b530: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
b540: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
b550: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
b560: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
b570: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f   */.  IdList *pO
b580: 70 65 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f  penTemp = 0;/* O
b590: 50 5f 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64  P_OpenTemp opcod
b5a0: 65 73 20 74 68 61 74 20 6e 65 65 64 20 61 20 4b  es that need a K
b5b0: 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20  eyInfo */.  int 
b5c0: 61 41 64 64 72 5b 35 5d 3b 20 20 20 20 20 20 20  aAddr[5];       
b5d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 6f    /* Addresses o
b5e0: 66 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20  f SetNumColumns 
b5f0: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
b600: 6e 74 20 6e 41 64 64 72 20 3d 20 30 3b 20 20 20  nt nAddr = 0;   
b610: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75       /* Number u
b620: 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  sed */.  int nCo
b630: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
b640: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b650: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b660: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  t set */..  /* M
b670: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
b680: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
b690: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
b6a0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
b6b0: 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
b6c0: 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
b6d0: 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
b6e0: 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
b6f0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
b700: 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MIT..  */.  if( 
b710: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
b720: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
b730: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
b740: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b750: 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d   }.  pPrior = p-
b760: 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  >pPrior;.  if( p
b770: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
b780: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b790: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
b7a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
b7b0: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
b7c0: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
b7d0: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
b7e0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
b7f0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
b800: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b810: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
b820: 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  rior->nLimit>=0 
b830: 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73  || pPrior->nOffs
b840: 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et>0 ){.    sqli
b850: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b860: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
b870: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
b880: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
b890: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
b8a0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
b8b0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
b8c0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
b8d0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
b8e0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
b8f0: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
b900: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
b910: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
b920: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
b930: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b940: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
b950: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
b960: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
b970: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
b980: 20 20 2f 2a 20 49 66 20 2a 70 20 74 68 69 73 20    /* If *p this 
b990: 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
b9a0: 74 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  t select stateme
b9b0: 6e 74 2c 20 74 68 65 6e 20 69 6e 69 74 69 61 6c  nt, then initial
b9c0: 69 7a 65 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70  ize.  ** p->ppOp
b9d0: 65 6e 54 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20  enTemp to point 
b9e0: 74 6f 20 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49  to pOpenTemp.  I
b9f0: 66 20 2a 70 20 69 73 20 6e 6f 74 20 74 68 65 20  f *p is not the 
ba00: 72 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20  right most.  ** 
ba10: 73 74 61 74 65 6d 65 6e 74 20 74 68 65 6e 20 70  statement then p
ba20: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c  ->ppOpenTemp wil
ba30: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
ba40: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  een initialized.
ba50: 20 20 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20    ** by a prior 
ba60: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 73 61 6d  call to this sam
ba70: 65 20 70 72 6f 63 65 64 75 72 65 2e 20 20 50 61  e procedure.  Pa
ba80: 73 73 20 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70  ss along the pOp
ba90: 65 6e 54 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e  enTemp.  ** poin
baa0: 74 65 72 20 74 6f 20 70 50 72 69 6f 72 2c 20 74  ter to pPrior, t
bab0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
bac0: 74 20 74 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20  t to our left.. 
bad0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f   */.  if( p->ppO
bae0: 70 65 6e 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  penTemp==0 ){.  
baf0: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
bb00: 3d 20 26 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20  = &pOpenTemp;.  
bb10: 7d 0a 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70  }.  pPrior->ppOp
bb20: 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70  enTemp = p->ppOp
bb30: 65 6e 54 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72  enTemp;..  /* Cr
bb40: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
bb50: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
bb60: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
bb70: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
bb80: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
bb90: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
bba0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
bbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bbc0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
bbd0: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
bbe0: 20 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3d    assert( nAddr=
bbf0: 3d 30 20 29 3b 0a 20 20 20 20 61 41 64 64 72 5b  =0 );.    aAddr[
bc00: 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74  nAddr++] = sqlit
bc10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bc20: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
bc30: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
bc40: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
bc50: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
bc60: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
bc70: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
bc80: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
bc90: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
bca0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
bcb0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
bcc0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
bcd0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
bce0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d      pPrior->nLim
bcf0: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
bd00: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
bd10: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
bd20: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
bd30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
bd40: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
bd50: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
bd60: 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29 3b  , 0, 0, aff, 0);
bd70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
bd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
bd90: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bda0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
bdb0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
bdc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
bdd0: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
bde0: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
bdf0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
be00: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
be10: 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74         p->nLimit
be20: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70   = -1;.        p
be30: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
be40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
be50: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
be60: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
be70: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c  m, 0, 0, 0, aff,
be80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   0);.        p->
be90: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
bea0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
beb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
bec0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bed0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
bee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bef0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
bf00: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
bf10: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
bf20: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
bf30: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
bf40: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
bf50: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
bf60: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
bf70: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
bf80: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
bf90: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
bfa0: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
bfb0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
bfc0: 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20  int op = 0;     
bfd0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
bfe0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
bff0: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
c000: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
c010: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
c020: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
c030: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
c040: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
c050: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e     int nLimit, n
c060: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
c070: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
c080: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
c090: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  set */.      Exp
c0a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
c0b0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
c0c0: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65  Y clause for the
c0d0: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f   right SELECT */
c0e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
c0f0: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
c100: 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  = p->op==TK_ALL 
c110: 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52  ? SRT_Table : SR
c120: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
c130: 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  f( eDest==priorO
c140: 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79  p && p->pOrderBy
c150: 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74  ==0 && p->nLimit
c160: 3c 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74  <0 && p->nOffset
c170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
c180: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
c190: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c1a0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
c1b0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
c1c0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
c1d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c1e0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50     unionTab = iP
c1f0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
c200: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
c210: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
c220: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
c230: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
c240: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
c250: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
c260: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
c270: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
c280: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
c290: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Tab++;.        i
c2a0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a  f( p->pOrderBy .
c2b0: 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68          && match
c2c0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
c2d0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
c2e0: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
c2f0: 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 1) ){.        
c300: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
c310: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c320: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
c340: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c350: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
c360: 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  emp, unionTab, 0
c370: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
c380: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
c390: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
c3a0: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65  ultiSelectOpenTe
c3b0: 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b  mpAddr(p, addr);
c3c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
c3d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
c3f0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c400: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  d;.          }. 
c410: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c430: 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e  KeyAsData, union
c440: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
c450: 20 7d 0a 09 61 73 73 65 72 74 28 20 6e 41 64 64   }..assert( nAdd
c460: 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f  r<sizeof(aAddr)/
c470: 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29  sizeof(aAddr[0])
c480: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 41 64 64   );.        aAdd
c490: 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c  r[nAddr++] = sql
c4a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c4b0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
c4c0: 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  s, unionTab, 0);
c4d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c4e0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
c4f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c500: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
c510: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
c520: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
c530: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c540: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c550: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
c560: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
c570: 2c 20 30 2c 20 61 66 66 2c 20 30 29 3b 0a 20 20  , 0, aff, 0);.  
c580: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c590: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c5a0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c5b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c5c0: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
c5d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c5e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c5f0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
c600: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
c610: 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20  K_EXCEPT:  op = 
c620: 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72  SRT_Except;   br
c630: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
c640: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f  se TK_UNION:   o
c650: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20  p = SRT_Union;  
c660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c670: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
c680: 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c     op = SRT_Tabl
c690: 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  e;    break;.   
c6a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
c6b0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c6c0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
c6d0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d  rderBy;.      p-
c6e0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
c6f0: 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d       nLimit = p-
c700: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >nLimit;.      p
c710: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
c720: 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70       nOffset = p
c730: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->nOffset;.     
c740: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
c750: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c760: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c770: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
c780: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c  b, 0, 0, 0, aff,
c790: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
c7a0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
c7b0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
c7c0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
c7d0: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e     p->nLimit = n
c7e0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
c7f0: 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65  nOffset = nOffse
c800: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
c810: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  it = -1;.      p
c820: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
c830: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
c840: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c850: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c860: 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
c870: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
c880: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
c890: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
c8a0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
c8b0: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
c8c0: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
c8d0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
c8e0: 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65    .      if( eDe
c8f0: 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
c900: 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29  nionTab!=iParm )
c910: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
c920: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
c930: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
c940: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
c950: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44  ;.        if( eD
c960: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
c970: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  k ){.          g
c980: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
c990: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d  es(pParse, 0, p-
c9a0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
c9b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
c9c0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
c9d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
c9e0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
c9f0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ca00: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
ca10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ca20: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
ca30: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
ca40: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
ca50: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
ca60: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
ca70: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
ca80: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ca90: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  dr(v);.        r
caa0: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
cab0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
cac0: 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
cad0: 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
cae0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
cb10: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
cb20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
cb50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
cb60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
cb70: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
cb80: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
cb90: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
cba0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
cbb0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cbc0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
cbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cbe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
cbf0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
cc00: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
cc10: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
cc20: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
cc30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cc40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cc50: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
cc60: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cc70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cc80: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
cc90: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
cca0: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
ccb0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
ccc0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
ccd0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
cce0: 2c 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  , nOffset;.     
ccf0: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
cd00: 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
cd10: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
cd20: 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
cd30: 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
cd40: 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
cd50: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
cd60: 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
cd70: 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
cd80: 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
cd90: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
cda0: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
cdb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
cdc0: 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
cdd0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
cde0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
cdf0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
ce00: 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63  pOrderBy && matc
ce10: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
ce20: 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72  (pParse,p,p->pOr
ce30: 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b  derBy,tab1,1) ){
ce40: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
ce50: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
ce60: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ce70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ce80: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ce90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
cea0: 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b  nTemp, tab1, 0);
ceb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  .      rc = mult
cec0: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
ced0: 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20  ddr(p, addr);.  
cee0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cef0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
cf00: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
cf10: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
cf20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
cf40: 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29  AsData, tab1, 1)
cf50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cf60: 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64  nAddr<sizeof(aAd
cf70: 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72  dr)/sizeof(aAddr
cf80: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 41  [0]) );.      aA
cf90: 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73  ddr[nAddr++] = s
cfa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cfb0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
cfc0: 6d 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  mns, tab1, 0);. 
cfd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cfe0: 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
cff0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
d000: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
d010: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
d020: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
d030: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
d040: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d050: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
d060: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c  SRT_Union, tab1,
d070: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20 30   0, 0, 0, aff, 0
d080: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d090: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
d0a0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d0b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d0c0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
d0d0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
d0e0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d0f0: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
d100: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
d110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d120: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
d130: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ab2, 0);.      r
d140: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
d150: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
d160: 64 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ddr);.      if( 
d170: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d180: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d190: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d1b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d1c0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
d1d0: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
d1e0: 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69  assert( nAddr<si
d1f0: 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65  zeof(aAddr)/size
d200: 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a  of(aAddr[0]) );.
d210: 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64        aAddr[nAdd
d220: 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  r++] = sqlite3Vd
d230: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
d240: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62  tNumColumns, tab
d250: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  2, 0);.      p->
d260: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
d270: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
d280: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
d290: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
d2a0: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
d2b0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
d2c0: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
d2d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d2e0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d2f0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
d300: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c  2, 0, 0, 0, aff,
d310: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
d320: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
d330: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
d340: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
d350: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
d360: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
d370: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
d380: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d390: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
d3a0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
d3b0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
d3c0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
d3d0: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
d3e0: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
d3f0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
d400: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d410: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
d420: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
d430: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
d440: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
d450: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
d460: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
d470: 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
d480: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d490: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d4a0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
d4b0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d4c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d4d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
d4e0: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
d4f0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  eak);.      comp
d500: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
d510: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
d520: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
d530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d540: 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62   OP_FullKey, tab
d550: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
d560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d570: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
d580: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
d590: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
d5a0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
d5b0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
d5c0: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
d5d0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
d600: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
d610: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d630: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
d640: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d650: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
d660: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
d670: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d690: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d6a0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
d6b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d6c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d6d0: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
d6e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d6f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d700: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
d710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d720: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
d730: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
d740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d750: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d760: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
d770: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
d780: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d790: 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
d7a0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
d7b0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
d7c0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
d7d0: 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
d7e0: 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
d7f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d800: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
d810: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
d820: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
d830: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
d840: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
d850: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d860: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
d870: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d880: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
d890: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
d8a0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d8b0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
d8c0: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
d8d0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
d8e0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d8f0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d900: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
d910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
d920: 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  mns in temporary
d930: 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e   tables.  */.  n
d940: 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
d950: 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28  >nExpr;.  while(
d960: 20 6e 41 64 64 72 3e 30 20 29 7b 0a 20 20 20 20   nAddr>0 ){.    
d970: 6e 41 64 64 72 2d 2d 3b 0a 20 20 20 20 73 71 6c  nAddr--;.    sql
d980: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
d990: 28 76 2c 20 61 41 64 64 72 5b 6e 41 64 64 72 5d  (v, aAddr[nAddr]
d9a0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
d9b0: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
d9c0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
d9d0: 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
d9e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
d9f0: 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
da00: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
da10: 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
da20: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
da30: 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
da40: 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
da50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
da60: 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
da70: 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
da80: 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
da90: 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
daa0: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
dab0: 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
dac0: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
dad0: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
dae0: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
daf0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
db00: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
db10: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
db20: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
db30: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
db40: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
db50: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
db60: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
db70: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
db80: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
db90: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
dba0: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
dbb0: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
dbc0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28  p->pOrderBy || (
dbd0: 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 70 4f 70  pOpenTemp && pOp
dbe0: 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29 20 29  enTemp->nId>0) )
dbf0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dc20: 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
dc30: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
dc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
dc50: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
dc60: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
dc70: 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
dc80: 28 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20  ( p->ppOpenTemp 
dc90: 3d 3d 20 26 70 4f 70 65 6e 54 65 6d 70 20 29 3b  == &pOpenTemp );
dca0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
dcb0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
dcc0: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e  eof(*pKeyInfo)+n
dcd0: 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  Col*sizeof(CollS
dce0: 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 21  eq*));.    if( !
dcf0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
dd00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
dd10: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
dd20: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
dd30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65  ;.    }..    pKe
dd40: 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61  yInfo->enc = pPa
dd50: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
dd60: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
dd70: 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20  ld = nCol;..    
dd80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
dd90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4b 65   i++){.      pKe
dda0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
ddb0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
ddc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
ddd0: 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  i);.      if( !p
dde0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
ddf0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ] ){.        pKe
de00: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
de10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
de20: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
de30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
de40: 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70 20 26  i=0; pOpenTemp &
de50: 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e  & i<pOpenTemp->n
de60: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; i++){.      
de70: 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28 69 3d  int p3type = (i=
de80: 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  =0?P3_KEYINFO_HA
de90: 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e 46 4f  NDOFF:P3_KEYINFO
dea0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
deb0: 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 61  r = pOpenTemp->a
dec0: 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 73  [i].idx;.      s
ded0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
dee0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
def0: 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33  r *)pKeyInfo, p3
df00: 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  type);.    }..  
df10: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
df20: 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  y ){.      struc
df30: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
df40: 2a 70 4f 72 64 65 72 42 79 54 65 72 6d 20 3d 20  *pOrderByTerm = 
df50: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
df60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
df70: 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
df80: 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 72 64 65 72  xpr; i++, pOrder
df90: 42 79 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ByTerm++){.     
dfa0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
dfb0: 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e 70   pOrderByTerm->p
dfc0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68  Expr;.        ch
dfd0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72 64  ar *zName = pOrd
dfe0: 65 72 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b  erByTerm->zName;
dff0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e000: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
e010: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
e020: 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a  iColumn<nCol );.
e030: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e040: 21 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  !pExpr->pColl );
e050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
e060: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
e070: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
e080: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
e090: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  Seq(pParse, zNam
e0a0: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
e0b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e0c0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
e0d0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
e0e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b  pExpr->iColumn];
e0f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e100: 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74   }.      generat
e110: 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
e120: 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  , p, v, p->pELis
e130: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
e140: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a   iParm);.    }..
e150: 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65      if( !pOpenTe
e160: 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  mp ){.      /* T
e170: 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
e180: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
e190: 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20  DER BY */.      
e1a0: 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49  sqliteFree(pKeyI
e1b0: 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nfo);.    }.  }.
e1c0: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
e1d0: 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65  d:.  if( pOpenTe
e1e0: 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mp ){.    sqlite
e1f0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f  3IdListDelete(pO
e200: 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20  penTemp);.  }.  
e210: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  p->ppOpenTemp = 
e220: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
e230: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e240: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e250: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
e260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e270: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  VIEW./*.** Scan 
e280: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
e290: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
e2a0: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
e2b0: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
e2c0: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
e2d0: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
e2e0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
e2f0: 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
e300: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
e310: 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
e320: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
e330: 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
e340: 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
e350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e360: 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
e370: 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
e380: 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
e390: 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
e3a0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
e3b0: 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
e3c0: 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
e3d0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
e3e0: 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
e3f0: 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
e400: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
e410: 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
e420: 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
e430: 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
e440: 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
e450: 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
e460: 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
e470: 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
e480: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
e490: 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
e4a0: 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
e4b0: 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
e4c0: 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
e4d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
e4e0: 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
e4f0: 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45  (ExprList*,int,E
e500: 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46  xprList*);  /* F
e510: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
e520: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
e530: 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
e540: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
e550: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
e560: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
e570: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
e580: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
e590: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
e5a0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
e5b0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
e5c0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
e5d0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e5e0: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
e5f0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
e600: 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
e610: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
e620: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
e630: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
e640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e650: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
e660: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
e670: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
e680: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
e690: 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
e6a0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
e6b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
e6c0: 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
e6d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
e6e0: 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
e6f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e700: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
e710: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
e720: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
e730: 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
e740: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e750: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
e760: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
e770: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
e780: 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68  rDup(pNew->pRigh
e790: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
e7a0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
e7b0: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
e7c0: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
e7d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  3ExprListDup(pNe
e7e0: 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  w->pList);.     
e7f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
e800: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20   pNew->iTable;. 
e810: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
e820: 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c  umn = pNew->iCol
e830: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72  umn;.      pExpr
e840: 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69  ->iAgg = pNew->i
e850: 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Agg;.      sqlit
e860: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
e870: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
e880: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
e890: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
e8a0: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  (&pExpr->span, &
e8b0: 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
e8c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
e8d0: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
e8e0: 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
e8f0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
e900: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52  stExpr(pExpr->pR
e910: 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
e920: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
e930: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
e940: 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
e950: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
e960: 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74  atic void .subst
e970: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
e980: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54  t *pList, int iT
e990: 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  able, ExprList *
e9a0: 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  pEList){.  int i
e9b0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
e9c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
e9d0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e9e0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e9f0: 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d  substExpr(pList-
ea00: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
ea10: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
ea20: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
ea30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ea40: 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
ea50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ea60: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _VIEW./*.** This
ea70: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
ea80: 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
ea90: 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72  queries in order
eaa0: 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65   to speed.** exe
eab0: 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75  cution.  It retu
eac0: 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
ead0: 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
eae0: 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
eaf0: 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  .** occurs..**.*
eb00: 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
eb10: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
eb20: 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
eb30: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
eb40: 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
eb50: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
eb60: 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
eb70: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
eb80: 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
eb90: 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
eba0: 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
ebb0: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
ebc0: 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
ebd0: 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
ebe0: 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
ebf0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
ec00: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
ec10: 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
ec20: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ec30: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
ec40: 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
ec50: 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
ec60: 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
ec70: 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
ec80: 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
ec90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
eca0: 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
ecb0: 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
ecc0: 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
ecd0: 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
ece0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
ecf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ed00: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
ed10: 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
ed20: 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
ed30: 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
ed40: 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
ed50: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
ed60: 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
ed70: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
ed80: 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
ed90: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
eda0: 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
edb0: 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
edc0: 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
edd0: 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
ede0: 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
edf0: 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
ee00: 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
ee10: 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
ee20: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
ee30: 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
ee40: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
ee50: 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
ee60: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
ee70: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
ee80: 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
ee90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
eea0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
eeb0: 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
eec0: 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
eed0: 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
eee0: 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
eef0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
ef00: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
ef10: 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
ef20: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
ef30: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
ef40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
ef50: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
ef60: 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
ef70: 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
ef80: 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a  uter join, or.**
ef90: 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71          the subq
efa0: 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65  uery is not itse
efb0: 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63  lf a join.  (Tic
efc0: 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20  ket #306).**.** 
efd0: 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
efe0: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
eff0: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
f000: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f010: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35  join..**.**   (5
f020: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f030: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
f040: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f050: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
f060: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
f070: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ates..**.**   (6
f080: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f090: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
f0a0: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
f0b0: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f0c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
f0d0: 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
f0e0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f0f0: 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
f100: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  e..**.**   (8)  
f110: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
f120: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
f130: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f140: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
f150: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
f160: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f170: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
f180: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f190: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
f1a0: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
f1b0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
f1c0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
f1d0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
f1e0: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
f1f0: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
f200: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
f210: 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
f220: 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
f230: 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
f240: 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
f250: 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
f260: 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
f270: 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (12)  The subque
f280: 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
f290: 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
f2a0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72  FT OUTER JOIN or
f2b0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
f2c0: 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
f2d0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61  HERE clause.  (a
f2e0: 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  dded by ticket #
f2f0: 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  350).**.** In th
f300: 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
f310: 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
f320: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f330: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
f340: 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
f350: 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
f360: 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
f370: 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
f380: 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
f390: 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
f3a0: 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
f3b0: 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
f3c0: 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
f3d0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
f3e0: 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
f3f0: 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
f400: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
f410: 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
f420: 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
f430: 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
f440: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
f450: 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
f460: 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
f470: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
f480: 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
f490: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f4a0: 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
f4b0: 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
f4c0: 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
f4d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
f4e0: 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
f4f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f500: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
f510: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f520: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
f530: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
f540: 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
f550: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
f560: 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
f570: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
f580: 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
f590: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
f5a0: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
f5b0: 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
f5c0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
f5d0: 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
f5e0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
f5f0: 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
f600: 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
f610: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
f620: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
f630: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
f640: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
f650: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
f660: 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
f670: 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72  ubquery" */.  Sr
f680: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
f690: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
f6a0: 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
f6b0: 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
f6c0: 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
f6d0: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
f6e0: 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
f6f0: 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
f700: 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
f710: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
f720: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
f730: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
f740: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
f750: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
f760: 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
f770: 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
f780: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
f790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f7a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
f7b0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
f7e0: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
f7f0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
f800: 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
f810: 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a  he subquery */..
f820: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
f830: 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
f840: 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
f850: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
f860: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
f870: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
f880: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
f890: 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
f8a0: 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
f8b0: 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
f8c0: 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
f8d0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
f8e0: 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
f8f0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
f900: 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
f910: 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
f920: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
f930: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75  turn 0;.  if( su
f940: 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
f950: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
f960: 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72  turn 0;.  pSubSr
f970: 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
f980: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
f990: 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53  c );.  if( pSubS
f9a0: 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
f9b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
f9c0: 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  Sub->isDistinct 
f9d0: 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  || pSub->nLimit>
f9e0: 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e  =0) &&  (pSrc->n
f9f0: 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
fa00: 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
fa10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  ;.  }.  if( (p->
fa20: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d  isDistinct || p-
fa30: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73  >nLimit>=0) && s
fa40: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
fa50: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
fa60: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
fa70: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
fa80: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52  eturn 0;..  /* R
fa90: 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
faa0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
fab0: 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
fac0: 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
fad0: 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
fae0: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
faf0: 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
fb00: 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
fb10: 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
fb20: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
fb30: 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
fb40: 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
fb50: 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
fb60: 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
fb70: 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
fb80: 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
fb90: 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
fba0: 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
fbb0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
fbc0: 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
fbd0: 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
fbe0: 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
fbf0: 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  thing..  */.  if
fc00: 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
fc10: 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20  1 && iFrom>0 && 
fc20: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
fc30: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
fc40: 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
fc50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
fc60: 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
fc70: 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
fc80: 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
fc90: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
fca0: 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
fcb0: 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
fcc0: 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
fcd0: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
fce0: 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
fcf0: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
fd00: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
fd10: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
fd20: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
fd30: 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
fd40: 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
fd50: 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
fd60: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
fd70: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
fd80: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
fd90: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
fda0: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
fdb0: 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
fdc0: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
fdd0: 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
fde0: 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
fdf0: 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
fe00: 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
fe10: 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
fe20: 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
fe30: 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
fe40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72  ..  */.  if( iFr
fe50: 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
fe60: 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
fe70: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
fe80: 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62  0 .      && pSub
fe90: 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
fea0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
feb0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
fec0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
fed0: 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
fee0: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
fef0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
ff00: 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
ff10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
ff20: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
ff30: 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
ff40: 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
ff50: 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
ff60: 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
ff70: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
ff80: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
ff90: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
ffa0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
ffb0: 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
ffc0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
ffd0: 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
ffe0: 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
fff0: 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
10000 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
10010 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
10020 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
10030 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
10040 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
10050 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
10060 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
10070 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
10080 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
10090 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
100a0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
100b0 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
100c0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
100d0 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
100e0 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
100f0 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
10100 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
10110 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
10120 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
10130 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
10140 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74  c;.    int joint
10150 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
10160 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 54 61  jointype;.    Ta
10170 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 75 62  ble *pTab = pSub
10180 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  item->pTab;..   
10190 20 69 66 28 20 70 54 61 62 20 26 26 20 70 54 61   if( pTab && pTa
101a0 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
101b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
101c0 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
101d0 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20  ubitem->pTab);. 
101e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
101f0 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ree(pSubitem->zD
10200 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
10210 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65  liteFree(pSubite
10220 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
10230 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74  qliteFree(pSubit
10240 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
10250 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
10260 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
10270 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
10280 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
10290 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
102a0 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
102b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
102c0 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29  pend(pSrc, 0, 0)
102d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
102e0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
102f0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
10300 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
10310 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
10320 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
10330 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
10340 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
10350 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
10360 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
10370 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
10380 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
10390 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
103a0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
103b0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
103c0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
103d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
103e0 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53  c->a[iFrom+nSubS
103f0 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
10400 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a   jointype;.  }..
10410 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
10420 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
10430 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
10440 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
10450 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
10460 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
10470 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
10480 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45  ry..  ** .  ** E
10490 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
104a0 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
104b0 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
104c0 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
104d0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
104e0 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20  HERE a>b;.  **  
104f0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
10500 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
10510 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
10520 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
10530 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f      /.  **    \_
10540 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10550 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
10560 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
10570 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
10580 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f  .  **.  ** We lo
10590 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
105a0 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
105b0 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
105c0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
105d0 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62  .  ** "a" we sub
105e0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
105f0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
10600 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
10610 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
10620 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c   */.  substExprL
10630 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69  ist(p->pEList, i
10640 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
10650 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d  List);.  pList =
10660 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
10670 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
10680 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10690 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
106a0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
106b0 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
106c0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
106d0 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
106e0 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  z!=0 ){.      pL
106f0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
10700 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
10710 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
10720 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
10730 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
10740 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73  sAgg ){.    subs
10750 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
10760 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
10770 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10780 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
10790 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
107a0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
107b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
107c0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
107d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
107e0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
107f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
10800 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
10810 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
10820 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
10830 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
10840 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
10850 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
10860 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
10870 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
10880 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
10890 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
108a0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
108b0 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65  b->pWhere);.  }e
108c0 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20  lse{.    pWhere 
108d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
108e0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
108f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10900 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
10910 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d   p->pHaving = p-
10920 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e  >pWhere;.    p->
10930 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
10940 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10950 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
10960 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10970 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
10980 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
10990 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73  nd(p->pHaving, s
109a0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
109b0 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20  ub->pHaving));. 
109c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
109d0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
109e0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
109f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
10a00 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  p(pSub->pGroupBy
10a10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10a20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
10a30 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
10a40 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
10a50 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
10a60 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
10a70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
10a80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c    }..  /* The fl
10a90 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
10aa0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
10ab0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
10ac0 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20   the.  ** outer 
10ad0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
10ae0 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73  t. .  */.  p->is
10af0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
10b00 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
10b10 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
10b20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
10b30 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
10b40 6e 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  n from the subqu
10b50 65 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ery to the outer
10b60 0a 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a  .  ** query..  *
10b70 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c  /.  if( pSub->nL
10b80 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
10b90 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29  f( p->nLimit<0 )
10ba0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
10bb0 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
10bc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10bd0 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66  p->nLimit+p->nOf
10be0 66 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69  fset > pSub->nLi
10bf0 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65  mit+pSub->nOffse
10c00 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  t ){.      p->nL
10c10 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69  imit = pSub->nLi
10c20 6d 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66  mit + pSub->nOff
10c30 73 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74  set - p->nOffset
10c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
10c50 3e 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62  >nOffset += pSub
10c60 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  ->nOffset;..  /*
10c70 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
10c80 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
10c90 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
10ca0 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
10cb0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
10cc0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10cd0 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
10ce0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
10cf0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
10d00 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
10d10 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
10d20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
10d30 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
10d40 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
10d50 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
10d60 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
10d70 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
10d80 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
10d90 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
10da0 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
10db0 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
10dc0 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
10dd0 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
10de0 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
10df0 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
10e00 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
10e10 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
10e20 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
10e30 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
10e40 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
10e50 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
10e60 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
10e70 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
10e80 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
10e90 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
10ea0 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
10eb0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
10ec0 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
10ed0 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
10ee0 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
10ef0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
10f00 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
10f10 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
10f20 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
10f30 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
10f40 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
10f50 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
10f60 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
10f70 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
10f80 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
10f90 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
10fa0 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
10fb0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
10fc0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
10fd0 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
10fe0 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
10ff0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
11000 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
11010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e  sqlite3Select().
11020 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
11030 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
11040 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
11050 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11060 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
11070 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
11080 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
11090 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
110a0 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
110b0 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
110c0 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
110d0 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
110e0 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
110f0 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
11100 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65  dbe *v;.  int se
11110 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  ekOp;.  int cont
11120 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
11130 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c  List, *pList, eL
11140 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
11150 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
11160 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74  tItem;.  SrcList
11170 20 2a 70 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68   *pSrc;..  /* Ch
11180 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
11190 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69  is query is a si
111a0 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
111b0 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75  x() query.  Retu
111c0 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20  rn.  ** zero if 
111d0 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f  it is  not..  */
111e0 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
111f0 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67  By || p->pHaving
11200 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20   || p->pWhere ) 
11210 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
11220 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
11230 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
11240 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
11250 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
11260 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
11270 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
11280 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  n 0;.  pExpr = p
11290 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
112a0 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
112b0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
112c0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
112d0 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
112e0 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  >pList;.  if( pL
112f0 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ist==0 || pList-
11300 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
11310 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
11320 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
11330 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
11340 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11350 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
11360 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
11370 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
11380 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
11390 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
113a0 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
113b0 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
113c0 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
113d0 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
113e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
113f0 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
11400 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
11410 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
11420 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
11430 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
11440 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
11450 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
11460 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
11470 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
11480 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
11490 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
114a0 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
114b0 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
114c0 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
114d0 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
114e0 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
114f0 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
11500 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
11510 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
11520 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
11530 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
11540 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
11550 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
11560 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
11570 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
11580 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
11590 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
115a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
115b0 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
115c0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
115d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
115e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
115f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
11600 70 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  pr);.    for(pId
11610 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
11620 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
11630 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
11640 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
11650 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20  lumn>=1 );.     
11660 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
11670 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20  umn[0]==iCol && 
11680 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
11690 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20  oll[0]==pColl ) 
116a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
116b0 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
116c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
116d0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
116e0 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
116f0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
11700 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
11710 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
11720 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
11730 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
11740 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
11750 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
11760 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
11770 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
11780 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
11790 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
117a0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
117b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
117c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
117d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
117e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
117f0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
11800 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
11810 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
11820 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
11830 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
11840 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
11850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11860 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
11870 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
11880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11890 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
118a0 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ns, iParm, 1);. 
118b0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
118c0 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
118d0 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
118e0 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
118f0 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
11900 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
11910 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
11920 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
11930 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
11940 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
11950 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
11960 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
11970 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
11980 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
11990 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
119a0 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
119b0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ble..  */.  sqli
119c0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
119d0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
119e0 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d  ->iDb);.  base =
119f0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
11a00 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  sor;.  computeLi
11a10 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
11a20 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
11a30 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
11a40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
11a50 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52  te3OpenTableForR
11a60 65 61 64 69 6e 67 28 76 2c 20 62 61 73 65 2c 20  eading(v, base, 
11a70 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e  pTab);.  }.  con
11a80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11a90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
11aa0 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
11ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ac0 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61  Op(v, seekOp, ba
11ad0 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  se, 0);.  }else{
11ae0 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  .    /* Even tho
11af0 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75  ugh the cursor u
11b00 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
11b10 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c  index here is cl
11b20 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73  osed.    ** as s
11b30 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20  oon as a single 
11b40 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72  value has been r
11b50 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c  ead from it, all
11b60 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  ocate it.    ** 
11b70 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e  using (pParse->n
11b80 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e  Tab++) to preven
11b90 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20  t the cursor id 
11ba0 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20  from being .    
11bb0 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20  ** reused. This 
11bc0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  is important for
11bd0 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
11be0 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20  he form .    ** 
11bf0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53  "INSERT INTO x S
11c00 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d  ELECT max() FROM
11c10 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   x"..    */.    
11c20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 69 49  int iIdx;.    iI
11c30 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
11c40 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
11c50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11c60 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69  Integer, pIdx->i
11c70 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
11c80 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
11c90 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c  _OpenRead, iIdx,
11ca0 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20   pIdx->tnum,.   
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65  (char*)&pIdx->ke
11cd0 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
11ce0 4f 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b  O);.    if( seek
11cf0 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b  Op==OP_Rewind ){
11d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11d10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
11d20 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
11d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11d40 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
11d50 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  cord, 1, 0);.   
11d60 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
11d70 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20  oveGt;.    }.   
11d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d90 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
11da0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
11db0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11dc0 50 5f 49 64 78 52 65 63 6e 6f 2c 20 69 49 64 78  P_IdxRecno, iIdx
11dd0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11de0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11df0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
11e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11e10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
11e20 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
11e30 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
11e40 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
11e50 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
11e60 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
11e70 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
11e80 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
11e90 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
11ea0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
11eb0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
11ec0 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
11ed0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
11ee0 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
11ef0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
11f00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11f10 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
11f20 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11f30 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
11f40 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
11f50 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
11f60 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
11f70 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
11f80 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
11f90 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
11fa0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
11fb0 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
11fc0 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20  .**.** An ORDER 
11fd0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69  BY or GROUP BY i
11fe0 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
11ff0 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79  essions.  If any
12000 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
12010 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
12020 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
12030 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
12040 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a  eplaced by the.*
12050 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
12060 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73  entry in the res
12070 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
12080 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72  ic int processOr
12090 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61  derGroupBy(.  Pa
120a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
120b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
120c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
120d0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
120e0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
120f0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
12100 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
12110 73 73 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ssed */.  SrcLis
12120 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
12130 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
12140 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
12150 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
12160 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
12170 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
12180 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61   *pNC,     /* Na
12190 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  me context for e
121a0 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a  nclosing query *
121b0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
121c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
121d0 65 20 69 66 20 61 67 67 72 65 67 61 74 65 20 66  e if aggregate f
121e0 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 76  unctions are inv
121f0 6f 6c 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  olved */.  const
12200 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
12210 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45   /* Either "ORDE
12220 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61  R" or "GROUP", a
12230 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
12240 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
12250 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
12260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
12270 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
12280 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12290 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
122a0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
122b0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
122c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
122d0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
122e0 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f  E, &iCol) && iCo
122f0 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
12300 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
12310 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
12320 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20  elete(pE);.     
12330 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e   pE = pOrderBy->
12340 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
12350 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
12360 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
12370 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
12380 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
12390 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72  esolveNames(pPar
123a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
123b0 4c 69 73 74 2c 20 70 4e 43 2c 20 70 45 2c 20 69  List, pNC, pE, i
123c0 73 41 67 67 2c 20 31 29 20 29 7b 0a 20 20 20 20  sAgg, 1) ){.    
123d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
123e0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
123f0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
12400 70 45 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pE) ){.      if(
12410 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12420 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
12430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
12440 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12450 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12460 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d 75   "%s BY terms mu
12470 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
12480 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
12490 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  , zType);.      
124a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
124b0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
124c0 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
124d0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
124e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
124f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
12500 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
12510 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
12520 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
12530 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
12540 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
12550 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65  1 and %d", zType
12560 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
12570 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
12580 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
12590 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
125a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
125b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
125c0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
125d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
125e0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
125f0 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
12600 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
12610 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
12620 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
12630 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
12640 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
12650 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
12660 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
12670 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
12680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126a0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
126b0 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
126c0 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
126d0 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
126e0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
126f0 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
12700 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
12710 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
12720 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
12730 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
12740 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
12750 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
12760 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
12770 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
12780 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
12790 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
127a0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
127b0 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
127c0 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
127d0 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
127e0 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
127f0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
12800 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
12810 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
12820 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
12830 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
12840 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
12850 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
12860 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
12870 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
12880 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
12890 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
128a0 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
128b0 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
128c0 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
128d0 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
128e0 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
128f0 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
12900 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
12910 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
12920 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12930 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
12940 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
12950 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
12960 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
12970 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
12980 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12990 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
129a0 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
129b0 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
129c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
129d0 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
129e0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
129f0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
12a00 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
12a10 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
12a20 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
12a30 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
12a40 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
12a50 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
12a60 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
12a70 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
12a80 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
12a90 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
12aa0 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
12ab0 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
12ac0 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
12ad0 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
12ae0 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
12af0 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
12b00 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
12b10 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
12b20 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
12b30 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
12b40 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
12b50 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
12b60 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
12b70 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
12b80 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
12b90 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
12ba0 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
12bb0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
12bc0 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
12bd0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
12be0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
12bf0 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
12c00 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
12c10 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
12c20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
12c30 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
12c40 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
12c50 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
12c60 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
12ca0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
12cb0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
12cc0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
12cd0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
12ce0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12cf0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
12d00 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
12d10 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
12d20 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
12d30 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
12d40 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
12d50 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
12d60 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
12d70 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12d80 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
12d90 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
12da0 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
12db0 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
12dc0 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
12dd0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
12de0 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
12df0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
12e00 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
12e10 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
12e20 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
12e30 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
12e40 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
12e50 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
12e60 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
12e70 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
12e80 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
12e90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12ea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12eb0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
12ec0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12ee0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12ef0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
12f00 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
12f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
12f20 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
12f30 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
12f40 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
12f50 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61         /* A para
12f60 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68  meter used by th
12f70 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c  e eDest disposal
12f80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c   method */.  Sel
12f90 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
12fa0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
12fb0 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
12fc0 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
12fd0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
12fe0 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
12ff0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
13000 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
13010 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
13020 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
13030 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
13040 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
13050 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
13060 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 2c 20  */.  char *aff, 
13070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13080 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
13090 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
130a0 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 4e  ty string */.  N
130b0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
130c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
130d0 63 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  ce of the next o
130e0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 29 7b  uter query */.){
130f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
13100 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
13110 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
13120 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20  isAgg = 0;      
13130 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
13140 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
13150 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
13160 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
13170 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
13180 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
13190 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
131a0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
131b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
131c0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
131d0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
131e0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
131f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
13200 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
13210 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
13220 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
13230 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
13240 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
13250 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
13260 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
13270 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
13280 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
13290 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
132a0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
132b0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
132c0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
132d0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
132e0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
132f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
13300 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
13310 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
13320 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
13330 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
13340 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
13350 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
13360 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
13370 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
13380 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
13390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
133a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
133b0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
133c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
133d0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  p==0 ) return 1;
133e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
133f0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13400 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
13410 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
13420 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   1;..#ifndef SQL
13430 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
13440 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66  D_SELECT.  /* If
13450 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
13460 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
13470 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
13480 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
13490 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
134a0 72 69 6f 72 20 29 7b 0a 23 69 66 6e 64 65 66 20  rior ){.#ifndef 
134b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53  SQLITE_OMIT_CURS
134c0 4f 52 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 46  OR.    if( p->pF
134d0 65 74 63 68 20 29 7b 0a 20 20 20 20 20 20 73 71  etch ){.      sq
134e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
134f0 61 72 73 65 2c 20 22 63 75 72 73 6f 72 73 20 63  arse, "cursors c
13500 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  annot be used on
13510 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
13520 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  s");.      goto 
13530 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13540 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
13550 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
13560 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
13570 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
13580 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13590 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
135a0 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
135b0 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
135c0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
135d0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
135e0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
135f0 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  ere;.  pOrderBy 
13600 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
13610 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
13620 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
13630 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
13640 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
13650 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  p->isDistinct;..
13660 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
13670 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
13680 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
13690 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
136a0 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
136b0 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
136c0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
136d0 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
136e0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
136f0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
13700 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ..  if( prepSele
13710 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
13720 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
13730 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
13740 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
13750 72 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  re;.  pEList = p
13760 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
13770 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f  pEList==0 ) goto
13780 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
13790 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
137a0 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
137b0 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
137c0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
137d0 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
137e0 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  put..  */.  asse
137f0 72 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  rt( eDest!=SRT_E
13800 78 69 73 74 73 20 7c 7c 20 70 45 4c 69 73 74 2d  xists || pEList-
13810 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 69  >nExpr==1 );.  i
13820 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  f( (eDest==SRT_M
13830 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
13840 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d  _Set) && pEList-
13850 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20  >nExpr>1 ){.    
13860 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13870 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
13880 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
13890 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
138a0 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
138b0 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
138c0 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
138d0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
138e0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44  d;.  }..  /* ORD
138f0 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
13900 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
13910 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73  ations..  */.  s
13920 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
13930 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
13940 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  on:.    case SRT
13950 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73  _Except:.    cas
13960 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20  e SRT_Discard:. 
13970 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
13980 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
13990 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
139a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
139b0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
139c0 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76  t, we should hav
139d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20  e allocated all 
139e0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
139f0 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f   we.  ** need to
13a00 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79   handle subquery
13a10 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  s and temporary 
13a20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20  tables.  .  **. 
13a30 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   ** Resolve the 
13a40 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
13a50 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20   do a semantics 
13a60 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65  check on all the
13a70 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
13a80 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
13a90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
13aa0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
13ab0 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  X = pEList->a[i]
13ac0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
13ad0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
13ae0 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  veNames(pParse, 
13af0 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 4e 43  pTabList, 0, pNC
13b00 2c 20 70 58 2c 20 31 2c 20 31 29 20 29 7b 0a 20  , pX, 1, 1) ){. 
13b10 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13b20 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
13b30 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
13b40 72 74 79 28 70 58 2c 20 45 50 5f 41 67 67 29 20  rty(pX, EP_Agg) 
13b50 29 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d  ) isAgg = 1;.  }
13b60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
13b70 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70  prResolveNames(p
13b80 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
13b90 20 70 45 4c 69 73 74 2c 20 70 4e 43 2c 20 70 57   pEList, pNC, pW
13ba0 68 65 72 65 2c 20 30 2c 20 31 29 20 29 7b 0a 20  here, 0, 1) ){. 
13bb0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13bc0 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 48  nd;.  }.  if( pH
13bd0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28  aving ){.    if(
13be0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
13bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13c00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
13c10 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
13c20 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
13c30 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
13c40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13c50 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
13c60 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
13c70 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73  solveNames(pPars
13c80 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
13c90 69 73 74 2c 20 70 4e 43 2c 20 70 48 61 76 69 6e  ist, pNC, pHavin
13ca0 67 2c 20 31 2c 20 31 29 20 29 7b 0a 20 20 20 20  g, 1, 1) ){.    
13cb0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13cc0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
13cd0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
13ce0 28 70 48 61 76 69 6e 67 2c 20 45 50 5f 41 67 67  (pHaving, EP_Agg
13cf0 29 20 29 20 69 73 41 67 67 20 3d 20 31 3b 0a 20  ) ) isAgg = 1;. 
13d00 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42   }.  if( pGroupB
13d10 79 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  y && !isAgg ){. 
13d20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13d30 73 67 28 70 50 61 72 73 65 2c 20 22 47 52 4f 55  sg(pParse, "GROU
13d40 50 20 42 59 20 6d 61 79 20 6f 6e 6c 79 20 62 65  P BY may only be
13d50 20 75 73 65 64 20 6f 6e 20 61 67 67 72 65 67 61   used on aggrega
13d60 74 65 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20  te queries");.  
13d70 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13d80 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f  d;.  }.  if( pro
13d90 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
13da0 28 70 50 61 72 73 65 2c 70 4f 72 64 65 72 42 79  (pParse,pOrderBy
13db0 2c 70 54 61 62 4c 69 73 74 2c 70 45 4c 69 73 74  ,pTabList,pEList
13dc0 2c 70 4e 43 2c 69 73 41 67 67 2c 22 4f 52 44 45  ,pNC,isAgg,"ORDE
13dd0 52 22 29 0a 20 20 20 7c 7c 20 70 72 6f 63 65 73  R").   || proces
13de0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
13df0 61 72 73 65 2c 70 47 72 6f 75 70 42 79 2c 70 54  arse,pGroupBy,pT
13e00 61 62 4c 69 73 74 2c 70 45 4c 69 73 74 2c 70 4e  abList,pEList,pN
13e10 43 2c 69 73 41 67 67 2c 22 47 52 4f 55 50 22 29  C,isAgg,"GROUP")
13e20 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  .  ){.    goto s
13e30 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
13e40 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 75    /* We cannot u
13e50 73 65 20 61 20 53 51 4c 20 63 75 72 73 6f 72 20  se a SQL cursor 
13e60 6f 6e 20 61 20 6a 6f 69 6e 20 6f 72 20 6f 6e 20  on a join or on 
13e70 61 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  a DISTINCT query
13e80 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
13e90 4c 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52  LITE_OMIT_CURSOR
13ea0 0a 20 20 69 66 28 20 70 2d 3e 70 46 65 74 63 68  .  if( p->pFetch
13eb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
13ec0 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
13ed0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13ee0 73 67 28 70 50 61 72 73 65 2c 20 22 63 75 72 73  sg(pParse, "curs
13ef0 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ors cannot be us
13f00 65 64 20 6f 6e 20 44 49 53 54 49 4e 43 54 20 71  ed on DISTINCT q
13f10 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20  ueries");.      
13f20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
13f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13f40 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  TabList->nSrc>0 
13f50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13f60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13f70 20 22 63 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74   "cursors cannot
13f80 20 62 65 20 75 73 65 64 20 6f 6e 20 6a 6f 69 6e   be used on join
13f90 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  s");.      goto 
13fa0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13fb0 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
13fc0 73 74 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  st->a[0].pSelect
13fd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13fe0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13ff0 2c 20 22 63 75 72 73 6f 72 20 63 61 6e 6e 6f 74  , "cursor cannot
14000 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6e 65   be used with ne
14010 73 74 65 64 20 71 75 65 72 69 65 73 20 22 0a 20  sted queries ". 
14020 20 20 20 20 20 20 20 20 20 22 6f 72 20 76 69 65           "or vie
14030 77 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ws");.      goto
14040 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
14050 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
14060 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
14070 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
14080 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14090 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
140a0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
140b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
140c0 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
140d0 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69  n names if we wi
140e0 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d  ll be using them
140f0 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20   in a callback. 
14100 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
14110 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
14120 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
14130 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20  g to some other 
14140 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a  destination..  *
14150 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
14160 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
14170 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14180 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
14190 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
141a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
141b0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
141c0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
141d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
141e0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
141f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14200 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
14210 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14220 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
14230 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
14240 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rc; i++){.    co
14250 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
14260 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b  AuthContext = 0;
14270 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73  .    int needRes
14280 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  toreContext;..  
14290 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
142a0 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
142b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
142c0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
142d0 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  i].zName!=0 ){. 
142e0 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
142f0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
14300 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
14310 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
14320 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62  thContext = pTab
14330 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
14340 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
14350 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
14360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14370 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
14380 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
14390 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
143a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
143b0 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  t->a[i].pSelect,
143c0 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20   SRT_TempTable, 
143d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
143e0 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
143f0 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20  .iCursor, p, i, 
14400 26 69 73 41 67 67 2c 20 30 2c 20 30 29 3b 0a 20  &isAgg, 0, 0);. 
14410 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f     if( needResto
14420 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20  reContext ){.   
14430 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
14440 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
14450 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
14460 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
14470 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70  = p->pSrc;.    p
14480 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
14490 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  e;.    if( eDest
144a0 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65  !=SRT_Union && e
144b0 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74  Dest!=SRT_Except
144c0 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44   && eDest!=SRT_D
144d0 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20  iscard ){.      
144e0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
144f0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
14500 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
14510 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48  pGroupBy;.    pH
14520 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
14530 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ng;.    isDistin
14540 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
14550 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ct;.  }.#endif..
14560 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
14570 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
14580 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  of a min() or ma
14590 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20  x() function by 
145a0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74  itself.  ** in t
145b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
145c0 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65   */.  if( simple
145d0 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72  MinMaxQuery(pPar
145e0 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
145f0 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  arm) ){.    rc =
14600 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   0;.    goto sel
14610 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
14620 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
14630 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62  if this is a sub
14640 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62  query that can b
14650 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e  e "flattened" in
14660 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20  to its parent.. 
14670 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e   ** If flattenin
14680 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74  g is a possiblit
14690 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74  y, do so and ret
146a0 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
146b0 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20    .  */.#ifndef 
146c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
146d0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26  .  if( pParent &
146e0 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a  & pParentAgg &&.
146f0 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62        flattenSub
14700 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50  query(pParse, pP
14710 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
14720 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69  , *pParentAgg, i
14730 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28  sAgg) ){.    if(
14740 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e   isAgg ) *pParen
14750 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65  tAgg = 1;.    re
14760 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14770 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14780 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
14790 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76  Y clause, resolv
147a0 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  e any collation 
147b0 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e  sequences.  ** n
147c0 61 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ames that have b
147d0 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
147e0 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  pecified..  */. 
147f0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14800 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14810 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
14820 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
14830 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14840 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
14850 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14860 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a  pExpr->pColl = .
14870 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14880 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
14890 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
148a0 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d  y->a[i].zName, -
148b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
148c0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
148d0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
148e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
148f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14900 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
14910 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ..  */.  compute
14920 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14930 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a  Parse, p);..  /*
14940 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
14950 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
14960 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14970 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
14980 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
14990 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
149a0 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
149b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
149c0 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
149d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
149e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
149f0 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
14a00 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
14a10 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
14a20 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
14a30 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70  of aggregate exp
14a40 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
14a50 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
14a60 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
14a70 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c  );.  if( isAgg |
14a80 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  | pGroupBy ){.  
14a90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14aa0 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20  ->nAgg==0 );.   
14ab0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
14ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
14ad0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
14ae0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14af0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
14b00 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
14b10 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14b20 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  r) ){.        go
14b30 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
14b40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14b50 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
14b60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
14b70 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
14b80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
14b90 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
14ba0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
14bb0 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
14bc0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
14bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
14be0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
14bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14c00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
14c10 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33  aving && sqlite3
14c20 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14c30 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48  gates(pParse, pH
14c40 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20  aving) ){.      
14c50 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14c60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
14c70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
14c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
14c90 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
14ca0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
14cb0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
14cc0 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
14cd0 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
14ce0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
14cf0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
14d00 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
14d10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14d20 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
14d30 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20  the aggregator. 
14d40 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
14d50 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20  ){.    int addr 
14d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14d70 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65  Op(v, OP_AggRese
14d80 74 2c 20 28 70 47 72 6f 75 70 42 79 3f 30 3a 31  t, (pGroupBy?0:1
14d90 29 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29  ), pParse->nAgg)
14da0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
14db0 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
14dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  ++){.      FuncD
14dd0 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20  ef *pFunc;.     
14de0 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50   if( (pFunc = pP
14df0 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
14e00 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63  unc)!=0 && pFunc
14e10 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
14e20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14e30 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41  3VdbeOp3(v, OP_A
14e40 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63  ggInit, 0, i, (c
14e50 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46  har*)pFunc, P3_F
14e60 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d  UNCDEF);.      }
14e70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
14e80 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
14e90 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66   int sz = sizeof
14ea0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f  (KeyInfo) + pGro
14eb0 75 70 42 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65  upBy->nExpr*size
14ec0 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20  of(CollSeq*);.  
14ed0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14ee0 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73  y = (KeyInfo *)s
14ef0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b  qliteMalloc(sz);
14f00 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 4b  .      if( 0==pK
14f10 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  ey ){.        go
14f20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
14f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4b 65       }.      pKe
14f40 79 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  y->enc = pParse-
14f50 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  >db->enc;.      
14f60 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  pKey->nField = p
14f70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
14f80 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
14f90 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
14fa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14fb0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
14fc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
14fd0 53 65 71 28 70 50 61 72 73 65 2c 20 70 47 72 6f  Seq(pParse, pGro
14fe0 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
14ff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
15000 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  pKey->aColl[i] )
15010 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  {.          pKey
15020 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61  ->aColl[i] = pPa
15030 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
15040 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
15050 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15060 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
15070 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a  v, addr, (char *
15080 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46  )pKey, P3_KEYINF
15090 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
150a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  }.  }..  /* Init
150b0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
150c0 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66  y cell to NULL f
150d0 6f 72 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20  or SRT_Mem or 0 
150e0 66 6f 72 20 53 52 54 5f 45 78 69 73 74 73 0a 20  for SRT_Exists. 
150f0 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
15100 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
15110 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t==SRT_Exists ){
15120 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15130 41 64 64 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d  AddOp(v, eDest==
15140 53 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f 53 74 72  SRT_Mem ? OP_Str
15150 69 6e 67 38 20 3a 20 4f 50 5f 49 6e 74 65 67 65  ing8 : OP_Intege
15160 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
15170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15180 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
15190 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
151a0 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f   /* Open a tempo
151b0 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
151c0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
151d0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
151e0 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
151f0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
15200 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15210 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65      openTempInde
15220 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73  x(pParse, p, dis
15230 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  tinct, 0);.  }el
15240 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
15250 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
15260 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
15270 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
15280 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
15290 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
152a0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
152b0 65 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ere,.           
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a    pGroupBy ? 0 :
152e0 20 26 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70   &pOrderBy, p->p
152f0 46 65 74 63 68 29 3b 0a 20 20 69 66 28 20 70 57  Fetch);.  if( pW
15300 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
15310 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
15320 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
15330 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
15340 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
15350 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
15360 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
15370 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
15380 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
15390 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
153a0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
153b0 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
153c0 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
153e0 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
153f0 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
15400 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20  Break, aff) ){. 
15410 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
15420 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
15430 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
15440 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67   dealing with ag
15450 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64  gregates, then d
15460 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67  o the special ag
15470 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f  gregate.  ** pro
15480 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a  cessing.  .  */.
15490 20 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45    else{.    AggE
154a0 78 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69  xpr *pAgg;.    i
154b0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
154c0 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20       int lbl1;. 
154d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
154e0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
154f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
15500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15510 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
15520 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
15530 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e      }.      /* N
15540 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
15550 67 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  g is attached to
15560 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f   the following O
15570 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20  P_MakeRecord .  
15580 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77      ** because w
15590 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
155a0 20 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e   do any coercion
155b0 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a   of datatypes. *
155c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
155d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
155e0 61 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75  akeRecord, pGrou
155f0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  pBy->nExpr, 0);.
15600 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c        lbl1 = sql
15610 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15620 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
15630 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15640 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
15650 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  lbl1);.      for
15660 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73  (i=0, pAgg=pPars
15670 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73  e->aAgg; i<pPars
15680 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41  e->nAgg; i++, pA
15690 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  gg++){.        i
156a0 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29  f( pAgg->isAgg )
156b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
156c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
156d0 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d  de(pParse, pAgg-
156e0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
156f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15700 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
15710 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, i);.      }. 
15720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15730 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15740 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
15750 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
15760 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
15770 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
15780 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
15790 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
157a0 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
157b0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
157c0 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
157d0 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ->isAgg ) contin
157e0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
157f0 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30  ( pAgg->pFunc!=0
15800 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15810 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78  ( pAgg->pFunc->x
15820 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
15830 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46   pDef = pAgg->pF
15840 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  unc;.      pE = 
15850 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAgg->pExpr;.   
15860 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
15870 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15880 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
15890 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
158a0 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
158b0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
158c0 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
158d0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  List);.      sql
158e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
158f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
15900 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
15910 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
15920 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
15930 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
15940 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
15950 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21        for(j=0; !
15960 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72  pColl && j<nExpr
15970 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
15980 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
15990 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
159a0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
159b0 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
159c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
159d0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
159e0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
159f0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
15a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
15a10 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
15a20 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
15a30 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
15a40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15a50 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
15a60 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30  v, OP_AggFunc, 0
15a70 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29  , nExpr, (char*)
15a80 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52  pDef, P3_POINTER
15a90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15aa0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
15ab0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
15ac0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
15ad0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
15ae0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
15af0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
15b00 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
15b10 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
15b20 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
15b30 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
15b40 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
15b50 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
15b60 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
15b70 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
15b80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15b90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15ba0 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20  int startagg;.  
15bb0 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c    startagg = sql
15bc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15bd0 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
15be0 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61  endagg);.    pPa
15bf0 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b  rse->useAgg = 1;
15c00 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
15c10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15c20 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
15c30 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
15c40 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20  artagg, 1);.    
15c50 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  }.    if( select
15c60 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
15c70 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
15c80 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
15c90 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67    iParm, startag
15cc0 67 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20  g, endagg, aff) 
15cd0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
15ce0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
15cf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15d00 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
15d10 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20   0, startagg);. 
15d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15d30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
15d40 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dagg);.    sqlit
15d50 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15d60 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
15d70 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67     pParse->useAg
15d80 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
15d90 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
15da0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
15db0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
15dc0 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
15dd0 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
15de0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
15df0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
15e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
15e10 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
15e20 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
15e30 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
15e40 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
15e50 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
15e60 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
15e70 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61   subquery, we ha
15e80 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64  ve now converted
15e90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
15ea0 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  to a.  ** tempor
15eb0 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64  ary table.  So d
15ec0 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65  elete the subque
15ed0 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ry structure fro
15ee0 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a  m the parent.  *
15ef0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  * to prevent thi
15f00 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
15f10 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
15f20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
15f30 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  ce the.  ** the 
15f40 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  use of the tempo
15f50 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
15f60 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
15f70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
15f80 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  arent->pSrc->nSr
15f90 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20  c>parentTab );. 
15fa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
15fb0 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
15fc0 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d  ntTab].pSelect==
15fd0 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
15fe0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b  SelectDelete(p);
15ff0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
16000 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
16010 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
16020 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  }..  /* The SELE
16030 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
16040 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
16050 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
16060 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
16070 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
16080 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
16090 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
160a0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
160b0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
160c0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
160d0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
160e0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
160f0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
16100 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
16110 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
16120 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
16130 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16140 0a                                               .