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

Artifact 080c0d1d684ff6154a2f042347f34bc07e50590c:


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 31 39  select.c,v 1.219
0200: 20 32 30 30 34 2f 31 32 2f 32 35 20 30 31 3a 30   2004/12/25 01:0
0210: 33 3a 31 34 20 64 72 68 20 45 78 70 20 24 0a 2a  3:14 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
0a00: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a10: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a20: 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20     u8 nChar;.   
0a30: 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65   u8 code;.  } ke
0a40: 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20  ywords[] = {.   
0a50: 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c   { "natural", 7,
0a60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20   JT_NATURAL },. 
0a70: 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20     { "left",    
0a80: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
0a90: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69  TER },.    { "ri
0aa0: 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49  ght",   5, JT_RI
0ab0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0ac0: 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20      { "full",   
0ad0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
0ae0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0af0: 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20  .    { "outer", 
0b00: 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c    5, JT_OUTER },
0b10: 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20  .    { "inner", 
0b20: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b30: 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20  .    { "cross", 
0b40: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b50: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0b60: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0b70: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0b80: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0b90: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0ba0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0bb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0bc0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0bd0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0be0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
0bf0: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
0c00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
0c10: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
0c20: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
0c30: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
0c40: 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  Cmp(p->z, keywor
0c50: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0c60: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0c70: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0c80: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0c90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0cb0: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0cc0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0cd0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0ce0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0cf0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
0d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d10: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
0d20: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
0d30: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
0d40: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
0d50: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
0d60: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
0d70: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
0d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31  const char *zSp1
0d90: 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73   = " ";.    cons
0da0: 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22  t char *zSp2 = "
0db0: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0dc0: 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20  0 ){ zSp1++; }. 
0dd0: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
0de0: 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71  zSp2++; }.    sq
0df0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0e00: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
0e10: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
0e20: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
0e30: 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20    "%T%s%T%s%T", 
0e40: 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53  pA, zSp1, pB, zS
0e50: 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  p2, pC);.    joi
0e60: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
0e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  ;.  }else if( jo
0e80: 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48  intype & JT_RIGH
0e90: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
0ea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0eb0: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
0ec0: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
0ed0: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
0ee0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
0ef0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
0f00: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
0f10: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
0f20: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
0f30: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
0f40: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
0f50: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
0f60: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
0f70: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
0f80: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
0f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
0fa0: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
0fb0: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
0fc0: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
0fd0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0fe0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
0ff0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1000: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1010: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1020: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1030: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1040: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  -1;.}../*.** Set
1050: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1060: 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30  token to a '\000
1070: 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  '-terminated str
1080: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
1090: 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b  oid setToken(Tok
10a0: 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  en *p, const cha
10b0: 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20  r *z){.  p->z = 
10c0: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c  z;.  p->n = strl
10d0: 65 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20  en(z);.  p->dyn 
10e0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
10f0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
1100: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1110: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
1120: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
1130: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1140: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1150: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1160: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1170: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1180: 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73  hereTerm(.  cons
1190: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
11a0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
11c0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11d0: 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73  b1,      /* Firs
11e0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  t table */.  con
11f0: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c  st Table *pTab2,
1200: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
1210: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  table */.  Expr 
1220: 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20 20  **ppExpr        
1230: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
1240: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
1250: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1260: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  */.){.  Token du
1270: 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  mmy;.  Expr *pE1
1280: 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b  a, *pE1b, *pE1c;
1290: 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a  .  Expr *pE2a, *
12a0: 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45  pE2b, *pE2c;.  E
12b0: 78 70 72 20 2a 70 45 3b 0a 0a 20 20 73 65 74 54  xpr *pE;..  setT
12c0: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 43 6f  oken(&dummy, zCo
12d0: 6c 29 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c  l);.  pE1a = sql
12e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12f0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  0, 0, &dummy);. 
1300: 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45   pE2a = sqlite3E
1310: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1320: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 73 65 74 54   &dummy);.  setT
1330: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 70 54 61  oken(&dummy, pTa
1340: 62 31 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 70 45  b1->zName);.  pE
1350: 31 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1b = sqlite3Expr
1360: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1370: 75 6d 6d 79 29 3b 0a 20 20 73 65 74 54 6f 6b 65  ummy);.  setToke
1380: 6e 28 26 64 75 6d 6d 79 2c 20 70 54 61 62 32 2d  n(&dummy, pTab2-
1390: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 70 45 32 62 20  >zName);.  pE2b 
13a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13b0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13c0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13d0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13e0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
13f0: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1400: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1410: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1420: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1430: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1440: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1450: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1460: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a 70  _FromJoin);.  *p
1470: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1480: 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20  xprAnd(*ppExpr, 
1490: 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  pE);.}../*.** Se
14a0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
14b0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
14c0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
14d0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
14e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
14f0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1500: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1510: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1520: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
1530: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1540: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
1550: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
1560: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
1570: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
1580: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
1590: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
15a0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
15b0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
15c0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
15d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
15e0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
15f0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
1600: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
1610: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
1620: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
1630: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1640: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
1650: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
1660: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
1670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1680: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
1690: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
16a0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
16b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
16c0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65 74  omJoin);.    set
16d0: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
16e0: 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  t);.    p = p->p
16f0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1710: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1720: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1730: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1740: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1750: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1760: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1770: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1780: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1790: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
17a0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
17b0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
17c0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
17d0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
17e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
17f0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1800: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
1810: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
1820: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
1830: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
1840: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
1850: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
1860: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
1870: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
1880: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
1890: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
18a0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
18b0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
18c0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
18d0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
18e0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
18f0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
1900: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
1910: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1920: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1930: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
1940: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
1950: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
1960: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1970: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1980: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1990: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
19a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
19b0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
19c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
19d0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
19e0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a00: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
1a10: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a20: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a50: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
1a60: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
1a70: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
1a80: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
1a90: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1aa0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
1ab0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
1ac0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
1ad0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
1ae0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
1af0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
1b00: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
1b10: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
1b20: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
1b30: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
1b40: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
1b50: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
1b60: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
1b70: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
1b80: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
1b90: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
1ba0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
1bb0: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
1bc0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
1bd0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
1be0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
1bf0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
1c00: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
1c10: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
1c20: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
1c30: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
1c40: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
1c50: 69 66 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  if( pLeft->joint
1c60: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1c70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
1c80: 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66  eft->pOn || pLef
1c90: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
1ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1cb0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1cc0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
1cd0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
1ce0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
1cf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
1d00: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
1d10: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1d20: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1d30: 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  LeftTab->nCol; j
1d40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
1d50: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74  r *zName = pLeft
1d60: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1d70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
1d80: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
1d90: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  htTab, zName)>=0
1da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
1db0: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
1dc0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 52 69 67  , pLeftTab, pRig
1dd0: 68 74 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  htTab, &p->pWher
1de0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e00: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1e10: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1e20: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1e30: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1e40: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
1e50: 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70 55 73 69  n && pLeft->pUsi
1e60: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1e70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e80: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
1e90: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1ea0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1eb0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1ec0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
1ed0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ee0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1ef0: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
1f00: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1f10: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
1f20: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
1f30: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1f40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1f50: 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  eft->pOn ){.    
1f60: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c    setJoinExpr(pL
1f70: 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  eft->pOn);.     
1f80: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
1f90: 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
1fa0: 57 68 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f  Where, pLeft->pO
1fb0: 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 2d  n);.      pLeft-
1fc0: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
1fd0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
1fe0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
1ff0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
2000: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
2010: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
2020: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
2030: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
2040: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
2050: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
2060: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
2070: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
2080: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
2090: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
20a0: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
20b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
20c0: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
20d0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
20e0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
20f0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
2100: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
2110: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
2120: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
2130: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
2140: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
2150: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
2160: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2170: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2180: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
2190: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a   pLeft->pUsing;.
21a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
21b0: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
21c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
21d0: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e  *zName = pList->
21e0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
21f0: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2200: 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e  dex(pLeftTab, zN
2210: 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e  ame)<0 || column
2220: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
2230: 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20   zName)<0 ){.   
2240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2260: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
2270: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
2280: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
2290: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
22a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
22b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
22c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
22e0: 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d  ddWhereTerm(zNam
22f0: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 52 69  e, pLeftTab, pRi
2300: 67 68 74 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ghtTab, &p->pWhe
2310: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2320: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2330: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2340: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2350: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2360: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2370: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2380: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2390: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
23a0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
23b0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
23c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23d0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
23e0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
23f0: 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ete(p->pSrc);.  
2400: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2410: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2420: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2430: 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42  elete(p->pGroupB
2440: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
2450: 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69  rDelete(p->pHavi
2460: 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ng);.  sqlite3Ex
2470: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2480: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
2490: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
24a0: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73  (p->pPrior);.  s
24b0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
24c0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
24d0: 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  e aggregate info
24e0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
24f0: 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
2500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2510: 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
2520: 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20  InfoReset(Parse 
2530: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
2540: 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61  teFree(pParse->a
2550: 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Agg);.  pParse->
2560: 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  aAgg = 0;.  pPar
2570: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
2580: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
2590: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
25a0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
25b0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
25c0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
25d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
25e0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
25f0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
2600: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
2610: 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  orter(Parse *pPa
2620: 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78  rse, Vdbe *v, Ex
2630: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2640: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2650: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
2660: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
2670: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2680: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ode(pParse, pOrd
2690: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
26a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
26b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
26c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64  MakeRecord, pOrd
26d0: 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  erBy->nExpr, 0);
26e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
26f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75  dOp(v, OP_SortPu
2700: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
2710: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2720: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2730: 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 0a 2a 2f  SET and LIMIT.*/
2740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
2750: 65 4c 69 6d 69 74 65 72 28 0a 20 20 56 64 62 65  eLimiter(.  Vdbe
2760: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
2770: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
2780: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
2790: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
27a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
27b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
27c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
27d0: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a  iContinue,    /*
27e0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
27f0: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
2800: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ecord */.  int i
2810: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 2f 2a 20  Break,       /* 
2820: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64  Jump here to end
2830: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
2840: 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20  nt nPop         
2850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
2860: 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b  mes to pop stack
2870: 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f   when jumping */
2880: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
2890: 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  fset>=0 ){.    i
28a0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
28b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
28c0: 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  (v) + 2;.    if(
28d0: 20 6e 50 6f 70 3e 30 20 29 20 61 64 64 72 2b 2b   nPop>0 ) addr++
28e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
2900: 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Incr, p->iOffset
2910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
2920: 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20   nPop>0 ){.     
2930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2940: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f  p(v, OP_Pop, nPo
2950: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p, 0);.    }.   
2960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2970: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2980: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
2990: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29a0: 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20   "# skip OFFSET 
29b0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 7d 0a  records"));.  }.
29c0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
29d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
29e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
29f0: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
2a00: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
2a10: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2a20: 2c 20 22 23 20 65 78 69 74 20 77 68 65 6e 20 4c  , "# exit when L
2a30: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
2a40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a50: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2a60: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2a70: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2a80: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2a90: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2aa0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2ab0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2ac0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2ad0: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2ae0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2af0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2b00: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2b10: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2b20: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2b30: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2b40: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2b50: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2b60: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2b70: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2b80: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2ba0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2bb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2be0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c00: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2c10: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2c20: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2c30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2c40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2c50: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2c60: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2c70: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2c80: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2c90: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2ca0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2cb0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2cc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2cd0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2ce0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2cf0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2d00: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2d10: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2d20: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2d30: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2d40: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2d50: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2d60: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2d70: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2d80: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2d90: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2da0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2db0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2dc0: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2dd0: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2de0: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2df0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2e00: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2e10: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2e20: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2e30: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2e40: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2e60: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2e70: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2e80: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
2e90: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
2ea0: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
2eb0: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
2ec0: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
2ed0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2ee0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2ef0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
2f00: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
2f10: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
2f20: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2f30: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
2f40: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2f50: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2f60: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2f70: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2f80: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2f90: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2fa0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2fb0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2fc0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2fd0: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2fe0: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
2ff0: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
3000: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
3010: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
3020: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
3030: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
3040: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
3050: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
3060: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
3070: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3080: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3090: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
30a0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
30b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
30c0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
30d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
30f0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3110: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
3120: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3130: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
3140: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
3150: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3160: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3170: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3180: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3190: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
31a0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
31b0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
31c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
31d0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
31e0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
31f0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3200: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3210: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3220: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3230: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3240: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
3250: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3270: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
3280: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
3290: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
32a0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
32b0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
32c0: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
32d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
32e0: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
32f0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3300: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
3310: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3320: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3330: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
3340: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
3350: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3360: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3370: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3380: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3390: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
33a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33b0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
33c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
33d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
33e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
33f0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3400: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3410: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69  nt((v, "# skip i
3420: 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64  ndistinct record
3430: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3440: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3450: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
3460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3480: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3490: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   0);.    if( pOr
34a0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
34b0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
34c0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69   p, iContinue, i
34d0: 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Break, nColumn);
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
34f0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
3500: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
3510: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
3520: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
3530: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
3540: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
3550: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3560: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3570: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
3580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3590: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
35a0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
35b0: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
35c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
35e0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
35f0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3600: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3610: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
3620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3630: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3640: 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tStrKey, iParm, 
3650: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
3660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3670: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
3680: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
3690: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
36a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
36b0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
36c0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
36d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
36f0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3700: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
3710: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3720: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
3730: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
3740: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
3750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
3760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3770: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
3780: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37a0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
37b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
37c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
37d0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
37e0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
37f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3800: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3810: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
3820: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
3830: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
3840: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
3850: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
3860: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
3870: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
3880: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
3890: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
38a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
38b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
38c0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
38d0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
38e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
38f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3900: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3910: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
3920: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
3930: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3940: 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP3(v, -1, aff,
3950: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
3960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3970: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
3980: 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b  nd, iParm, addr+
3990: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
39a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
39b0: 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  _Delete, iParm, 
39c0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
39d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
39e0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
39f0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
3a00: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
3a10: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
3a20: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
3a30: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
3a40: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
3a50: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
3a60: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
3a70: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
3a80: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
3a90: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
3aa0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
3ab0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
3ac0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
3ad0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
3ae0: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
3af0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
3b00: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
3b10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b20: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3b30: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3b40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3b60: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
3b70: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3b90: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3ba0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3bb0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3bc0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3bd0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3bf0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69 50    char aff = (iP
3c00: 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20  arm>>16)&0xFF;. 
3c10: 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
3c20: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3c30: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
3c40: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
3c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c60: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
3c70: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
3c80: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 1);.        s
3c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3ca0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3cb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3cd0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3ce0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3cf0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d10: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3d20: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3d30: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3d60: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3d70: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3d80: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3d90: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3da0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3db0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3dc0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3dd0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3de0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3df0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3e00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
3e10: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
3e20: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3e30: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3e40: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3e50: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3e60: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3e70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3e90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3ea0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
3eb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
3ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ed0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3ee0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3f00: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3f10: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3f20: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3f30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f40: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3f50: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3f60: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f70: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3f90: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3fa0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3fb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3fc0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fd0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fe0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4000: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4010: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4020: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4030: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
4040: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4050: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4060: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
4070: 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  oke a subroutine
4080: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72   to handle the r
4090: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62  esults.  The sub
40a0: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20  routine itself. 
40b0: 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73     ** is respons
40c0: 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67  ible for popping
40d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66   the results off
40e0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
40f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4100: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
4110: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4120: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4140: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4150: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4160: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4170: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
4180: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
41a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
41b0: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
41c0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
41d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
41e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
41f0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
4200: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4210: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4220: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4230: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4240: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4250: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4260: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4270: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4280: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4290: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
42a0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
42b0: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
42c0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
42d0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
42e0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
42f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4300: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4310: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4320: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4330: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4340: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4360: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4370: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
4380: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
4390: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
43a0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
43b0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
43c0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
43d0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
43e0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
43f0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4400: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4410: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4420: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4430: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4440: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
4450: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
4460: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
4470: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
44a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
44b0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
44c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
44d0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
44e0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
44f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4500: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4510: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4520: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4530: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4540: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
4550: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
4560: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
4570: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
4580: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
4590: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
45a0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
45b0: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
45c0: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
45d0: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
45e0: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
45f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4600: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4610: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4620: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4630: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4640: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
4650: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4660: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
4670: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4680: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4690: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
46a0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
46b0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
46c0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c  pOrderBy;.  nCol
46d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
46e0: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
46f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4700: 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f  of(*pInfo) + nCo
4710: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
4720: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
4730: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
4740: 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  n;.  pInfo->aSor
4750: 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29  tOrder = (char*)
4760: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43  &pInfo->aColl[nC
4770: 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46  ol];.  pInfo->nF
4780: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66  ield = nCol;.  f
4790: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
47a0: 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  i++){.    /* If 
47b0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
47c0: 65 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69  ence was specifi
47d0: 65 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68  ed explicity, th
47e0: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  en it.    ** is 
47f0: 73 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72  stored in pOrder
4800: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20  By->a[i].zName. 
4810: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
4820: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  he default.    *
4830: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
4840: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
4850: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
4860: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
4880: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
4890: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
48a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e  r);.    if( !pIn
48b0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
48c0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
48d0: 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c  ll[i] = db->pDfl
48e0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
48f0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4900: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
4910: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
4920: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4930: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  dbeOp3(v, OP_Sor
4940: 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  t, 0, 0, (char*)
4950: 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  pInfo, P3_KEYINF
4960: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64  O_HANDOFF);.  ad
4970: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4980: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4990: 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Next, 0, end1);.
49a0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
49b0: 20 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20   p, addr, end2, 
49c0: 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  1);.  switch( eD
49d0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
49e0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
49f0: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
4a00: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
4a10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a20: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72  P_NewRecno, iPar
4a30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
4a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4a50: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4a60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4a80: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
4a90: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4ab0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
4ac0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
4ad0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
4ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4af0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
4b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4b10: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4b30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4b40: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
4b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4b60: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
4b70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4b80: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
4b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4ba0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4bb0: 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33  d, 1, 0, "n", P3
4bc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4be0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
4bf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c10: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28   OP_PutStrKey, (
4c20: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
4c30: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
4c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4c50: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
4c60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4c70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c90: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
4ca0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
4cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cc0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4cd0: 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62  , end1);.      b
4ce0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4cf0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
4d00: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
4d10: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
4d20: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d40: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
4d50: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
4d60: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
4d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4d80: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4d90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4da0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
4db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4dc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4dd0: 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29  Column, -1-i, i)
4de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4df0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
4e00: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
4e10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e20: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4e30: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4e40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
4e70: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4ea0: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
4eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ec0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4ed0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
4ee0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
4ef0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f10: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4f20: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
4f30: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4f40: 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73  el(v, end2);.  s
4f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f60: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4f70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
4f80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
4f90: 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nd1);.  sqlite3V
4fa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4fb0: 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b  ortReset, 0, 0);
4fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4fd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4fe0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
4ff0: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
5000: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
5010: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
5020: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
5030: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
5040: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
5050: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  caller..**.** If
5060: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
5070: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
5080: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
5090: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
50a0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69   from.** the ori
50b0: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
50c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
50d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
50e0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a  s a column..** .
50f0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
5100: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65  on type for an e
5110: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74  xpression is eit
5120: 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49  her TEXT, NUMERI
5130: 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65  C or ANY..** The
5140: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
5150: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
5160: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a  eld is INTEGER..
5170: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5180: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
5190: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
51a0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
51b0: 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
51c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
51d0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Type;.  int j;. 
51e0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
51f0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72   pTabList==0 ) r
5200: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74  eturn 0;..  swit
5210: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
5220: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
5230: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62  UMN: {.      Tab
5240: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
5250: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
5260: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
5270: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
5280: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
5290: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
52a0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
52b0: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
52c0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
52d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
52e0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
52f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
5300: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5310: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
5320: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
5330: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
5340: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
5350: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
5360: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5370: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
5380: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
5390: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
53a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
53b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
53c0: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
53e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a      case TK_AS:.
53f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
5400: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c  lumnType(pParse,
5410: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 78 70 72   pTabList, pExpr
5420: 2d 3e 70 4c 65 66 74 29 3b 20 0a 20 20 20 20 20  ->pLeft); .     
5430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5440: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
5450: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
5460: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
5470: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
5480: 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65  olumnType(pParse
5490: 2c 20 70 53 2d 3e 70 53 72 63 2c 20 70 53 2d 3e  , pS->pSrc, pS->
54a0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
54b0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
54c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
54d0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79 70  ault:.      zTyp
54e0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20  e = 0;.  }.  .  
54f0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
5500: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5510: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
5520: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
5530: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
5540: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
5550: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5560: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
5570: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
5580: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
5590: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
55a0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
55b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
55c0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
55d0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
55e0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
55f0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5600: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5610: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5620: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5630: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5640: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
5650: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
5660: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
5670: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
5680: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
5690: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
56a0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72   columnType(pPar
56b0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 29  se, pTabList, p)
56c0: 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 3d  ;.    if( zType=
56d0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
56e0: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
56f0: 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77  ust make it's ow
5700: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
5710: 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61  lumn-type, in ca
5720: 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  se the .    ** s
5730: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
5740: 65 66 6f 72 65 20 74 68 69 73 20 76 69 72 74 75  efore this virtu
5750: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
5760: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
5770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
5780: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c  ColName(v, i+pEL
5790: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70  ist->nExpr, zTyp
57a0: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29  e, strlen(zType)
57b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
57c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
57d0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
57e0: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
57f0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
5800: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
5810: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
5820: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
5830: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
5840: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
5850: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
5860: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5870: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
5880: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5890: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
58a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
58b0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
58c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
58d0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
58e0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
58f0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5900: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
5910: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
5920: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5930: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
5940: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5950: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
5960: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
5970: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20  ortNames;..  /* 
5980: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
5990: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
59a0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
59b0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
59c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
59d0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  }..  assert( v!=
59e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  0 );.  if( pPars
59f0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
5a00: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5a10: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
5a30: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5a40: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
5a50: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
5a60: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
5a70: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
5a80: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
5a90: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
5aa0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
5ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
5ac0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
5ad0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
5ae0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5af0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5b00: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
5b10: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
5b20: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
5b30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5b40: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
5b50: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
5b60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5b70: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
5b80: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
5b90: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
5ba0: 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  v, i, zName, str
5bb0: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
5bc0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5bd0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
5be0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
5bf0: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
5c00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5c10: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
5c20: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
5c30: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
5c40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
5c50: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
5c60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
5c70: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
5c80: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
5c90: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
5ca0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
5cb0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
5cc0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
5cd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5ce0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
5cf0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
5d00: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
5d10: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5d20: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
5d30: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5d40: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
5d50: 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20  = "_ROWID_";.   
5d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5d70: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
5d80: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
5d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5da0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
5db0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20  & !fullNames && 
5dc0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
5dd0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
5de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5df0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
5e00: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
5e10: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
5e20: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
5e30: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
5e40: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
5e50: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
5e60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5e70: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
5e80: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
5e90: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
5ea0: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
5eb0: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
5ec0: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
5ed0: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
5ee0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
5ef0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
5f00: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
5f10: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5f30: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
5f40: 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49  zName, P3_DYNAMI
5f50: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
5f60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f70: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
5f80: 2c 20 69 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  , i, zCol, 0);. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5fa0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
5fb0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
5fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5fd0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5fe0: 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70   i, p->span.z, p
5ff0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
6000: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
6010: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
6020: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
6030: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
6040: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
6050: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
6060: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
6070: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
6080: 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c    sprintf(zName,
6090: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
60a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
60b0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
60c0: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , i, zName, 0);.
60d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
60e0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
60f0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6100: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
6110: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
6120: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
6130: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
6140: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
6150: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6160: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
6170: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
6180: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
6190: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
61a0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
61b0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
61c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
61d0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
61e0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
61f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6200: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
6210: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
6220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6230: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
6240: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
6250: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
6260: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
6270: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
6280: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
6290: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
62a0: 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  List(Parse*, Sel
62b0: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
62c0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
62d0: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
62e0: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
62f0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
6300: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
6310: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
6320: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
6330: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
6340: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
6350: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
6360: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
6370: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6380: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
6390: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
63a0: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
63b0: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
63c0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
63d0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
63e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
63f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6400: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
6410: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
6420: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
6430: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6440: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a  0;.  }.  pTab->z
6450: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
6460: 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  ? sqliteStrDup(z
6470: 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20  TabName) : 0;.  
6480: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
6490: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62  ->pEList;.  pTab
64a0: 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ->nCol = pEList-
64b0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
64c0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
64d0: 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d  ;.  pTab->aCol =
64e0: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61   aCol = sqliteMa
64f0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61  lloc( sizeof(pTa
6500: 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62  b->aCol[0])*pTab
6510: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28  ->nCol );.  for(
6520: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
6530: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
6540: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
6550: 45 78 70 72 20 2a 70 52 3b 0a 20 20 20 20 63 68  Expr *pR;.    ch
6560: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63  ar *zType;.    c
6570: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
6580: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
6590: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
65a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
65b0: 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ght==0 || p->pRi
65c0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  ght->token.z==0 
65d0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
65e0: 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  ken.z[0]!=0 );. 
65f0: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
6600: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
6610: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
6620: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
6630: 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rDup(zName);.   
6640: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
6650: 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20  ==TK_DOT .      
6660: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52 3d           && (pR=
6670: 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26  p->pRight)!=0 &&
6680: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20   pR->token.z && 
6690: 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29  pR->token.z[0] )
66a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 3b  {.      int cnt;
66b0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
66c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
66d0: 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b  T", &pR->token);
66e0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  .      for(j=cnt
66f0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
6700: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6710: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
6720: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
6730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6740: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
6750: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  );.          zNa
6760: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
6770: 6e 74 66 28 22 25 54 5f 25 64 22 2c 20 26 70 52  ntf("%T_%d", &pR
6780: 2d 3e 74 6f 6b 65 6e 2c 20 2b 2b 63 6e 74 29 3b  ->token, ++cnt);
6790: 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  .          j = -
67a0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
67b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
67c0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
67d0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
67e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
67f0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54  lite3MPrintf("%T
6800: 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20  ", &p->span);.  
6810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6820: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
6830: 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22  rintf("column%d"
6840: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , i+1);.    }.  
6850: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
6860: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f  (zName);.    pCo
6870: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
6880: 3b 0a 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73  ;..    zType = s
6890: 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75  qliteStrDup(colu
68a0: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20 70  mnType(pParse, p
68b0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 20 2c 70 29  Select->pSrc ,p)
68c0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  );.    pCol->zTy
68d0: 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20  pe = zType;.    
68e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
68f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
6900: 52 49 43 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  RIC;.    if( zTy
6910: 70 65 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  pe ){.      pCol
6920: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
6930: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
6940: 28 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a  (zType, strlen(z
6950: 54 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Type));.    }.  
6960: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
6970: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6980: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
6990: 20 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43     if( !pCol->pC
69a0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
69b0: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
69c0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
69e0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
69f0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
6a10: 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
6a20: 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65  tement, do three
6a30: 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20   things..**.**  
6a40: 20 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74    (1)  Fill in t
6a50: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
6a60: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
6a70: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
6a80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
6a90: 69 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66 20  ines the set of 
6aa0: 74 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75  tables that shou
6ab0: 6c 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 20  ld be scanned.  
6ac0: 46 6f 72 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20  For views,.**   
6ad0: 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
6ae0: 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
6af0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
6b00: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6b10: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
6b20: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
6b30: 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
6b40: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
6b50: 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
6b60: 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
6b70: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
6b80: 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
6b90: 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
6ba0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
6bb0: 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
6bc0: 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
6bd0: 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
6be0: 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
6bf0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
6c00: 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
6c10: 2a 2a 20 20 20 20 28 32 29 20 20 41 64 64 20 74  **    (2)  Add t
6c20: 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
6c30: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
6c40: 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
6c50: 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
6c60: 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
6c70: 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
6c80: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
6c90: 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  ins..**.**    (3
6ca0: 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
6cb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
6cc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
6cd0: 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
6ce0: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
6cf0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
6d00: 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
6d10: 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
6d20: 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
6d30: 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
6d40: 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
6d50: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
6d60: 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
6d70: 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
6d80: 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
6d90: 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
6da0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
6db0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
6dc0: 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d  here are problem
6dd0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
6de0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
6df0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
6e00: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
6e10: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
6e20: 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65  ColumnList(Parse
6e30: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6e40: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
6e50: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
6e60: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
6e70: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6e80: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
6e90: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
6ea0: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
6eb0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
6ec0: 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >pSrc==0 ) retur
6ed0: 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  n 1;.  pTabList 
6ee0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
6ef0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
6f00: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
6f10: 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68  very table in th
6f20: 65 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20  e table list..  
6f30: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
6f40: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
6f50: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
6f60: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
6f70: 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
6f80: 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  >pTab ){.      /
6f90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
6fa0: 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20  as run before!  
6fb0: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69  No need to conti
6fc0: 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nue */.      ret
6fd0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
6fe0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
6ff0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e==0 ){.      /*
7000: 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
7010: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7020: 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
7030: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
7040: 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  om->pSelect!=0 )
7050: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  ;.      if( pFro
7060: 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a  m->zAlias==0 ){.
7070: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a          pFrom->z
7080: 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20  Alias =.        
7090: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
70a0: 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72  ("sqlite_subquer
70b0: 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70  y_%p_", (void*)p
70c0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
70d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 46        }.      pF
70e0: 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
70f0: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
7100: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
7110: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72  lect(pParse, pFr
7120: 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f  om->zAlias, pFro
7130: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
7140: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7150: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7160: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7170: 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e 73    /* The isTrans
7180: 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63 61  ient flag indica
7190: 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62  tes that the Tab
71a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73  le structure has
71b0: 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64   been.      ** d
71c0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
71d0: 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20  ated and may be 
71e0: 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d  freed at any tim
71f0: 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
7200: 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61  ds,.      ** pTa
7210: 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  b is not pointin
7220: 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e  g to a persisten
7230: 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
7240: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20  e that defines. 
7250: 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20       ** part of 
7260: 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20  the schema. */. 
7270: 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61       pTab->isTra
7280: 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  nsient = 1;.    
7290: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
72a0: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
72b0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
72c0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
72d0: 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 72 6f 6d  e */.      pFrom
72e0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
72f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7300: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
7310: 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  se,pFrom->zName,
7320: 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
7330: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
7340: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
7350: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7360: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  }.      if( pTab
7370: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
7380: 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
7390: 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
73a0: 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
73b0: 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
73c0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
73d0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
73e0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
73f0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
7400: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7410: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49    }.        /* I
7420: 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  f pFrom->pSelect
7430: 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20  !=0 it means we 
7440: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
7450: 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69   a.        ** vi
7460: 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77  ew within a view
7470: 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
7480: 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65  ructure has alre
7490: 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20  ady been.       
74a0: 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68   ** copied by th
74b0: 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20  e outer view so 
74c0: 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20  we can skip the 
74d0: 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20  copy step here. 
74e0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
74f0: 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20   inner view..   
7500: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7510: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  if( pFrom->pSele
7520: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct==0 ){.       
7530: 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
7540: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7550: 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65  tDup(pTab->pSele
7560: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
7570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7580: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
7590: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
75a0: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
75b0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
75c0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
75d0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
75e0: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
75f0: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
7600: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
7610: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
7620: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
7630: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
7640: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
7650: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
7660: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
7670: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
7680: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
7690: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
76a0: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
76b0: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
76c0: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
76d0: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
76e0: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
76f0: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
7700: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
7710: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
7720: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7730: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
7740: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
7750: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
7760: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
7770: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
7780: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
7790: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
77a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
77b0: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
77c0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
77d0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
77e0: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
77f0: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
7800: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
7810: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7820: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7830: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
7840: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
7850: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
7860: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
7870: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
7880: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
7890: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
78a0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
78b0: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
78c0: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
78d0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
78e0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
78f0: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
7900: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7910: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
7920: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
7930: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
7940: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
7950: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
7960: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
7970: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
7980: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
7990: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
79a0: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
79b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
79c0: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
79d0: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
79e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
79f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
7a00: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
7a10: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
7a20: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
7a30: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7a40: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
7a50: 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
7a60: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
7a70: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
7a80: 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
7a90: 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
7aa0: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
7ab0: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
7ac0: 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
7ad0: 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
7ae0: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
7af0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
7b00: 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
7b10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7b20: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7b30: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
7b40: 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30  w, a[k].pExpr, 0
7b50: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
7b60: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
7b70: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
7b80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b  Name;.        a[
7b90: 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
7ba0: 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
7bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
7bc0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
7bd0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
7be0: 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
7bf0: 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
7c00: 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
7c10: 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
7c20: 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
7c30: 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
7c40: 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
7c50: 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
7c60: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
7c70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
7c80: 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
7c90: 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
7ca0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
7cb0: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
7cc0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
7cd0: 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74    zTName = sqlit
7ce0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7cf0: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
7d00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
7d10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
7d20: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
7d30: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
7d40: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
7d50: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
7d60: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
7d70: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
7d80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7d90: 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
7da0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
7db0: 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
7dc0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
7dd0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
7de0: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
7df0: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
7e00: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
7e10: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7e30: 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28   if( zTName && (
7e40: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
7e50: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  TabName[0]==0 ||
7e60: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7e70: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
7e80: 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
7e90: 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  me)!=0) ){.     
7ea0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7eb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7ec0: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
7ed0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7ee0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
7ef0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
7f00: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7f10: 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70  Expr, *pLeft, *p
7f20: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
7f30: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
7f40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
7f50: 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  Name;..         
7f60: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
7f80: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7f90: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
7fa0: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
7fb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
7fc0: 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Left->jointype &
7fd0: 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
7fe0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
7ff0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
8000: 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54  nIndex(pLeft->pT
8010: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
8020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8030: 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
8040: 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
8050: 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
8060: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
8070: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
8080: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
80b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
80c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
80d0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
80e0: 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  Left->pUsing, zN
80f0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8110: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
8120: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
8130: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
8140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8150: 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
8160: 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
8170: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
8180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8190: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
81a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
81b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
81c0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
81d0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
81e0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
81f0: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
8200: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
8210: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
8220: 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  en(&pRight->toke
8230: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
8240: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
8250: 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d  ame && pTabList-
8260: 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
8270: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
8280: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
8290: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
82b0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  r = sqlite3Expr(
82c0: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
82d0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
82e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
82f0: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
8310: 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f  Token(&pLeft->to
8320: 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  ken, zTabName);.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
8340: 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
8350: 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69  pan, sqlite3MPri
8360: 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61  ntf("%s.%s", zTa
8370: 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a  bName, zName));.
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8390: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
83a0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
83b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
83c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
83d0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
83e0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
83f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
8400: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
8410: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8420: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8430: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
8440: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8450: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
8460: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
8470: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8480: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
8490: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
84a0: 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  w, pExpr, 0);.  
84b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
84c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
84d0: 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
84e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
84f0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
8500: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8510: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
8520: 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
8530: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
8540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8550: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8560: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8570: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
8580: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
8590: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
85a0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
85b0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
85c0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
85d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
85e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
85f0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
8600: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
8610: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8630: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
8640: 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53  ly unlinks the S
8650: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
8660: 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  Tab pointers.** 
8670: 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75  in a select stru
8680: 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20  cture.  It just 
8690: 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  sets the pointer
86a0: 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  s to NULL.  This
86b0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72  .** routine is r
86c0: 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20  ecursive in the 
86d0: 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68  sense that if th
86e0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
86f0: 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69  ].pSelect.** poi
8700: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
8710: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
8720: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
8730: 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69  vely on that poi
8740: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
8750: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8760: 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74  ed on the Select
8770: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8780: 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45  defines a.** VIE
8790: 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e  W in order to un
87a0: 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20  do any bindings 
87b0: 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73  to tables.  This
87c0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a   is necessary.**
87d0: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
87e0: 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44  ables might be D
87f0: 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65  ROPed by a subse
8800: 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e  quent SQL comman
8810: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e  d..** If the bin
8820: 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65  dings are not re
8830: 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20  moved, then the 
8840: 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d  Select.pSrc->a[]
8850: 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77  .pTab field.** w
8860: 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
8870: 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f  ting to a deallo
8880: 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75  cated Table stru
8890: 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a  cture after the.
88a0: 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f  ** DROP and a co
88b0: 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75  redump will occu
88c0: 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  r the next time 
88d0: 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64  the VIEW is used
88e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
88f0: 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65  3SelectUnbind(Se
8900: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
8910: 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  i;.  SrcList *pS
8920: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
8930: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8940: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 54 61  tem *pItem;.  Ta
8950: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
8960: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
8970: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
8980: 3d 70 53 72 63 2d 3e 61 3b 20 69 3c 70 53 72 63  =pSrc->a; i<pSrc
8990: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
89a0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  em++){.    if( (
89b0: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
89c0: 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)!=0 ){.      
89d0: 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e  if( pTab->isTran
89e0: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  sient ){.       
89f0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
8a00: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20  ble(0, pTab);.  
8a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
8a20: 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
8a30: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
8a40: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
8a50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
8a60: 62 69 6e 64 28 70 49 74 65 6d 2d 3e 70 53 65 6c  bind(pItem->pSel
8a70: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
8a80: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8a90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
8aa0: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
8ab0: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
8ac0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8ad0: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
8ae0: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
8af0: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
8b00: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
8b10: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
8b20: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8b30: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
8b40: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
8b50: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
8b60: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
8b70: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
8b80: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
8b90: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
8ba0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
8bb0: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
8bc0: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
8bd0: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
8be0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
8bf0: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
8c00: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
8c10: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
8c20: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
8c30: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
8c40: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
8c50: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
8c60: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
8c70: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
8c80: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
8c90: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
8ca0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
8cb0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
8cc0: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
8cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8ce0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
8cf0: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
8d00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8d10: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
8d20: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
8d30: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
8d40: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
8d50: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
8d60: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
8d70: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
8d80: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
8d90: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
8da0: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
8db0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
8dc0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
8dd0: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
8de0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
8df0: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
8e00: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
8e10: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
8e20: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
8e30: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
8e40: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
8e50: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
8e60: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
8e70: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
8e80: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
8e90: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
8ea0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
8eb0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
8ec0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
8ed0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
8ee0: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
8ef0: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
8f00: 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  }.  if( fillInCo
8f10: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
8f20: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
8f30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
8f40: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
8f50: 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
8f60: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
8f70: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65  lumn(pParse, pSe
8f80: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  lect->pPrior, pO
8f90: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
8fa0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
8fb0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8fc0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8fd0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
8fe0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8ff0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9000: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9010: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9020: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
9030: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  l = -1;.    if( 
9040: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
9050: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
9060: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
9070: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
9080: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
9090: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
90a0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
90b0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
90c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
90d0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
90e0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
90f0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
9100: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
9110: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
9120: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
9130: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
9140: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
9150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9160: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
9170: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
9180: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
9190: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
91a0: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
91b0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
91c0: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
91d0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
91e0: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
91f0: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
9200: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
9210: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
9220: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
9230: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9240: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
9250: 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74    zLabel = sqlit
9260: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
9270: 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pE->token);.   
9280: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61       assert( zLa
9290: 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  bel!=0 );.      
92a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
92b0: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
92c0: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
92d0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
92e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
92f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62   sqliteFree(zLab
9300: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
9310: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
9320: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
9330: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
9340: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
9350: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
9360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9370: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
9380: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
9390: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
93a0: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
93b0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
93c0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
93d0: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
93e0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
93f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
9400: 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70  ol<0 && mustComp
9410: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  lete ){.      sq
9420: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9430: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
9440: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
9450: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
9460: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
9470: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
9480: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
9490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
94a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
94b0: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rr;  .}../*.** G
94c0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
94d0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
94e0: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
94f0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9500: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9510: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9520: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
9530: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
9540: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
9550: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
9560: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
9570: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
9580: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
9590: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
95a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
95b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
95c0: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
95d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
95e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
95f0: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
9600: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
9610: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
9620: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e  ased on the.** n
9630: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9640: 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69  t fields.  nLimi
9650: 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f  t and nOffset ho
9660: 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a  ld the integers.
9670: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
9680: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
9690: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
96a0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
96b0: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
96c0: 72 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f  rds.  Or that ho
96d0: 6c 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74  ld -1 and 0 if t
96e0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
96f0: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c  e omitted..** iL
9700: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
9710: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
9720: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
9730: 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20   numbers for.** 
9740: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
9750: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   compute the lim
9760: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
9770: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a  If there is no.*
9780: 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  * limit and/or o
9790: 66 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d  ffset, then iLim
97a0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
97b0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
97c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
97d0: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
97e0: 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64  es if iLimit and
97f0: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
9800: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
9810: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
9820: 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e   by nLimit and n
9830: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
9840: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
9850: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
9860: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
9870: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
9880: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
9890: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
98a0: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
98b0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
98c0: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c  e..** Only if nL
98d0: 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73  imit>=0 or nOffs
98e0: 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  et>0 do the limi
98f0: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
9900: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
9910: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
9920: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
9930: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
9940: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
9950: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
9960: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
9970: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
9980: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
9990: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
99a0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
99b0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
99c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
99d0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a  Select *p){.  /*
99e0: 20 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f   .  ** If the co
99f0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e  mparison is p->n
9a00: 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49  Limit>0 then "LI
9a10: 4d 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a  MIT 0" shows.  *
9a20: 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20  * all rows.  It 
9a30: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e  is the same as n
9a40: 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20  o limit. If the 
9a50: 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20  comparision is. 
9a60: 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   ** p->nLimit>=0
9a70: 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20   then "LIMIT 0" 
9a80: 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20  show no rows at 
9a90: 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54  all..  ** "LIMIT
9aa0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
9ab0: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
9ac0: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
9ad0: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
9ae0: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
9af0: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
9b00: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
9b10: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
9b20: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
9b30: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
9b40: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
9b50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
9b60: 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
9b70: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
9b80: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9b90: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9ba0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9bb0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
9bc0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
9bd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9be0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d   OP_Integer, -p-
9bf0: 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20  >nLimit, 0);.   
9c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9c10: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
9c20: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
9c30: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
9c40: 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  "# LIMIT counter
9c50: 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  "));.    p->iLim
9c60: 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20  it = iMem;.  }. 
9c70: 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e   if( p->nOffset>
9c80: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65  0 ){.    int iMe
9c90: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
9ca0: 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  ++;.    Vdbe *v 
9cb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
9cc0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
9cd0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
9ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9cf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
9d00: 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74  ger, -p->nOffset
9d10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9d20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9d30: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
9d40: 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   1);.    VdbeCom
9d50: 6d 65 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53  ment((v, "# OFFS
9d60: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
9d70: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
9d80: 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iMem;.  }.}../*.
9d90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
9da0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
9db0: 61 74 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74  at will open a t
9dc0: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74  ransient table t
9dd0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75  hat.** will be u
9de0: 73 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  sed for an index
9df0: 20 6f 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79   or to store key
9e00: 65 64 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61  ed results for a
9e10: 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c   compound.** sel
9e20: 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
9e30: 6f 72 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61  ords, open a tra
9e40: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61  nsient table tha
9e50: 74 20 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79  t needs a.** Key
9e60: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
9e70: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
9e80: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65  olumns in the Ke
9e90: 79 49 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69  yInfo is determi
9ea0: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65  ned.** by the re
9eb0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
9ec0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9ed0: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
9ee0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53  rgument..**.** S
9ef0: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
9f00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9f10: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69  led to open an i
9f20: 6e 64 65 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a  ndex table for.*
9f30: 2a 20 44 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f  * DISTINCT, UNIO
9f40: 4e 2c 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64  N, INTERSECT and
9f50: 20 45 58 43 45 50 54 20 73 65 6c 65 63 74 20 73   EXCEPT select s
9f60: 74 61 74 65 6d 65 6e 74 73 20 28 62 75 74 20 6e  tatements (but n
9f70: 6f 74 20 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c  ot .** UNION ALL
9f80: 29 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68  )..**.** Make th
9f90: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65  e new table a Ke
9fa0: 79 41 73 44 61 74 61 20 74 61 62 6c 65 20 69 66  yAsData table if
9fb0: 20 6b 65 79 41 73 44 61 74 61 20 69 73 20 74 72   keyAsData is tr
9fc0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ue..**.** The va
9fd0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
9fe0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
9ff0: 68 65 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  he OP_OpenTemp i
a000: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  nstruction..*/.s
a010: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 65  tatic int openTe
a020: 6d 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  mpIndex(Parse *p
a030: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
a040: 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
a050: 6b 65 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65  keyAsData){.  Ke
a060: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
a070: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a  .  int nColumn;.
a080: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a090: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a0a0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  t i;.  Vdbe *v =
a0b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a0c0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69    int addr;..  i
a0d0: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
a0e0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
a0f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a100: 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20    }.  nColumn = 
a110: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
a120: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73  ;.  pKeyInfo = s
a130: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
a140: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e  eof(*pKeyInfo)+n
a150: 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f  Column*sizeof(Co
a160: 6c 6c 53 65 71 2a 29 20 29 3b 0a 20 20 69 66 28  llSeq*) );.  if(
a170: 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72   pKeyInfo==0 ) r
a180: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4b 65 79 49  eturn 0;.  pKeyI
a190: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64 62 2d 3e 65  nfo->enc = db->e
a1a0: 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  nc;.  pKeyInfo->
a1b0: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e  nField = nColumn
a1c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
a1d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
a1e0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
a1f0: 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[i] = sqlite3Ex
a200: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
a210: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
a220: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
a230: 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ( !pKeyInfo->aCo
a240: 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70  ll[i] ){.      p
a250: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
a260: 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  ] = db->pDfltCol
a270: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  l;.    }.  }.  a
a280: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
a290: 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  eOp3(v, OP_OpenT
a2a0: 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20 0a 20  emp, iTab, 0, . 
a2b0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
a2c0: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
a2d0: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28  _HANDOFF);.  if(
a2e0: 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a 20 20   keyAsData ){.  
a2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a300: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
a310: 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20 20  ta, iTab, 1);.  
a320: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
a330: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
a340: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a350: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 41 64  _SELECT./*.** Ad
a360: 64 20 74 68 65 20 61 64 64 72 65 73 73 20 22 61  d the address "a
a370: 64 64 72 22 20 74 6f 20 74 68 65 20 73 65 74 20  ddr" to the set 
a380: 6f 66 20 61 6c 6c 20 4f 70 65 6e 54 65 6d 70 20  of all OpenTemp 
a390: 6f 70 63 6f 64 65 20 61 64 64 72 65 73 73 65 73  opcode addresses
a3a0: 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 62 65 69  .** that are bei
a3b0: 6e 67 20 61 63 63 75 6d 75 6c 61 74 65 64 20 69  ng accumulated i
a3c0: 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2e  n p->ppOpenTemp.
a3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
a3e0: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65  ultiSelectOpenTe
a3f0: 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20 2a 70  mpAddr(Select *p
a400: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 49  , int addr){.  I
a410: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 2a  dList *pList = *
a420: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  p->ppOpenTemp = 
a430: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
a440: 65 6e 64 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65  end(*p->ppOpenTe
a450: 6d 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4c  mp, 0);.  if( pL
a460: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ist==0 ){.    re
a470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a480: 4d 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  M;.  }.  pList->
a490: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 2d 31 5d 2e  a[pList->nId-1].
a4a0: 69 64 78 20 3d 20 61 64 64 72 3b 0a 20 20 72 65  idx = addr;.  re
a4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a4c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a4d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a4e0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
a4f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a500: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
a510: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
a520: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
a530: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
a540: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
a550: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
a560: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
a570: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
a580: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
a590: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
a5a0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
a5b0: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
a5c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
a5d0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
a5e0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
a5f0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
a600: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
a610: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
a620: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
a630: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
a640: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
a650: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
a660: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
a670: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
a680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a690: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
a6a0: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
a6b0: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
a6c0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
a6d0: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
a6e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a6f0: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
a700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
a710: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  et = 0;.  }.  if
a720: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
a730: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
a740: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
a750: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
a760: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
a770: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
a780: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a790: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
a7a0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
a7b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a7c0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
a7d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a7e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a7f0: 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79   process a query
a800: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20   that is really 
a810: 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20  the union.** or 
a820: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
a830: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
a840: 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a  rate queries..**
a850: 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
a860: 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
a870: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
a880: 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
a890: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
a8a0: 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
a8b0: 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
a8c0: 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
a8d0: 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
a8e0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
a8f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
a900: 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
a910: 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
a920: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
a930: 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
a940: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
a950: 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
a960: 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
a970: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
a980: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
a990: 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
a9a0: 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
a9b0: 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
a9c0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
a9d0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
a9e0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
a9f0: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
aa00: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
aa10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
aa20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
aa30: 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
aa40: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
aa50: 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
aa60: 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
aa70: 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
aa80: 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
aa90: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
aaa0: 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
aab0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
aac0: 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
aad0: 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
aae0: 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
aaf0: 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
ab00: 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
ab10: 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
ab20: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ab30: 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
ab40: 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
ab50: 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
ab60: 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
ab70: 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
ab80: 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
ab90: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
aba0: 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
abb0: 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
abc0: 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
abd0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
abe0: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
abf0: 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
ac00: 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
ac10: 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
ac20: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
ac30: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
ac40: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
ac50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ac60: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
ac70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ac80: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
ac90: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
aca0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ded */.  int eDe
acb0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  st,            /
acc0: 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75  * \___  Store qu
acd0: 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73  ery results as s
ace0: 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e  pecified */.  in
acf0: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
ad00: 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20      /* /     by 
ad10: 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65  these two parame
ad20: 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f  ters.         */
ad30: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
ad40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
ad50: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
ad60: 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
ad70: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
ad80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ad90: 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
ada0: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
adb0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
adc0: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
add0: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
ade0: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
adf0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
ae00: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
ae10: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
ae20: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
ae30: 56 44 42 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74  VDBE */.  IdList
ae40: 20 2a 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b   *pOpenTemp = 0;
ae50: 2f 2a 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 6f  /* OP_OpenTemp o
ae60: 70 63 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64  pcodes that need
ae70: 20 61 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20   a KeyInfo */.  
ae80: 69 6e 74 20 61 41 64 64 72 5b 35 5d 3b 20 20 20  int aAddr[5];   
ae90: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
aea0: 65 73 20 6f 66 20 53 65 74 4e 75 6d 43 6f 6c 75  es of SetNumColu
aeb0: 6d 6e 73 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  mns operators */
aec0: 0a 20 20 69 6e 74 20 6e 41 64 64 72 20 3d 20 30  .  int nAddr = 0
aed0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
aee0: 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  er used */.  int
aef0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
af00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
af10: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
af20: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
af30: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
af40: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
af50: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
af60: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
af70: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
af80: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
af90: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
afa0: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
afb0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
afc0: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
afd0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
afe0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
aff0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
b000: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b010: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
b020: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69  = p->pPrior;.  i
b030: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
b040: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
b050: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b060: 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
b070: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
b080: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
b090: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
b0a0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
b0b0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
b0c0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b0d0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
b0e0: 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74  ( pPrior->nLimit
b0f0: 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e  >=0 || pPrior->n
b100: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
b110: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b120: 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c  pParse,"LIMIT cl
b130: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
b140: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
b150: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
b160: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
b170: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
b180: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b190: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
b1a0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
b1b0: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
b1c0: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
b1d0: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
b1e0: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
b1f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b200: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
b210: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  v==0 ){.    rc =
b220: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
b230: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b240: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 20 74   }..  /* If *p t
b250: 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
b260: 2d 6d 6f 73 74 20 73 65 6c 65 63 74 20 73 74 61  -most select sta
b270: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 69 6e 69  tement, then ini
b280: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 70 2d 3e  tialize.  ** p->
b290: 70 70 4f 70 65 6e 54 65 6d 70 20 74 6f 20 70 6f  ppOpenTemp to po
b2a0: 69 6e 74 20 74 6f 20 70 4f 70 65 6e 54 65 6d 70  int to pOpenTemp
b2b0: 2e 20 20 49 66 20 2a 70 20 69 73 20 6e 6f 74 20  .  If *p is not 
b2c0: 74 68 65 20 72 69 67 68 74 20 6d 6f 73 74 0a 20  the right most. 
b2d0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
b2e0: 65 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  en p->ppOpenTemp
b2f0: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
b300: 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  dy been initiali
b310: 7a 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 70 72  zed.  ** by a pr
b320: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ior call to this
b330: 20 73 61 6d 65 20 70 72 6f 63 65 64 75 72 65 2e   same procedure.
b340: 20 20 50 61 73 73 20 61 6c 6f 6e 67 20 74 68 65    Pass along the
b350: 20 70 4f 70 65 6e 54 65 6d 70 0a 20 20 2a 2a 20   pOpenTemp.  ** 
b360: 70 6f 69 6e 74 65 72 20 74 6f 20 70 50 72 69 6f  pointer to pPrio
b370: 72 2c 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  r, the next stat
b380: 65 6d 65 6e 74 20 74 6f 20 6f 75 72 20 6c 65 66  ement to our lef
b390: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
b3a0: 3e 70 70 4f 70 65 6e 54 65 6d 70 3d 3d 30 20 29  >ppOpenTemp==0 )
b3b0: 7b 0a 20 20 20 20 70 2d 3e 70 70 4f 70 65 6e 54  {.    p->ppOpenT
b3c0: 65 6d 70 20 3d 20 26 70 4f 70 65 6e 54 65 6d 70  emp = &pOpenTemp
b3d0: 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 2d 3e  ;.  }.  pPrior->
b3e0: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e  ppOpenTemp = p->
b3f0: 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 0a 20 20 2f  ppOpenTemp;..  /
b400: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
b410: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
b420: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
b430: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
b440: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
b450: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73 73  Table ){.    ass
b460: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
b470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b480: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b490: 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
b4a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 41  ;.    assert( nA
b4b0: 64 64 72 3d 3d 30 20 29 3b 0a 20 20 20 20 61 41  ddr==0 );.    aA
b4c0: 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73  ddr[nAddr++] = s
b4d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b4e0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
b4f0: 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  mns, iParm, 0);.
b500: 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f      eDest = SRT_
b510: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
b520: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
b530: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
b540: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
b550: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
b560: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
b570: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
b580: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
b590: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  >pOrderBy==0 ){.
b5a0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
b5b0: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
b5c0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
b5d0: 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d  or->nOffset = p-
b5e0: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >nOffset;.      
b5f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
b600: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
b610: 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  ior, eDest, iPar
b620: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  m, 0, 0, 0, aff)
b630: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
b640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
b650: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
b660: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
b670: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
b680: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
b690: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
b6a0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
b6b0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
b6c0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
b6d0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69          p->nLimi
b6e0: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
b6f0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
b700: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b710: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b720: 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
b730: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
b740: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  );.        p->pP
b750: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
b760: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
b770: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
b780: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
b790: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b7a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b7b0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
b7c0: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
b7d0: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
b7e0: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
b7f0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
b800: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
b810: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
b820: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
b830: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
b840: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
b850: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
b860: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
b870: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
b880: 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  t op = 0;      /
b890: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
b8a0: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
b8b0: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
b8c0: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
b8d0: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
b8e0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
b8f0: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
b900: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
b910: 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66   int nLimit, nOf
b920: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
b930: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
b940: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
b950: 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  t */.      ExprL
b960: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
b970: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b980: 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 72  clause for the r
b990: 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ight SELECT */. 
b9a0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
b9b0: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
b9c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
b9d0: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
b9e0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
b9f0: 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20   eDest==priorOp 
ba00: 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  && p->pOrderBy==
ba10: 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30  0 && p->nLimit<0
ba20: 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d   && p->nOffset==
ba30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
ba40: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
ba50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
ba60: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
ba70: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
ba80: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
ba90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
baa0: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72   unionTab = iPar
bab0: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
bac0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
bad0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
bae0: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
baf0: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
bb00: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
bb10: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
bb20: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
bb30: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
bb40: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
bb50: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
bb60: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20   p->pOrderBy .  
bb70: 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72        && matchOr
bb80: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
bb90: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
bba0: 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  erBy, unionTab, 
bbb0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
bbc0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
bbd0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
bbe0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
bbf0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20   }.        addr 
bc00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
bc10: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
bc20: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  p, unionTab, 0);
bc30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
bc40: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
bc50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c          rc = mul
bc60: 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70  tiSelectOpenTemp
bc70: 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20  Addr(p, addr);. 
bc80: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
bc90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bca0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
bcb0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
bcd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bce0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
bcf0: 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61  yAsData, unionTa
bd00: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 1);.        }
bd10: 0a 09 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c  ..assert( nAddr<
bd20: 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69  sizeof(aAddr)/si
bd30: 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29  zeof(aAddr[0]) )
bd40: 3b 0a 20 20 20 20 20 20 20 20 61 41 64 64 72 5b  ;.        aAddr[
bd50: 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74  nAddr++] = sqlit
bd60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bd70: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
bd80: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
bd90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bda0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
bdb0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
bdc0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
bdd0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
bde0: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
bdf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
be00: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
be10: 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20  Prior, priorOp, 
be20: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
be30: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
be40: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
be50: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
be60: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
be70: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
be80: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
be90: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
bea0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63    */.      switc
beb0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
bec0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
bed0: 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45  EPT:  op = SRT_E
bee0: 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a  xcept;   break;.
bef0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
bf00: 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53  _UNION:   op = S
bf10: 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65  RT_Union;    bre
bf20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
bf30: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70  e TK_ALL:     op
bf40: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20   = SRT_Table;   
bf50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bf60: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
bf70: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  = 0;.      pOrde
bf80: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
bf90: 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  y;.      p->pOrd
bfa0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
bfb0: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
bfc0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  it;.      p->nLi
bfd0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
bfe0: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
bff0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  fset;.      p->n
c000: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c010: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c020: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
c030: 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  op, unionTab, 0,
c040: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
c050: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
c060: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
c070: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
c080: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  rBy;.      p->nL
c090: 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  imit = nLimit;. 
c0a0: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
c0b0: 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = nOffset;.     
c0c0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->iLimit = -1;
c0d0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
c0e0: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  t = -1;.      if
c0f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c100: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c110: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
c120: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
c130: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
c140: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
c150: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
c160: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
c170: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
c180: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
c190: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
c1a0: 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f   if( eDest!=prio
c1b0: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
c1c0: 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =iParm ){.      
c1d0: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
c1e0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
c1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c200: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
c210: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
c220: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
c230: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
c240: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
c250: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
c260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c270: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
c280: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c290: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
c2a0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
c2b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c2c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c2d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
c2e0: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
c2f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
c300: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
c310: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
c320: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
c330: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
c340: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
c350: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
c360: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
c370: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
c380: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
c390: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f             p->pO
c3c0: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
c3d0: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
c400: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
c410: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c420: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
c430: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
c440: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c450: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
c470: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
c480: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
c490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c4a0: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
c4b0: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
c4c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c4d0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
c4e0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
c4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c500: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
c510: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
c520: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c540: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
c550: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
c560: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
c570: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
c580: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e  iStart;.      in
c590: 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65  t nLimit, nOffse
c5a0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
c5b0: 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  r;..      /* INT
c5c0: 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
c5d0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
c5e0: 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
c5f0: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
c600: 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
c610: 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
c620: 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
c630: 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
c640: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
c650: 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
c660: 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
c670: 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
c680: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
c690: 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
c6a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
c6b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
c6c0: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
c6d0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
c6e0: 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61  p,p->pOrderBy,ta
c6f0: 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b1,1) ){.       
c700: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
c710: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c720: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c730: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
c740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c750: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
c760: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ab1, 0);.      r
c770: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
c780: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
c790: 64 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ddr);.      if( 
c7a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c7b0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c7c0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c7e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c7f0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
c800: 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab1, 1);.      
c810: 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69  assert( nAddr<si
c820: 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65  zeof(aAddr)/size
c830: 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a  of(aAddr[0]) );.
c840: 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64        aAddr[nAdd
c850: 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  r++] = sqlite3Vd
c860: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
c870: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62  tNumColumns, tab
c880: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
c890: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
c8a0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
c8b0: 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
c8c0: 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
c8d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
c8e0: 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
c8f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c900: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c910: 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f  pPrior, SRT_Unio
c920: 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30  n, tab1, 0, 0, 0
c930: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
c940: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c950: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c960: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
c970: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
c980: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
c990: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
c9a0: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
c9b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
c9c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c9d0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
c9e0: 6d 70 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  mp, tab2, 0);.  
c9f0: 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
ca00: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
ca10: 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (p, addr);.     
ca20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ca30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
ca40: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ca50: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
ca60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca70: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
ca80: 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20  ata, tab2, 1);. 
ca90: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 64       assert( nAd
caa0: 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29  dr<sizeof(aAddr)
cab0: 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d  /sizeof(aAddr[0]
cac0: 29 20 29 3b 0a 20 20 20 20 20 20 61 41 64 64 72  ) );.      aAddr
cad0: 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69  [nAddr++] = sqli
cae0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
caf0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
cb00: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
cb10: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
cb20: 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20  .      nLimit = 
cb30: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
cb40: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->nLimit = -1;
cb50: 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d  .      nOffset =
cb60: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
cb70: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
cb80: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
cb90: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
cba0: 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e  se, p, SRT_Union
cbb0: 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c  , tab2, 0, 0, 0,
cbc0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
cbd0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
cbe0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
cbf0: 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
cc00: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f   p->nOffset = nO
cc10: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
cc20: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
cc30: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
cc40: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
cc50: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
cc60: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
cc70: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
cc80: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
cc90: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
cca0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
ccb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ccc0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
ccd0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
cce0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
ccf0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
cd00: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
cd10: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
cd20: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
cd30: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
cd40: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
cd50: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
cd60: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
cd70: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
cd80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cd90: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
cda0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f  Break);.      co
cdb0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
cdc0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ers(pParse, p);.
cdd0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
cde0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cdf0: 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74  v, OP_FullKey, t
ce00: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab1, 0);.      s
ce10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce20: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
ce30: 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  tab2, iCont);.  
ce40: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
ce50: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
ce60: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
ce70: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
ce80: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
ceb0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
cec0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
cef0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
cf00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
cf10: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
cf20: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
cf30: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
cf40: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
cf50: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
cf60: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
cf70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cf80: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
cf90: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
cfa0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cfb0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
cfc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cfd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
cfe0: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
cff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d000: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
d010: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
d020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d030: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
d040: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
d050: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
d060: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
d070: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
d080: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
d090: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
d0a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
d0b0: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
d0c0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
d0d0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d0e0: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
d0f0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
d100: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d110: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
d120: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
d130: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
d140: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
d150: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
d160: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
d170: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
d180: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
d190: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
d1a0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d1b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
d1c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d1d0: 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61  lumns in tempora
d1e0: 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20  ry tables.  */. 
d1f0: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
d200: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c  t->nExpr;.  whil
d210: 65 28 20 6e 41 64 64 72 3e 30 20 29 7b 0a 20 20  e( nAddr>0 ){.  
d220: 20 20 6e 41 64 64 72 2d 2d 3b 0a 20 20 20 20 73    nAddr--;.    s
d230: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d240: 50 32 28 76 2c 20 61 41 64 64 72 5b 6e 41 64 64  P2(v, aAddr[nAdd
d250: 72 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a  r], nCol);.  }..
d260: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
d270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
d280: 20 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20   used by either 
d290: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d2a0: 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61  use or.  ** by a
d2b0: 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ny temporary tab
d2c0: 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
d2d0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
d2e0: 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
d2f0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
d300: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
d310: 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
d320: 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20  tables.  Invoke 
d330: 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42  the.  ** ORDER B
d340: 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20  Y processing if 
d350: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
d360: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  R BY clause..  *
d370: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
d380: 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
d390: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
d3a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
d3b0: 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
d3c0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
d3d0: 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
d3e0: 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
d3f0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
d400: 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
d410: 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
d420: 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
d430: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d440: 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
d450: 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
d460: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
d470: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c  ( p->pOrderBy ||
d480: 20 28 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 70   (pOpenTemp && p
d490: 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29  OpenTemp->nId>0)
d4a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d4d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
d4e0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
d4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d500: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d510: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
d520: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
d530: 72 74 28 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  rt( p->ppOpenTem
d540: 70 20 3d 3d 20 26 70 4f 70 65 6e 54 65 6d 70 20  p == &pOpenTemp 
d550: 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  );.    pKeyInfo 
d560: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
d570: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
d580: 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c  +nCol*sizeof(Col
d590: 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28  lSeq*));.    if(
d5a0: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
d5b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d5c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
d5d0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d5e0: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
d5f0: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70  KeyInfo->enc = p
d600: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
d610: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
d620: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
d630: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
d640: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
d650: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
d660: 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
d670: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d680: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
d690: 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  !pKeyInfo->aColl
d6a0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  [i] ){.        p
d6b0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
d6c0: 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ] = pParse->db->
d6d0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
d6e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
d6f0: 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70  r(i=0; pOpenTemp
d700: 20 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d   && i<pOpenTemp-
d710: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
d720: 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28    int p3type = (
d730: 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f  i==0?P3_KEYINFO_
d740: 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e  HANDOFF:P3_KEYIN
d750: 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  FO);.      int a
d760: 64 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d  ddr = pOpenTemp-
d770: 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20  >a[i].idx;.     
d780: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d790: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
d7a0: 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
d7b0: 70 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a  p3type);.    }..
d7c0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
d7d0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72  rBy ){.      str
d7e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d7f0: 6d 20 2a 70 4f 72 64 65 72 42 79 54 65 72 6d 20  m *pOrderByTerm 
d800: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  = p->pOrderBy->a
d810: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
d820: 20 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   i<p->pOrderBy->
d830: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 72 64  nExpr; i++, pOrd
d840: 65 72 42 79 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  erByTerm++){.   
d850: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d860: 20 3d 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d   = pOrderByTerm-
d870: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
d880: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f  char *zName = pO
d890: 72 64 65 72 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d  rderByTerm->zNam
d8a0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
d8b0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
d8c0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
d8d0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29  ->iColumn<nCol )
d8e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d8f0: 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  ( !pExpr->pColl 
d900: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
d910: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
d920: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
d930: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
d940: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e  llSeq(pParse, zN
d950: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
d960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d970: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
d980: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
d990: 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
d9a0: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
d9b0: 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72     }.      gener
d9c0: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
d9d0: 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  se, p, v, p->pEL
d9e0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
d9f0: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d  t, iParm);.    }
da00: 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e  ..    if( !pOpen
da10: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Temp ){.      /*
da20: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   This happens fo
da30: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
da40: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
da50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
da60: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  yInfo);.    }.  
da70: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
da80: 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e  end:.  if( pOpen
da90: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
daa0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
dab0: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a  pOpenTemp);.  }.
dac0: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
dad0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
dae0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
daf0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
db00: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
db10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
db20: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61  T_VIEW./*.** Sca
db30: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
db40: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
db50: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
db60: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
db70: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
db80: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
db90: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
dba0: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
dbb0: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
dbc0: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
dbd0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
dbe0: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
dbf0: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
dc00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
dc10: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
dc20: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
dc30: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
dc40: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
dc50: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
dc60: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
dc70: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
dc80: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
dc90: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
dca0: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
dcb0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
dcc0: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
dcd0: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
dce0: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
dcf0: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
dd00: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
dd10: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
dd20: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
dd30: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
dd40: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
dd50: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
dd60: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
dd70: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
dd80: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
dd90: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
dda0: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
ddb0: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
ddc0: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
ddd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
dde0: 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78  stExpr(Expr *pEx
ddf0: 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  pr, int iTable, 
de00: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
de10: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
de20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
de30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
de40: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
de50: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
de60: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
de70: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
de80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
de90: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
dea0: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
deb0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
dec0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
ded0: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
dee0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
def0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
df00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
df10: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
df20: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
df30: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
df40: 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
df50: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
df60: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
df70: 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
df80: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
df90: 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
dfa0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
dfb0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
dfc0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
dfd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
dfe0: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
dff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e000: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
e010: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
e020: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
e030: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
e040: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
e050: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
e060: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
e070: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
e080: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
e090: 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
e0a0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
e0b0: 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
e0c0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
e0d0: 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
e0e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
e0f0: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
e100: 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
e110: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
e120: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
e130: 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
e140: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
e150: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
e160: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
e170: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e180: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
e190: 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
e1a0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
e1b0: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
e1c0: 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
e1d0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
e1e0: 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
e1f0: 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
e200: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
e210: 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62  static void .sub
e220: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
e230: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
e240: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
e250: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
e260: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
e270: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
e280: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
e290: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e2a0: 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73    substExpr(pLis
e2b0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
e2c0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
e2d0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
e2e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e2f0: 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
e300: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e310: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
e320: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
e330: 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
e340: 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
e350: 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
e360: 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
e370: 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
e380: 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
e390: 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
e3a0: 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
e3b0: 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
e3c0: 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
e3d0: 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
e3e0: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
e3f0: 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
e400: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
e410: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
e420: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
e430: 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
e440: 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
e450: 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
e460: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
e470: 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
e480: 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
e490: 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
e4a0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
e4b0: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
e4c0: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
e4d0: 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
e4e0: 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
e4f0: 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
e500: 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
e510: 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
e520: 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
e530: 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
e540: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
e550: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
e560: 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
e570: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
e580: 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
e590: 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
e5a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e5b0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
e5c0: 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
e5d0: 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
e5e0: 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
e5f0: 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
e600: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
e610: 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
e620: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
e630: 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
e640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
e650: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
e660: 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
e670: 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
e680: 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
e690: 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
e6a0: 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
e6b0: 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
e6c0: 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
e6d0: 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
e6e0: 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
e6f0: 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
e700: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
e710: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
e720: 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
e730: 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
e740: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e750: 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
e760: 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
e770: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
e780: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
e790: 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
e7a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
e7b0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
e7c0: 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
e7d0: 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
e7e0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
e7f0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
e800: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
e810: 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
e820: 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
e830: 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a   outer join, or.
e840: 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75  **        the su
e850: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74  bquery is not it
e860: 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54  self a join.  (T
e870: 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a  icket #306).**.*
e880: 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
e890: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
e8a0: 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
e8b0: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
e8c0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
e8d0: 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
e8e0: 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
e8f0: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
e900: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
e910: 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
e920: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
e930: 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
e940: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
e950: 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
e960: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
e970: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
e980: 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
e990: 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
e9a0: 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
e9b0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
e9c0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
e9d0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
e9e0: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
e9f0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
ea00: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
ea10: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
ea20: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
ea30: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
ea40: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
ea50: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
ea60: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
ea70: 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
ea80: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
ea90: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
eaa0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
eab0: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
eac0: 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
ead0: 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
eae0: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
eaf0: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
eb00: 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
eb10: 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
eb20: 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71    (12)  The subq
eb30: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
eb40: 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
eb50: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
eb60: 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
eb70: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
eb80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
eb90: 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74  (added by ticket
eba0: 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20   #350).**.** In 
ebb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
ebc0: 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
ebd0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
ebe0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
ebf0: 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
ec00: 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
ec10: 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
ec20: 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
ec30: 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
ec40: 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
ec50: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
ec60: 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
ec70: 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
ec80: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
ec90: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
eca0: 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
ecb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
ecc0: 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
ecd0: 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
ece0: 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
ecf0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
ed00: 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
ed10: 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
ed20: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
ed30: 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
ed40: 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
ed50: 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
ed60: 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
ed70: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
ed80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
ed90: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
eda0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
edb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
edc0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
edd0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
ede0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
edf0: 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
ee00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
ee10: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
ee20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
ee30: 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
ee40: 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
ee50: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
ee60: 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
ee70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
ee80: 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
ee90: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
eea0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
eeb0: 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
eec0: 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
eed0: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
eee0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
eef0: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
ef00: 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
ef10: 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
ef20: 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
ef30: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
ef40: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
ef50: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
ef60: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
ef70: 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
ef80: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
ef90: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
efa0: 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
efb0: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
efc0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
efd0: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
efe0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
eff0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
f000: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
f010: 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
f020: 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
f030: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f050: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f060: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
f090: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
f0a0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f0b0: 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
f0c0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
f0d0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
f0e0: 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
f0f0: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
f100: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
f110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
f120: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f130: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
f140: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
f150: 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
f160: 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
f170: 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
f180: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
f190: 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
f1a0: 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
f1b0: 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
f1c0: 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
f1d0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
f1e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f1f0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
f200: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
f210: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62  return 0;.  pSub
f220: 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
f230: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
f240: 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75  Src );.  if( pSu
f250: 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
f260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f270: 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
f280: 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  t || pSub->nLimi
f290: 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d  t>=0) &&  (pSrc-
f2a0: 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
f2b0: 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
f2c0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
f2d0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
f2e0: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  p->nLimit>=0) &&
f2f0: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
f300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f310: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
f320: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
f330: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
f340: 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
f350: 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
f360: 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
f370: 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
f380: 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
f390: 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
f3a0: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
f3b0: 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
f3c0: 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
f3d0: 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
f3e0: 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
f3f0: 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
f400: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
f410: 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
f420: 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
f430: 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
f440: 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
f450: 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
f460: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
f470: 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
f480: 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
f490: 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
f4a0: 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
f4b0: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
f4c0: 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
f4d0: 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
f4e0: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
f4f0: 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
f500: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f510: 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
f520: 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
f530: 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
f540: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
f550: 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
f560: 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
f570: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
f580: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
f590: 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
f5a0: 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
f5b0: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
f5c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f5d0: 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
f5e0: 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
f5f0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
f600: 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
f610: 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
f620: 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
f630: 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
f640: 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
f650: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
f660: 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
f670: 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
f680: 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
f690: 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
f6a0: 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
f6b0: 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
f6c0: 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
f6d0: 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
f6e0: 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
f6f0: 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
f700: 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
f710: 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
f720: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
f730: 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
f740: 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
f750: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f760: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
f770: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
f780: 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
f790: 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
f7a0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
f7b0: 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
f7c0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
f7d0: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
f7e0: 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
f7f0: 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
f800: 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
f810: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
f820: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
f830: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
f840: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
f850: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
f860: 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
f870: 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
f880: 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
f890: 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
f8a0: 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
f8b0: 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
f8c0: 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
f8d0: 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
f8e0: 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
f8f0: 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
f900: 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
f910: 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
f920: 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
f930: 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
f940: 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
f950: 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
f960: 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
f970: 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
f980: 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
f990: 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
f9a0: 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
f9b0: 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
f9c0: 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
f9d0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
f9e0: 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
f9f0: 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
fa00: 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
fa10: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
fa20: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
fa30: 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20  ubitem->pTab;.. 
fa40: 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70     if( pTab && p
fa50: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
fa60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa70: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
fa80: 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b  pSubitem->pTab);
fa90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
faa0: 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
fab0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
fac0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
fad0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
fae0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
faf0: 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
fb00: 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
fb10: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
fb20: 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
fb30: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
fb40: 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
fb50: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
fb60: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
fb70: 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
fb80: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
fb90: 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
fba0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
fbb0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
fbc0: 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
fbd0: 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
fbe0: 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
fbf0: 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
fc00: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
fc10: 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
fc20: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
fc30: 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
fc40: 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
fc50: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
fc60: 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
fc70: 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
fc80: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
fc90: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
fca0: 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
fcb0: 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
fcc0: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
fcd0: 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
fce0: 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
fcf0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
fd00: 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
fd10: 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
fd20: 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
fd30: 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
fd40: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
fd50: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
fd60: 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
fd70: 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
fd80: 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
fd90: 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
fda0: 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
fdb0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
fdc0: 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
fdd0: 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
fde0: 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
fdf0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
fe00: 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
fe10: 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
fe20: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
fe30: 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
fe40: 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
fe50: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
fe60: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
fe70: 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
fe80: 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
fe90: 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
fea0: 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
feb0: 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
fec0: 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
fed0: 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70  .  */.  substExp
fee0: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
fef0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
ff00: 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74  pEList);.  pList
ff10: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
ff20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
ff30: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
ff40: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
ff50: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
ff60: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
ff70: 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
ff80: 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
ff90: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
ffa0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
ffb0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
ffc0: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
ffd0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
ffe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fff0: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
10000 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
10010 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
10020 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10030 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10040 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
10050 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10060 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
10070 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
10080 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
10090 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
100a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
100b0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
100c0 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
100d0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
100e0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
100f0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
10100 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
10110 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
10120 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
10130 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
10140 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
10150 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
10160 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
10170 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
10180 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
10190 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
101a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
101b0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
101c0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
101d0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
101e0 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
101f0 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
10200 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
10210 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10220 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
10230 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
10240 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c  rAnd(p->pHaving,
10250 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10260 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b  pSub->pHaving));
10270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10280 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
10290 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
102a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
102b0 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
102c0 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  By);.  }else{.  
102d0 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
102e0 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
102f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10300 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
10310 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d  qlite3ExprAnd(p-
10320 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
10330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
10340 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
10350 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
10360 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
10370 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
10380 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
10390 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
103a0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
103b0 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
103c0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
103d0 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
103e0 68 65 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73  he limit express
103f0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ion from the sub
10400 71 75 65 72 79 20 74 6f 20 74 68 65 20 6f 75 74  query to the out
10410 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20  er.  ** query.. 
10420 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
10430 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
10440 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30   if( p->nLimit<0
10450 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
10460 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
10470 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  it;.    }else if
10480 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e  ( p->nLimit+p->n
10490 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e  Offset > pSub->n
104a0 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66  Limit+pSub->nOff
104b0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
104c0 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e  nLimit = pSub->n
104d0 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f  Limit + pSub->nO
104e0 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73  ffset - p->nOffs
104f0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
10500 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53  p->nOffset += pS
10510 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20  ub->nOffset;..  
10520 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
10530 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
10540 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
10550 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
10560 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
10570 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
10580 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65  lete(pSub);.  re
10590 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
105a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
105b0 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  VIEW */../*.** A
105c0 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
105d0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
105e0 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75  ed in as an argu
105f0 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
10600 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65  t.** is a simple
10610 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
10620 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73  query.  If it is
10630 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20   and this query 
10640 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66  can be.** satisf
10650 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ied using a sing
10660 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62  le seek to the b
10670 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20  eginning or end 
10680 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  of an index,.** 
10690 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68  then generate th
106a0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  e code for this 
106b0 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72  SELECT and retur
106c0 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73  n 1.  If this is
106d0 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c   not a .** simpl
106e0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
106f0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74   query, then ret
10700 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73  urn 0;.**.** A s
10710 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d  imply min() or m
10720 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73  ax() query looks
10730 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
10740 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  *    SELECT min(
10750 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
10760 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  *    SELECT max(
10770 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
10780 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d  *.** The query m
10790 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ay have only a s
107a0 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69  ingle table in i
107b0 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74  ts FROM argument
107c0 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20  .  There.** can 
107d0 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f  be no GROUP BY o
107e0 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52  r HAVING or WHER
107f0 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  E clauses.  The 
10800 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a  result set must.
10810 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20  ** be the min() 
10820 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69  or max() of a si
10830 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ngle column of t
10840 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
10850 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  olumn.** in the 
10860 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
10870 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
10880 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  indexed..**.** T
10890 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
108a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72   this routine ar
108b0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f  e the same as fo
108c0 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
108d0 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65  )..** See the he
108e0 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
108f0 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
10900 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
10910 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
10920 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e  ic int simpleMin
10930 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
10940 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10950 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e  p, int eDest, in
10960 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72  t iParm){.  Expr
10970 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69   *pExpr;.  int i
10980 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Col;.  Table *pT
10990 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
109a0 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  x;.  int base;. 
109b0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
109c0 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f  seekOp;.  int co
109d0 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  nt;.  ExprList *
109e0 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20  pEList, *pList, 
109f0 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  eList;.  struct 
10a00 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c  ExprList_item eL
10a10 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69  istItem;.  SrcLi
10a20 73 74 20 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20  st *pSrc;.  ..  
10a30 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
10a40 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
10a50 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
10a60 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
10a70 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
10a80 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
10a90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
10aa0 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
10ab0 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
10ac0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
10ad0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
10ae0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
10af0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
10b00 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
10b10 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
10b20 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
10b30 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
10b40 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
10b50 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
10b60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
10b70 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
10b80 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
10b90 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
10ba0 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
10bb0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
10bc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10bd0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
10be0 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
10bf0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
10c00 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
10c10 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
10c20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
10c30 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
10c40 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
10c50 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
10c60 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
10c70 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
10c80 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c  = OP_Last;.  }el
10c90 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
10ca0 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  ;.  }.  pExpr = 
10cb0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
10cc0 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
10cd0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
10ce0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
10cf0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
10d00 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  n;.  pTab = pSrc
10d10 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
10d20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
10d30 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
10d40 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
10d50 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
10d60 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
10d70 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
10d80 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
10d90 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
10da0 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
10db0 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
10dc0 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
10dd0 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
10de0 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
10df0 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
10e00 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
10e10 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
10e20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
10e30 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
10e40 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
10e50 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
10e60 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
10e70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
10e80 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
10e90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10ea0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10eb0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f  , pExpr);.    fo
10ec0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
10ed0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
10ee0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
10ef0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
10f00 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
10f10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
10f20 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
10f30 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e  l && pIdx->keyIn
10f40 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f  fo.aColl[0]==pCo
10f50 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
10f60 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
10f70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10f80 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
10f90 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
10fa0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
10fb0 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
10fc0 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
10fd0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
10fe0 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
10ff0 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
11000 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
11010 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** The column n
11020 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
11030 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
11040 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   in the calling 
11050 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
11060 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
11070 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
11080 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
11090 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
110a0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
110b0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
110c0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
110d0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
110e0 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
110f0 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
11100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11110 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
11120 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
11130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11140 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
11150 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
11160 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
11170 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f  nerating code to
11180 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72   find the min or
11190 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63   the max.  Basic
111a0 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65  ally all we have
111b0 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66  .  ** to do is f
111c0 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72  ind the first or
111d0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
111e0 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e  in the chosen in
111f0 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68  dex.  If.  ** th
11200 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11210 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47   is on the INTEG
11220 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
11230 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69  then find the fi
11240 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74  rst.  ** or last
11250 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61   entry in the ma
11260 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  in table..  */. 
11270 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
11280 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
11290 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62   pTab->iDb);.  b
112a0 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  ase = pSrc->a[0]
112b0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70  .iCursor;.  comp
112c0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
112d0 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
112e0 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
112f0 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
11300 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
11310 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 62  eForReading(v, b
11320 61 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  ase, pTab);.  }.
11330 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33    cont = sqlite3
11340 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11350 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
11360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11370 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
11380 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
11390 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
113a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
113b0 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e  _Integer, pIdx->
113c0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
113d0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
113e0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65  P_OpenRead, base
113f0 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a  +1, pIdx->tnum,.
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d     (char*)&pIdx-
11420 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
11430 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20 73  INFO);.    if( s
11440 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  eekOp==OP_Rewind
11450 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11460 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11470 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
11480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11490 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
114a0 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a  eRecord, 1, 0);.
114b0 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f        seekOp = O
114c0 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a  P_MoveGt;.    }.
114d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
114e0 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
114f0 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
11500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11510 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c  (v, OP_IdxRecno,
11520 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
11530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11540 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62  p(v, OP_Close, b
11550 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  ase+1, 0);.    s
11560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11570 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61  v, OP_MoveGe, ba
11580 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c  se, 0);.  }.  eL
11590 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20  ist.nExpr = 1;. 
115a0 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74   memset(&eListIt
115b0 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c  em, 0, sizeof(eL
115c0 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69  istItem));.  eLi
115d0 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65  st.a = &eListIte
115e0 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e  m;.  eList.a[0].
115f0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
11600 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
11610 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69  (pParse, p, &eLi
11620 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  st, 0, 0, 0, -1,
11630 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63   eDest, iParm, c
11640 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20  ont, cont, 0);. 
11650 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11660 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
11670 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11680 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
11690 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a  e, base, 0);.  .
116a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
116b0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64  *.** Analyze and
116c0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
116d0 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
116e0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
116f0 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  nt.  Return.** t
11700 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
11710 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
11720 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  An ORDER BY or G
11730 52 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69 73  ROUP BY is a lis
11740 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
11750 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73  .  If any expres
11760 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e  sion.** is an in
11770 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20  teger constant, 
11780 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73  then that expres
11790 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64  sion is replaced
117a0 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65   by the.** corre
117b0 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20 69  sponding entry i
117c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
117d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
117e0 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
117f0 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pBy(.  Parse *pP
11800 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11810 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11820 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11830 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68  OrderBy,   /* Th
11840 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
11850 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f  OUP BY clause to
11860 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   be processed */
11870 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
11880 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65 20  List,    /* The 
11890 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
118a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
118b0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  t,     /* The re
118c0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
118d0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
118e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
118f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
11900 6e 73 20 61 72 65 20 69 6e 76 6f 6c 76 65 64 20  ns are involved 
11910 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11920 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
11930 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
11940 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
11950 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
11960 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4f 72  int i;.  if( pOr
11970 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
11980 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
11990 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
119a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
119b0 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
119c0 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
119d0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
119e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
119f0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
11a00 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
11a10 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
11a20 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
11a30 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
11a40 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  pE);.      pE = 
11a50 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
11a60 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
11a70 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
11a80 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
11a90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
11aa0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
11ab0 41 6e 64 43 68 65 63 6b 28 70 50 61 72 73 65 2c  AndCheck(pParse,
11ac0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11ad0 74 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  t, pE, isAgg, 0)
11ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11af0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
11b00 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
11b10 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20  onstant(pE) ){. 
11b20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11b30 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
11b40 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  , &iCol)==0 ){. 
11b50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11b60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
11b70 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
11b80 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
11b90 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
11ba0 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65 29  nstants", zType)
11bb0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
11bc0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
11bd0 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
11be0 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
11bf0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
11c00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11c10 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
11c20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e   "%s BY column n
11c30 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20  umber %d out of 
11c40 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
11c50 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
11c60 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
11c70 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20  ", zType, iCol, 
11c80 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
11c90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
11ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11cb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
11cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
11cd0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
11ce0 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
11cf0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
11d00 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
11d10 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
11d20 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
11d30 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ng on the.** val
11d40 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  ue of eDest and 
11d50 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
11d60 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20   eDest Value    
11d70 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
11d80 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
11d90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
11dc0 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
11dd0 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
11de0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
11df0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
11e00 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
11e10 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
11e20 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
11e30 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
11e40 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
11e50 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
11e60 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
11e70 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69   keys of table i
11e80 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
11e90 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
11ea0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
11eb0 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
11ec0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
11ed0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
11ee0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
11ef0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
11f00 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
11f10 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
11f20 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
11f30 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
11f40 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
11f50 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
11f60 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76  * The table abov
11f70 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e  e is incomplete.
11f80 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69    Additional eDi
11f90 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65  st value have be
11fa0 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20   added.** since 
11fb0 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
11fc0 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74   written.  See t
11fd0 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
11fe0 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
11ff0 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20  r.** a complete 
12000 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61  listing of the a
12010 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12020 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
12030 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
12040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
12050 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
12060 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
12070 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
12080 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
12090 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
120a0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
120b0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
120c0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
120d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
120e0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
120f0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
12100 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
12110 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
12120 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
12130 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
12140 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
12150 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
12160 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
12170 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
12180 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
12190 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
121a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
121b0 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
121c0 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
121d0 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
121e0 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
121f0 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
12200 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
12210 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
12220 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
12230 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
12240 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
12250 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
12260 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
12270 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
12280 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
12290 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
122a0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
122b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
122c0 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
122d0 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
122e0 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
122f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
12300 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
12310 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
12320 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
12330 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
12350 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
12360 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
12370 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20   /.**     \     
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
123c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
123d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
123e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
123f0 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
12400 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
12410 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
12420 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
12430 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
12440 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
12450 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
12460 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
12470 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
12480 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
12490 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
124a0 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
124b0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
124c0 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
124d0 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
124e0 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
124f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
12500 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
12510 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
12520 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
12530 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
12540 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
12550 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
12560 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
12570 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
12580 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
12590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
125a0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
125b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
125c0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
125d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
125e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
125f0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
12600 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
12610 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
12620 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
12630 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
12640 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
12650 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
12660 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
12670 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73  * A parameter us
12680 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20  ed by the eDest 
12690 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
126a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
126b0 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
126c0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
126d0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
126e0 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
126f0 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
12700 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12710 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
12720 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
12730 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
12740 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
12750 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
12760 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
12770 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
12780 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
12790 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
127a0 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
127b0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
127c0 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  g */.){.  int i;
127d0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
127e0 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
127f0 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30  .  int isAgg = 0
12800 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
12810 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
12820 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
12830 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
12840 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
12850 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
12860 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
12870 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
12880 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
12890 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
128a0 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
128b0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
128c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
128d0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
128e0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
128f0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
12900 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
12910 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
12920 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
12930 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
12940 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
12950 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
12960 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12970 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
12980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
12990 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
129a0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
129b0 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
129c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
129d0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
129e0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
129f0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
12a00 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
12a10 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
12a20 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
12a30 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
12a40 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
12a50 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
12a60 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
12a70 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  ion */..  if( sq
12a80 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
12a90 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
12aa0 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
12ab0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
12ac0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12ad0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
12ae0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
12af0 20 72 65 74 75 72 6e 20 31 3b 0a 0a 23 69 66 6e   return 1;..#ifn
12b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12b10 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
12b20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
12b30 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
12b40 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
12b50 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
12b60 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
12b70 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 23  ( p->pPrior ){.#
12b80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12b90 49 54 5f 43 55 52 53 4f 52 0a 20 20 20 20 69 66  IT_CURSOR.    if
12ba0 28 20 70 2d 3e 70 46 65 74 63 68 20 29 7b 0a 20  ( p->pFetch ){. 
12bb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12bc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 75  rMsg(pParse, "cu
12bd0 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65 20  rsors cannot be 
12be0 75 73 65 64 20 6f 6e 20 63 6f 6d 70 6f 75 6e 64  used on compound
12bf0 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20   queries");.    
12c00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12c10 64 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  d;.    }.#endif.
12c20 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
12c30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12c40 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
12c50 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  aff);.  }.#endif
12c60 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
12c70 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
12c80 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
12c90 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
12ca0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
12cb0 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
12cc0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
12cd0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12ce0 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
12cf0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
12d00 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
12d10 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
12d20 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
12d30 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
12d40 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f 72  cate VDBE cursor
12d50 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  s for each table
12d60 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12d70 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  use.  */.  sqlit
12d80 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
12d90 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
12da0 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
12db0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
12dc0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
12dd0 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
12de0 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
12df0 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
12e00 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
12e10 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
12e20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
12e30 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
12e40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
12e50 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22  * Expand any "*"
12e60 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
12e70 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20  sult set.  (For 
12e80 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20  example the "*" 
12e90 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20  in.  ** "SELECT 
12ea0 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65  * FROM t1")  The
12eb0 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73   fillInColumnlis
12ec0 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  t() routine also
12ed0 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20   does some.  ** 
12ee0 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69  other housekeepi
12ef0 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61  ng - see the hea
12f00 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
12f10 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  details..  */.  
12f20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
12f30 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20  List(pParse, p) 
12f40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
12f50 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57  ct_end;.  }.  pW
12f60 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
12f70 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
12f80 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
12f90 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
12fa0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
12fb0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
12fc0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
12fd0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
12fe0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
12ff0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
13000 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
13010 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
13020 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
13030 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
13040 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
13050 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13060 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
13070 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
13080 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
13090 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
130a0 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
130b0 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ssion");.    got
130c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
130d0 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  }..  /* ORDER BY
130e0 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
130f0 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
13100 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
13110 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
13120 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20  ase SRT_Union:. 
13130 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
13140 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  pt:.    case SRT
13150 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20  _Discard:.      
13160 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
13170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
13180 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72  efault:.      br
13190 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  eak;.  }..  /* A
131a0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
131b0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c   should have all
131c0 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63  ocated all the c
131d0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20  ursors that we. 
131e0 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64   ** need to hand
131f0 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64  le subquerys and
13200 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13210 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  s.  .  **.  ** R
13220 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d  esolve the colum
13230 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61  n names and do a
13240 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b   semantics check
13250 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72   on all the expr
13260 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
13270 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
13280 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
13290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
132a0 78 70 72 52 65 73 6f 6c 76 65 41 6e 64 43 68 65  xprResolveAndChe
132b0 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ck(pParse, pTabL
132c0 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  ist, 0, pEList->
132d0 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20  a[i].pExpr,.    
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20  1, &isAgg) ){.  
13310 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13320 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  end;.    }.  }. 
13330 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13340 52 65 73 6f 6c 76 65 41 6e 64 43 68 65 63 6b 28  ResolveAndCheck(
13350 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
13360 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65  , pEList, pWhere
13370 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , 0, 0) ){.    g
13380 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13390 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e    }.  if( pHavin
133a0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72  g ){.    if( pGr
133b0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
133c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
133d0 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
133e0 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
133f0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
13400 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20  HAVING");.      
13410 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
13420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13430 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13440 65 41 6e 64 43 68 65 63 6b 28 70 50 61 72 73 65  eAndCheck(pParse
13450 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
13460 73 74 2c 70 48 61 76 69 6e 67 2c 31 2c 26 69 73  st,pHaving,1,&is
13470 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  Agg) ){.      go
13480 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13490 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
134a0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
134b0 42 79 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  By(pParse, pOrde
134c0 72 42 79 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rBy, pTabList, p
134d0 45 4c 69 73 74 2c 20 69 73 41 67 67 2c 20 22 4f  EList, isAgg, "O
134e0 52 44 45 52 22 29 0a 20 20 20 7c 7c 20 70 72 6f  RDER").   || pro
134f0 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
13500 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
13510 79 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  y, pTabList, pEL
13520 69 73 74 2c 20 69 73 41 67 67 2c 20 22 47 52 4f  ist, isAgg, "GRO
13530 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  UP").  ){.    go
13540 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13550 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 6e   }..  /* We cann
13560 6f 74 20 75 73 65 20 61 20 53 51 4c 20 63 75 72  ot use a SQL cur
13570 73 6f 72 20 6f 6e 20 61 20 6a 6f 69 6e 20 6f 72  sor on a join or
13580 20 6f 6e 20 61 20 44 49 53 54 49 4e 43 54 20 71   on a DISTINCT q
13590 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  uery.  */.#ifnde
135a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 55  f SQLITE_OMIT_CU
135b0 52 53 4f 52 0a 20 20 69 66 28 20 70 2d 3e 70 46  RSOR.  if( p->pF
135c0 65 74 63 68 20 29 7b 0a 20 20 20 20 69 66 28 20  etch ){.    if( 
135d0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 29 7b  p->isDistinct ){
135e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
135f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13600 63 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20 62  cursors cannot b
13610 65 20 75 73 65 64 20 6f 6e 20 44 49 53 54 49 4e  e used on DISTIN
13620 43 54 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20  CT queries");.  
13630 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13640 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
13650 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
13660 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  c>0 ){.      sql
13670 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13680 72 73 65 2c 20 22 63 75 72 73 6f 72 73 20 63 61  rse, "cursors ca
13690 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20  nnot be used on 
136a0 6a 6f 69 6e 73 22 29 3b 0a 20 20 20 20 20 20 67  joins");.      g
136b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
136c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
136d0 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 53 65  abList->a[0].pSe
136e0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
136f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13700 61 72 73 65 2c 20 22 63 75 72 73 6f 72 20 63 61  arse, "cursor ca
13710 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74  nnot be used wit
13720 68 20 6e 65 73 74 65 64 20 71 75 65 72 69 65 73  h nested queries
13730 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 6f 72   ".          "or
13740 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 20 20   views");.      
13750 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
13760 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13770 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
13780 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
13790 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
137a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
137b0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
137c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
137d0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
137e0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
137f0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
13800 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
13810 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
13820 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
13830 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
13840 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
13850 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
13860 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
13870 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
13880 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
13890 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
138a0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
138b0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
138c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
138d0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
138e0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
138f0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ause.  */.  for(
13900 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
13910 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
13920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
13930 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
13940 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   0;.    int need
13950 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a  RestoreContext;.
13960 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
13970 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d  t->a[i].pSelect=
13980 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
13990 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
139a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29  >a[i].zName!=0 )
139b0 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75  {.      zSavedAu
139c0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
139d0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
139e0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
139f0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
13a00 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
13a10 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52  ame;.      needR
13a20 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20  estoreContext = 
13a30 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
13a40 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43      needRestoreC
13a50 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
13a60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
13a70 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
13a80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
13a90 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ct, SRT_TempTabl
13aa0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
13ab0 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61       pTabList->a
13ac0 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20  [i].iCursor, p, 
13ad0 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20  i, &isAgg, 0);. 
13ae0 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f     if( needResto
13af0 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20  reContext ){.   
13b00 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
13b10 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
13b20 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
13b30 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
13b40 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70  = p->pSrc;.    p
13b50 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
13b60 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  e;.    if( eDest
13b70 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65  !=SRT_Union && e
13b80 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74  Dest!=SRT_Except
13b90 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44   && eDest!=SRT_D
13ba0 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20  iscard ){.      
13bb0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
13bc0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
13bd0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
13be0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48  pGroupBy;.    pH
13bf0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
13c00 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ng;.    isDistin
13c10 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
13c20 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ct;.  }..  /* Ch
13c30 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
13c40 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
13c50 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
13c60 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
13c70 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
13c80 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
13c90 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
13ca0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
13cb0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
13cc0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
13cd0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13ce0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
13cf0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
13d00 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
13d10 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
13d20 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
13d30 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
13d40 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
13d50 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
13d60 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
13d70 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
13d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d90 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
13da0 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
13db0 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
13dc0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
13dd0 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
13de0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
13df0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
13e00 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
13e10 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
13e20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
13e30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13e40 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
13e50 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
13e60 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63  e, resolve any c
13e70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13e80 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68  es.  ** names th
13e90 61 74 20 68 61 76 65 20 62 65 65 6e 20 65 78 70  at have been exp
13ea0 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
13eb0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  d..  */.  if( pO
13ec0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f  rderBy ){.    fo
13ed0 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
13ee0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
13ef0 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
13f00 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  By->a[i].zName )
13f10 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
13f20 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  By->a[i].pExpr->
13f30 70 43 6f 6c 6c 20 3d 20 0a 20 20 20 20 20 20 20  pColl = .       
13f40 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
13f50 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
13f60 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
13f70 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20  .zName, -1);.   
13f80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13f90 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
13fa0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
13fb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
13fc0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
13fd0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
13fe0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
13ff0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14000 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
14010 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
14020 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
14030 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
14040 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
14050 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
14060 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
14070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14080 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
14090 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
140a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
140b0 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
140c0 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
140d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
140e0 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20    }..  /* Do an 
140f0 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72  analysis of aggr
14100 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  egate expression
14110 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
14120 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73  AggregateInfoRes
14130 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  et(pParse);.  if
14140 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
14150 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBy ){.    asser
14160 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d  t( pParse->nAgg=
14170 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20  =0 );.    isAgg 
14180 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
14190 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
141a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
141b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
141c0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
141d0 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
141e0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
141f0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
14200 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
14210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
14220 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
14230 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
14240 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
14250 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
14260 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
14270 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
14280 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
14290 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
142a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
142b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
142c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
142d0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
142e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  & sqlite3ExprAna
142f0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
14300 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20  Parse, pHaving) 
14310 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
14320 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
14330 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
14340 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
14350 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
14360 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14370 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14380 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
14390 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72  ates(pParse, pOr
143a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
143b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
143c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
143d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
143e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
143f0 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  /* Reset the agg
14400 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69  regator.  */.  i
14410 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
14420 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
14430 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14440 50 5f 41 67 67 52 65 73 65 74 2c 20 28 70 47 72  P_AggReset, (pGr
14450 6f 75 70 42 79 3f 30 3a 31 29 2c 20 70 50 61 72  oupBy?0:1), pPar
14460 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66  se->nAgg);.    f
14470 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
14480 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
14490 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
144a0 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  nc;.      if( (p
144b0 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61  Func = pParse->a
144c0 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30  Agg[i].pFunc)!=0
144d0 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61   && pFunc->xFina
144e0 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
144f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
14500 33 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c  3(v, OP_AggInit,
14510 20 30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46   0, i, (char*)pF
14520 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
14530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14540 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
14550 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
14560 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
14570 6f 29 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e  o) + pGroupBy->n
14580 45 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  Expr*sizeof(Coll
14590 53 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79  Seq*);.      Key
145a0 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65  Info *pKey = (Ke
145b0 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61  yInfo *)sqliteMa
145c0 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
145d0 69 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20  if( 0==pKey ){. 
145e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
145f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
14600 20 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20        pKey->enc 
14610 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
14620 63 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e  c;.      pKey->n
14630 46 69 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79  Field = pGroupBy
14640 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66  ->nExpr;.      f
14650 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
14660 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
14670 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  .        pKey->a
14680 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
14690 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
146a0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
146b0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
146c0 20 20 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61      if( !pKey->a
146d0 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
146e0 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
146f0 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  [i] = pParse->db
14700 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
14710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14730 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
14740 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20  , (char *)pKey, 
14750 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
14760 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  FF);.    }.  }..
14770 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
14780 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
14790 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69  to NULL.  */.  i
147a0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  f( eDest==SRT_Me
147b0 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m ){.    sqlite3
147c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
147d0 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
147e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
147f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
14800 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
14810 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
14820 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14830 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
14840 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
14850 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
14860 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
14870 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
14880 61 62 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e 54 65  ab++;.    openTe
14890 6d 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  mpIndex(pParse, 
148a0 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b  p, distinct, 0);
148b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
148c0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
148d0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65  ..  /* Begin the
148e0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
148f0 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
14900 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
14910 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
14920 74 2c 20 70 57 68 65 72 65 2c 0a 20 20 20 20 20  t, pWhere,.     
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
14950 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79   ? 0 : &pOrderBy
14960 2c 20 70 2d 3e 70 46 65 74 63 68 29 3b 0a 20 20  , p->pFetch);.  
14970 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
14980 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14990 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
149a0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
149b0 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
149c0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
149d0 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
149e0 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
149f0 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
14a00 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
14a10 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
14a20 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
14a30 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
14a60 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
14a70 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
14a80 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
14a90 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
14aa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
14ab0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
14ac0 69 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20  ith aggregates, 
14ad0 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63  then do the spec
14ae0 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20  ial aggregate.  
14af0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  ** processing.  
14b00 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
14b10 20 20 41 67 67 45 78 70 72 20 2a 70 41 67 67 3b    AggExpr *pAgg;
14b20 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
14b30 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  y ){.      int l
14b40 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  bl1;.      for(i
14b50 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
14b60 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14b70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14b80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
14b90 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
14ba0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14bb0 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e 69 74 79    /* No affinity
14bc0 20 73 74 72 69 6e 67 20 69 73 20 61 74 74 61 63   string is attac
14bd0 68 65 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  hed to the follo
14be0 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  wing OP_MakeReco
14bf0 72 64 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  rd .      ** bec
14c00 61 75 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  ause we do not n
14c10 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20 63 6f  eed to do any co
14c20 65 72 63 69 6f 6e 20 6f 66 20 64 61 74 61 74 79  ercion of dataty
14c30 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  pes. */.      sq
14c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14c50 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
14c60 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
14c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31  , 0);.      lbl1
14c80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14c90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
14ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14cb0 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
14cc0 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  s, 0, lbl1);.   
14cd0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67     for(i=0, pAgg
14ce0 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69  =pParse->aAgg; i
14cf0 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
14d00 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20  ++, pAgg++){.   
14d10 20 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e 69       if( pAgg->i
14d20 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
14d30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14d40 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14d50 20 70 41 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20   pAgg->pExpr);. 
14d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14d70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
14d80 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  gSet, 0, i);.   
14d90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14da0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14db0 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  el(v, lbl1);.   
14dc0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
14dd0 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67  pAgg=pParse->aAg
14de0 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  g; i<pParse->nAg
14df0 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b  g; i++, pAgg++){
14e00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
14e10 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
14e20 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  ;.      FuncDef 
14e30 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 66 28  *pDef;.      if(
14e40 20 21 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20   !pAgg->isAgg ) 
14e50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14e60 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46  assert( pAgg->pF
14e70 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unc!=0 );.      
14e80 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46  assert( pAgg->pF
14e90 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b  unc->xStep!=0 );
14ea0 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 70 41  .      pDef = pA
14eb0 67 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20  gg->pFunc;.     
14ec0 20 70 45 20 3d 20 70 41 67 67 2d 3e 70 45 78 70   pE = pAgg->pExp
14ed0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
14ee0 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
14ef0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d  assert( pE->op==
14f00 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
14f10 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
14f20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14f30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
14f40 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
14f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14f60 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
14f70 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
14f80 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f  if( pDef->needCo
14f90 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20  llSeq ){.       
14fa0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
14fb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
14fc0 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
14fd0 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  j=0; !pColl && j
14fe0 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  <nExpr; j++){.  
14ff0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
15000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
15010 65 71 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  eq(pParse, pE->p
15020 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
15030 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15040 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
15050 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
15060 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
15070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15080 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
15090 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
150a0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
150b0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
150c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
150d0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46  beOp3(v, OP_AggF
150e0 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c 20 28  unc, 0, nExpr, (
150f0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 50  char*)pDef, P3_P
15100 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20  OINTER);.    }. 
15110 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65   }..  /* End the
15120 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
15130 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  oop..  */.  sqli
15140 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
15150 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  fo);..  /* If we
15160 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20   are processing 
15170 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e  aggregates, we n
15180 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20  eed to set up a 
15190 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a  second loop.  **
151a0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
151b0 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65   aggregate value
151c0 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68  s and process th
151d0 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  em..  */.  if( i
151e0 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  sAgg ){.    int 
151f0 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 33  endagg = sqlite3
15200 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
15210 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61  ;.    int starta
15220 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67  gg;.    startagg
15230 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15240 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78  dOp(v, OP_AggNex
15250 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20  t, 0, endagg);. 
15260 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67     pParse->useAg
15270 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  g = 1;.    if( p
15280 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
15290 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
152a0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
152b0 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29  ng, startagg, 1)
152c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
152d0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
152e0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
152f0 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
15300 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
15310 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
15320 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 73          iParm, s
15330 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67 2c  tartagg, endagg,
15340 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 67   aff) ){.      g
15350 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15370 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15380 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61  _Goto, 0, starta
15390 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gg);.    sqlite3
153a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
153b0 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20  (v, endagg);.   
153c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153d0 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  p(v, OP_Noop, 0,
153e0 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
153f0 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d  >useAgg = 0;.  }
15400 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
15410 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
15420 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
15430 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
15440 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
15450 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
15460 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
15470 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
15480 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
15490 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
154a0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
154b0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
154c0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
154d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
154e0 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c   was a subquery,
154f0 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e   we have now con
15500 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75  verted the subqu
15510 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ery into a.  ** 
15520 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
15530 20 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65 20    So delete the 
15540 73 75 62 71 75 65 72 79 20 73 74 72 75 63 74 75  subquery structu
15550 72 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  re from the pare
15560 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65  nt.  ** to preve
15570 6e 74 20 74 68 69 73 20 73 75 62 71 75 65 72 79  nt this subquery
15580 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c   from being eval
15590 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20  uated again and 
155a0 74 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20 2a  to force the.  *
155b0 2a 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65  * the use of the
155c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
155d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
155e0 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  rent ){.    asse
155f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
15600 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61  c->nSrc>parentTa
15610 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
15620 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
15630 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
15640 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73  lect==p );.    s
15650 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15660 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72 65  te(p);.    pPare
15670 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
15680 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d  ntTab].pSelect =
15690 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
156a0 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
156b0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
156c0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
156d0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
156e0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
156f0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
15700 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
15710 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
15720 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
15730 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
15740 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
15750 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
15760 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
15770 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
15780 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67 67 72  nd:.  sqliteAggr
15790 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70  egateInfoReset(p
157a0 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  Parse);.  return
157b0 20 72 63 3b 0a 7d 0a                              rc;.}.