/ Hex Artifact Content
Login

Artifact 24b9ab865e34c0d5e7f2447558f93d1fe6f9d588:


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 30 33  select.c,v 1.203
0200: 20 32 30 30 34 2f 30 38 2f 32 31 20 31 37 3a 35   2004/08/21 17:5
0210: 34 3a 34 35 20 64 72 68 20 45 78 70 20 24 0a 2a  4:45 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0a00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0a10: 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20 75 38 20  Keyword;.    u8 
0a20: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0a30: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0a40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0a50: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0a60: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0a70: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0a80: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0a90: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0aa0: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0ab0: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0ac0: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0ad0: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0ae0: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0af0: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0b00: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0b10: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0b20: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0b30: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0b40: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d 3b 0a  T_INNER },.  };.
0b50: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
0b60: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
0b70: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
0b80: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
0b90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
0ba0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
0bb0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
0bc0: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
0bd0: 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  j<sizeof(keyword
0be0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0bf0: 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20  ds[0]); j++){.  
0c00: 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65      if( p->n==ke
0c10: 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20  ywords[j].nChar 
0c20: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71  .          && sq
0c30: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 2d  lite3StrNICmp(p-
0c40: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
0c50: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
0c60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
0c70: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
0c80: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
0c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
0ca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
0cb0: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
0cc0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0cd0: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
0ce0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
0cf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
0d00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
0d10: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
0d20: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
0d30: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
0d40: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
0d50: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
0d60: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
0d70: 0a 20 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  .  ){.    static
0d80: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 20 3d 20 7b   Token dummy = {
0d90: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 63 68 61   0, 0 };.    cha
0da0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 2c 20 2a  r *zSp1 = " ", *
0db0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
0dc0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 70 42 20  if( pB==0 ){ pB 
0dd0: 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 31 20 3d  = &dummy; zSp1 =
0de0: 20 30 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43   0; }.    if( pC
0df0: 3d 3d 30 20 29 7b 20 70 43 20 3d 20 26 64 75 6d  ==0 ){ pC = &dum
0e00: 6d 79 3b 20 7a 53 70 32 20 3d 20 30 3b 20 7d 0a  my; zSp2 = 0; }.
0e10: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
0e20: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
0e30: 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e  ErrMsg, "unknown
0e40: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0e50: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 2c 20 30 2c  join type: ", 0,
0e60: 0a 20 20 20 20 20 20 20 70 41 2d 3e 7a 2c 20 70  .       pA->z, p
0e70: 41 2d 3e 6e 2c 20 7a 53 70 31 2c 20 31 2c 20 70  A->n, zSp1, 1, p
0e80: 42 2d 3e 7a 2c 20 70 42 2d 3e 6e 2c 20 7a 53 70  B->z, pB->n, zSp
0e90: 32 2c 20 31 2c 20 70 43 2d 3e 7a 2c 20 70 43 2d  2, 1, pC->z, pC-
0ea0: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
0eb0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0ec0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
0ed0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
0ee0: 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52   jointype & JT_R
0ef0: 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  IGHT ){.    sqli
0f00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
0f10: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
0f20: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
0f30: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
0f40: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
0f50: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
0f60: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0f70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
0f80: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
0f90: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
0fa0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
0fb0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
0fc0: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
0fd0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
0fe0: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
0ff0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1000: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
1010: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
1020: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
1030: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1040: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
1050: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
1070: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
1080: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
1090: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
10a0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
10b0: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
10c0: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
10d0: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
10e0: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
10f0: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
1100: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
1110: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
1120: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
1130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1140: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e  WhereTerm(.  con
1150: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1160: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1170: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1180: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1190: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
11a0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
11b0: 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32  nst Table *pTab2
11c0: 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  ,      /* Second
11d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
11e0: 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20   **ppExpr       
11f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1200: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f  equality term to
1210: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1220: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 64   */.){.  Token d
1230: 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a 70 45  ummy;.  Expr *pE
1240: 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63  1a, *pE1b, *pE1c
1250: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20  ;.  Expr *pE2a, 
1260: 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20  *pE2b, *pE2c;.  
1270: 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 64 75 6d  Expr *pE;..  dum
1280: 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b 0a 20 20 64  my.z = zCol;.  d
1290: 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  ummy.n = strlen(
12a0: 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d 6d 79 2e 64  zCol);.  dummy.d
12b0: 79 6e 20 3d 20 30 3b 0a 20 20 70 45 31 61 20 3d  yn = 0;.  pE1a =
12c0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
12d0: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
12e0: 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69  );.  pE2a = sqli
12f0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
1300: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
1310: 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62 31 2d  dummy.z = pTab1-
1320: 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e  >zName;.  dummy.
1330: 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d 6d 79  n = strlen(dummy
1340: 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20 73 71  .z);.  pE1b = sq
1350: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1360: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1370: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1380: 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  2->zName;.  dumm
1390: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
13a0: 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d 20  my.z);.  pE2b = 
13b0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
13c0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
13d0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
13e0: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
13f0: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1400: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1410: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62  xpr(TK_DOT, pE2b
1420: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1440: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
1450: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
1460: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1470: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20  romJoin);.  if( 
1480: 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a  *ppExpr ){.    *
1490: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
14a0: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70  Expr(TK_AND, *pp
14b0: 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20  Expr, pE, 0);.  
14c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 45 78  }else{.    *ppEx
14d0: 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a  pr = pE;.  }.}..
14e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
14f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
1500: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1510: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1520: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
1530: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1540: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
1550: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
1560: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
1570: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
1580: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
1590: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
15a0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
15b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
15c0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
15d0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
15e0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
15f0: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
1600: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
1610: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
1620: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
1630: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
1640: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
1650: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
1660: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
1670: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
1680: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
1690: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
16a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
16b0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
16c0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
16d0: 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
16e0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
16f0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1700: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
1710: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1720: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  (p->pLeft);.    
1730: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
1740: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
1750: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
1760: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
1770: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
1780: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1790: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
17a0: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
17b0: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
17c0: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
17d0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
17e0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
17f0: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
1800: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1810: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1820: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1830: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1840: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
1850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1860: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
1870: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1880: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
1890: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69  cList *pSrc;.  i
18a0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20  nt i, j;.  pSrc 
18b0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
18c0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
18d0: 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rc-1; i++){.    
18e0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18f0: 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 53  tem *pTerm = &pS
1900: 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  rc->a[i];.    st
1910: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1920: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 53 72  m *pOther = &pSr
1930: 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20  c->a[i+1];..    
1940: 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d  if( pTerm->pTab=
1950: 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54  =0 || pOther->pT
1960: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
1970: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
1980: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
1990: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
19a0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
19b0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
19c0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
19d0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
19e0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
19f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a00: 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pTerm->jointype
1a10: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
1a20: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
1a30: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ab;.      if( pT
1a40: 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72  erm->pOn || pTer
1a50: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1a60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1a80: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
1a90: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
1aa0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
1ab0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
1ac0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
1ad0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1ae0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 65 72 6d      pTab = pTerm
1af0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 66 6f  ->pTab;.      fo
1b00: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1b10: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1b20: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
1b30: 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c  ex(pOther->pTab,
1b40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1b50: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
1b60: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
1b70: 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  rm(pTab->aCol[j]
1b80: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20 70 4f  .zName, pTab, pO
1b90: 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e  ther->pTab, &p->
1ba0: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
1bb0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bc0: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
1bd0: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
1be0: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
1bf0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
1c00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
1c10: 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72 6d 2d  m->pOn && pTerm-
1c20: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
1c30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c40: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
1c50: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
1c60: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
1c70: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
1c80: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
1c90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ca0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1cb0: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
1cc0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1cd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
1ce0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
1cf0: 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65 72 61  ** and AND opera
1d00: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
1d10: 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 29  if( pTerm->pOn )
1d20: 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
1d30: 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e 29 3b  xpr(pTerm->pOn);
1d40: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57  .      if( p->pW
1d50: 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  here==0 ){.     
1d60: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
1d70: 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20 20  Term->pOn;.     
1d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d90: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
1da0: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
1db0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65 72 6d  p->pWhere, pTerm
1dc0: 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ->pOn, 0);.     
1dd0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
1de0: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
1df0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
1e00: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
1e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
1e20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
1e30: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
1e40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
1e50: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
1e60: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
1e70: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
1e80: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
1e90: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1ea0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
1eb0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
1ec0: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
1ed0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
1ee0: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
1ef0: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
1f00: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
1f10: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
1f20: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
1f30: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
1f40: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
1f50: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1f60: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
1f70: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
1f80: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1f90: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
1fa0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  IdList *pList;. 
1fb0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1fc0: 20 20 61 73 73 65 72 74 28 20 69 3c 70 53 72 63    assert( i<pSrc
1fd0: 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20 20 20  ->nSrc-1 );.    
1fe0: 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72 6d 2d    pList = pTerm-
1ff0: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2000: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2010: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2020: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2030: 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61 62 2c  dex(pTerm->pTab,
2040: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
2050: 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20 20 20  me)<0 ||.       
2060: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
2070: 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70  (pOther->pTab, p
2080: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
2090: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
20a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20b0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
20c0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
20d0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
20e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
20f0: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
2100: 68 20 74 61 62 6c 65 73 22 2c 20 70 4c 69 73 74  h tables", pList
2110: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[j].zName);. 
2120: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2130: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2140: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
2150: 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  m(pList->a[j].zN
2160: 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54 61 62  ame, pTerm->pTab
2170: 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20  , pOther->pTab, 
2180: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2190: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
21a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21b0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
21c0: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
21d0: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
21e0: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
21f0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2200: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2210: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2220: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2230: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2240: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69  stDelete(p->pELi
2250: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
2260: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  cListDelete(p->p
2270: 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Src);.  sqlite3E
2280: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68  xprDelete(p->pWh
2290: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
22a0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
22b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
22c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
22d0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
22e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
22f0: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2300: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2310: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2320: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  or);.  sqliteFre
2330: 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20  e(p->zSelect);. 
2340: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2350: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2360: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e  the aggregate in
2370: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2380: 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75  he parse structu
2390: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
23a0: 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  id sqliteAggrega
23b0: 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73  teInfoReset(Pars
23c0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
23d0: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
23e0: 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65  >aAgg);.  pParse
23f0: 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
2400: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
2410: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
2420: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2430: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
2440: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
2450: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
2460: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
2470: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
2480: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
2490: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
24a0: 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70  oSorter(Parse *p
24b0: 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20  Parse, Vdbe *v, 
24c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24d0: 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  By){.  int i;.  
24e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
24f0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
2500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2510: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f  rCode(pParse, pO
2520: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2530: 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pr);.  }.  sqlit
2540: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2550: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f  P_MakeRecord, pO
2560: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30  rderBy->nExpr, 0
2570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2580: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2590: 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Put, 0, 0);.}../
25a0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
25b0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
25c0: 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 0a  FFSET and LIMIT.
25d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
25e0: 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20 20 56 64  odeLimiter(.  Vd
25f0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
2600: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2610: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
2620: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2630: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
2640: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
2650: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
2660: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2670: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2680: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
2690: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
26a0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 2f   iBreak,       /
26b0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
26c0: 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  nd the loop */. 
26d0: 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20   int nPop       
26e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26f0: 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61  times to pop sta
2700: 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20  ck when jumping 
2710: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
2720: 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20  Offset>=0 ){.   
2730: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2740: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2750: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 69  dr(v) + 2;.    i
2760: 66 28 20 6e 50 6f 70 3e 30 20 29 20 61 64 64 72  f( nPop>0 ) addr
2770: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
2780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2790: 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73  emIncr, p->iOffs
27a0: 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69  et, addr);.    i
27b0: 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20  f( nPop>0 ){.   
27c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
27e0: 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Pop, 0);.    }. 
27f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2800: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
2810: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
2820: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d   }.  if( p->iLim
2830: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
2840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2850: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2860: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2870: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2880: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2890: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
28a0: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
28b0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
28c0: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
28d0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
28e0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
28f0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2900: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2910: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2920: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2930: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2940: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2950: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2960: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2970: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2980: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2990: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
29a0: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
29b0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
29c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
29d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
29e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a00: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2a10: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a30: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2a40: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2a50: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2a60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2a70: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2a80: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2a90: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2aa0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2ab0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2ac0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2ad0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2ae0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2af0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2b00: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2b10: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2b20: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2b30: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2b40: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2b50: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2b60: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2b70: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2b80: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2b90: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2ba0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2bb0: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2bc0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2bd0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2be0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2bf0: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2c00: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2c10: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2c20: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2c30: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2c40: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2c50: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2c60: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2c70: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2c90: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2ca0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2cb0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
2cc0: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
2cd0: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
2ce0: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
2cf0: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
2d00: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2d10: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2d20: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
2d30: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
2d40: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
2d50: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2d60: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
2d70: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2d80: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2d90: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2da0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2db0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2dc0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2dd0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2de0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2df0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2e00: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2e10: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
2e20: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
2e30: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
2e40: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
2e50: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
2e60: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
2e70: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
2e80: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
2e90: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
2ea0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
2eb0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
2ec0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
2ed0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
2ee0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
2ef0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
2f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
2f20: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
2f30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2f40: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
2f50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
2f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
2f70: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
2f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f90: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2fa0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
2fb0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
2fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
2fd0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
2fe0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
2ff0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3000: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3010: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3020: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3030: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3040: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3050: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3060: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3070: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
3080: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30a0: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
30b0: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
30c0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
30d0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
30e0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
30f0: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
3100: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
3110: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
3120: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3130: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
3140: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3160: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
3170: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
3180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3190: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
31a0: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
31b0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
31c0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
31d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31e0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
31f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
3200: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3210: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3220: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3230: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3240: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3250: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
3260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3270: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
3280: 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29  ey, distinct, 0)
3290: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
32a0: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  By==0 ){.      c
32b0: 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c  odeLimiter(v, p,
32c0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65   iContinue, iBre
32d0: 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ak, nColumn);.  
32e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
32f0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
3300: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
3310: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
3320: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
3330: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
3340: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
3350: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3360: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
3370: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
3380: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3390: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
33a0: 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57  Column, NULL_ALW
33b0: 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20  AYS_DISTINCT);. 
33c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
33e0: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3410: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
3420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3430: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3440: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
3450: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3460: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
3470: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
3480: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
3490: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
34a0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
34b0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
34c0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
34d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
34f0: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3500: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3510: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3520: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3530: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3540: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3550: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3560: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3570: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
3580: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35a0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
35b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
35c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
35d0: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50  OP_PutIntKey, iP
35e0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
35f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3600: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
3610: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
3620: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
3630: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
3640: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
3650: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
3660: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
3670: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
3680: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
3690: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
36a0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
36b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
36c0: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
36d0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
36e0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
36f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3700: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3710: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3720: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71  TINCT);.      sq
3730: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3740: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
3750: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
3760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3770: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
3780: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
3790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
37b0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b  lete, iParm, 0);
37c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
37d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77    }..    /* If w
37e0: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
37f0: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
3800: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
3810: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
3820: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
3830: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
3840: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
3850: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
3860: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
3870: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
3880: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
3890: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
38a0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
38b0: 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
38c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
38d0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
38e0: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
38f0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
3900: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
3910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3920: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
3930: 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20  , addr1+3);.    
3940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3950: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
3960: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32   0);.      addr2
3970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3980: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3990: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
39a0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
39b0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
39c0: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
39d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
39e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
39f0: 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66 53 74  har const *affSt
3a00: 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  r;.        char 
3a10: 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36  aff = (iParm>>16
3a20: 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  )&0xFF;.        
3a30: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
3a40: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
3a50: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
3a60: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 61   aff);.        a
3a70: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
3a80: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66  ffinityString(af
3a90: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
3aa0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
3ab0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
3ac0: 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54  0, affStr, P3_ST
3ad0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
3ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3af0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3b00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3b10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3b20: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3b30: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3b40: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3b60: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3b70: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3b80: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3b90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ba0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3bb0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3bc0: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3bd0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3be0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3bf0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3c00: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3c10: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3c20: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3c30: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3c40: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3c50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
3c60: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
3c70: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3c80: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3c90: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3ca0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3cb0: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3cc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3ce0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3cf0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
3d00: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
3d10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3d20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3d30: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d50: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3d60: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3d70: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3d80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3d90: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3da0: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3db0: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3dc0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3de0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3df0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3e00: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3e10: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3e20: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3e30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3e40: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
3e50: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
3e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
3e70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3e80: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
3e90: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
3ea0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3eb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
3ec0: 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  oke a subroutine
3ed0: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72   to handle the r
3ee0: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62  esults.  The sub
3ef0: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20  routine itself. 
3f00: 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73     ** is respons
3f10: 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67  ible for popping
3f20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66   the results off
3f30: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
3f40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3f50: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
3f60: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3f70: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
3f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3f90: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3fa0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3fb0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
3fc0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
3fd0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
3fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4000: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
4010: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
4020: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4030: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
4040: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
4050: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4060: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4070: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4080: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4090: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
40a0: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
40b0: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
40c0: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
40d0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
40e0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
40f0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
4100: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
4110: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
4120: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
4130: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
4140: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4150: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4160: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4190: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
41a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
41b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
41c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
41d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
41e0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
41f0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
4200: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
4210: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
4220: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
4230: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
4240: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4250: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4260: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4270: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4280: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4290: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
42a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
42b0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
42c0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
42d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
42e0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
42f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4300: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
4310: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4320: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4330: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
4340: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4350: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4360: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4370: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4380: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4390: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
43a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
43b0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
43c0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
43d0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
43e0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
43f0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
4400: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
4410: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
4420: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
4430: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
4440: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4450: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4460: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4470: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4480: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4490: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
44a0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
44b0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
44c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
44d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
44e0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 6f  f( eDest==SRT_So
44f0: 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  rter ) return;. 
4500: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
4510: 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c 20  OrderBy;.  nCol 
4520: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
4530: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
4540: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
4550: 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f 6c  f(*pInfo) + nCol
4560: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
4570: 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  *)+1) );.  if( p
4580: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
4590: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74  ;.  pInfo->aSort
45a0: 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29 26  Order = (char*)&
45b0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  pInfo->aColl[nCo
45c0: 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  l];.  pInfo->nFi
45d0: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66 6f  eld = nCol;.  fo
45e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
45f0: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  ++){.    /* If a
4600: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
4610: 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69 65  nce was specifie
4620: 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68 65  d explicity, the
4630: 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 73  n it.    ** is s
4640: 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72 42  tored in pOrderB
4650: 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20 4f  y->a[i].zName. O
4660: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
4670: 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  e default.    **
4680: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
4690: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
46a0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
46b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
46c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
46d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64  Seq(pParse, pOrd
46e0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
46f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e 66  );.    if( !pInf
4700: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
4710: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
4720: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
4730: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
4740: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
4750: 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
4760: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
4770: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4780: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  beOp3(v, OP_Sort
4790: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70  , 0, 0, (char*)p
47a0: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
47b0: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64 64  _HANDOFF);.  add
47c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
47d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e  ddOp(v, OP_SortN
47e0: 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20  ext, 0, end1);. 
47f0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20   codeLimiter(v, 
4800: 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20 31  p, addr, end2, 1
4810: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
4820: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
4830: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
4840: 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  se SRT_TempTable
4850: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4860: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4870: 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d  _NewRecno, iParm
4880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4890: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
48a0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
48b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
48c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
48d0: 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  IntKey, iParm, 0
48e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
48f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4900: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
4910: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4920: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
4930: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4940: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
4950: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
4960: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4980: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4990: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
49a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
49b0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
49c0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
49d0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
49e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
49f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4a00: 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f  , 1, 0, "n", P3_
4a10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
4a20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a30: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
4a40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4a60: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69  OP_PutStrKey, (i
4a70: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
4a80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4a90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4aa0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
4ab0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4ac0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4ad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4ae0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
4af0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
4b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b10: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4b20: 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62 72   end1);.      br
4b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4b40: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
4b50: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
4b60: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
4b70: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
4b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4ba0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
4bb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4bd0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
4be0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4bf0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4c00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4c10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4c20: 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b  olumn, -1-i, i);
4c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4c40: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
4c50: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
4c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4c70: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
4c80: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
4c90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
4cc0: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
4cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4cf0: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
4d00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d10: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
4d20: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
4d30: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
4d40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d60: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4d70: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
4d80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
4d90: 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73 71  l(v, end2);.  sq
4da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4db0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4dc0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
4dd0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
4de0: 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  d1);.  sqlite3Vd
4df0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4e00: 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a  rtReset, 0, 0);.
4e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
4e30: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
4e40: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
4e50: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
4e60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
4e70: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
4e80: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
4e90: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
4ea0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aller..**.** If 
4eb0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
4ec0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
4ed0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
4ee0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
4ef0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67  from.** the orig
4f00: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
4f10: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
4f20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4f30: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a   a column..** .*
4f40: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
4f50: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78  n type for an ex
4f60: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68  pression is eith
4f70: 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43  er TEXT, NUMERIC
4f80: 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20   or ANY..** The 
4f90: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
4fa0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
4fb0: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a  ld is INTEGER..*
4fc0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
4fd0: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
4fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
4ff0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5000: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5010: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
5020: 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  ype;.  int j;.  
5030: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
5040: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72 65  pTabList==0 ) re
5050: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
5060: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5070: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
5080: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c  MN: {.      Tabl
5090: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
50a0: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
50b0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
50c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
50d0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
50e0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
50f0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
5100: 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  le; j++){}.     
5110: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
5120: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
5130: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
5140: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
5150: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5160: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
5170: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
5180: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
5190: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
51a0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
51b0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
51c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70   ){.        zTyp
51d0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
51e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
51f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
5200: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
5210: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
5220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5230: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20     case TK_AS:. 
5240: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
5250: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20  umnType(pParse, 
5260: 70 54 61 62 4c 69 73 74 2c 20 70 45 78 70 72 2d  pTabList, pExpr-
5270: 3e 70 4c 65 66 74 29 3b 20 0a 20 20 20 20 20 20  >pLeft); .      
5280: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5290: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
52a0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
52b0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
52c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
52d0: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c  lumnType(pParse,
52e0: 20 70 53 2d 3e 70 53 72 63 2c 20 70 53 2d 3e 70   pS->pSrc, pS->p
52f0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
5300: 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  r); .      break
5310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
5320: 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79 70 65  ult:.      zType
5330: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 72   = 0;.  }.  .  r
5340: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
5350: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
5360: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
5370: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
5380: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5390: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
53a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
53b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
53c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
53d0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
53e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
53f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5400: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
5410: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
5420: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
5430: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
5440: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
5450: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
5460: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
5470: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5480: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5490: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
54a0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
54b0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
54c0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
54d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
54e0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
54f0: 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73  columnType(pPars
5500: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 29 3b  e, pTabList, p);
5510: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  .    if( zType==
5520: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5530: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
5540: 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e  st make it's own
5550: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
5560: 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61 73  umn-type, in cas
5570: 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 63  e the .    ** sc
5580: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
5590: 66 6f 72 65 20 74 68 69 73 20 76 69 72 74 75 61  fore this virtua
55a0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
55b0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
55c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
55d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69  olName(v, i+pELi
55e0: 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65  st->nExpr, zType
55f0: 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29  , strlen(zType))
5600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
5610: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
5620: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
5630: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
5640: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
5650: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
5660: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
5670: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
5680: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
5690: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
56a0: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
56b0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
56c0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
56d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
56e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
56f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
5700: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
5710: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
5720: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
5730: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
5740: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
5750: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
5760: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
5770: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5780: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
5790: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
57a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
57b0: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
57c0: 74 4e 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  tNames;..  /* If
57d0: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
57e0: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
57f0: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
5800: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
5810: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5820: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
5830: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
5840: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
5850: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
5860: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
5870: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
5880: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
5890: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
58a0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
58b0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
58c0: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
58d0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
58e0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
58f0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
5900: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
5910: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
5920: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
5930: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
5940: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
5950: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
5960: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
5970: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
5980: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5990: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
59a0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
59b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
59c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
59d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
59e0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
59f0: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
5a00: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
5a10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
5a20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
5a30: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
5a40: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
5a50: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
5a60: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
5a70: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5a80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
5a90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
5aa0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
5ab0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
5ac0: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
5ad0: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
5ae0: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
5af0: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
5b00: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
5b10: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
5b20: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
5b30: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
5b40: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
5b50: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
5b60: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
5b70: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
5b80: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
5b90: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
5ba0: 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20  "_ROWID_";.     
5bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5bc0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
5bd0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
5be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5bf0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
5c00: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
5c10: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
5c20: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
5c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5c40: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70  tColName(v, i, p
5c50: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
5c60: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n.n);.      }els
5c70: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
5c80: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
5c90: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
5ca0: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
5cb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
5cc0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5cd0: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
5ce0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5cf0: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
5d00: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
5d10: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
5d20: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
5d30: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
5d40: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
5d50: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
5d60: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
5d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
5d80: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e  ColName(v, i, zN
5d90: 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  ame, P3_DYNAMIC)
5da0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5db0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5dc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5dd0: 69 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  i, zCol, 0);.   
5de0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
5df0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
5e00: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
5e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5e20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
5e30: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
5e40: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f  span.n);.      /
5e50: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  * sqlite3VdbeCom
5e60: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
5e70: 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  dr); */.    }els
5e80: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
5e90: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
5ea0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
5eb0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
5ec0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
5ed0: 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22  sprintf(zName, "
5ee0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
5ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5f00: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5f10: 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i, zName, 0);.  
5f20: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
5f30: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
5f40: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
5f50: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
5f60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
5f70: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
5f80: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
5f90: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
5fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5fb0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
5fc0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
5fd0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
5fe0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
5ff0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
6000: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
6010: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6020: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
6030: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
6040: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
6050: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
6060: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
6070: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
6080: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
6090: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
60a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
60b0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
60c0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
60d0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
60e0: 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  t fillInColumnLi
60f0: 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  st(Parse*, Selec
6100: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
6110: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
6120: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
6130: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6140: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
6150: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
6160: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
6170: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
6180: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
6190: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
61a0: 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  se, char *zTabNa
61b0: 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  me, Select *pSel
61c0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
61d0: 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Tab;.  int i, j;
61e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
61f0: 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  ist;.  Column *a
6200: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  Col, *pCol;..  i
6210: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
6220: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
6230: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
6240: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
6250: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6260: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
6270: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6290: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  .  }.  pTab->zNa
62a0: 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20  me = zTabName ? 
62b0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61  sqliteStrDup(zTa
62c0: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
62d0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
62e0: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
62f0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
6300: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
6310: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6320: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61    pTab->aCol = a
6330: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Col = sqliteMall
6340: 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  oc( sizeof(pTab-
6350: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
6360: 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nCol );.  for(i=
6370: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
6380: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
6390: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78   pCol++){.    Ex
63a0: 70 72 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  pr *pR;.    char
63b0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 45 78 70   *zType;.    Exp
63c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
63d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
63e0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
63f0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
6400: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20  ->token.z==0 || 
6410: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
6420: 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  .z[0]!=0 );.    
6430: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6440: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6450: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pCol->zName = sq
6460: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
6470: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
6480: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6490: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
64b0: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
64c0: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
64d0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
64e0: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ] ){.      int c
64f0: 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nt;.      sqlite
6500: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 43 6f  3SetNString(&pCo
6510: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f  l->zName, pR->to
6520: 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e  ken.z, pR->token
6530: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  .n, 0);.      fo
6540: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
6550: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
6560: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6570: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
6580: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  pCol->zName)==0 
6590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
65a0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68   n;.          ch
65b0: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
65c0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
65d0: 42 75 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74 29  Buf,"_%d",++cnt)
65e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
65f0: 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
6600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6610: 65 74 4e 53 74 72 69 6e 67 28 26 70 43 6f 6c 2d  etNString(&pCol-
6620: 3e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65  >zName, pR->toke
6630: 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pR->token.n
6640: 2c 20 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20  , zBuf,n,0);.   
6650: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
6660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6670: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
6680: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
6690: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
66a0: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
66b0: 69 6e 67 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ing(&pCol->zName
66c0: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
66d0: 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  span.n, 0);.    
66e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
66f0: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
6700: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
6710: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
6720: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
6730: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
6740: 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a  up(zBuf);.    }.
6750: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6760: 74 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  te(pCol->zName);
6770: 0a 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ..    zType = sq
6780: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d  liteStrDup(colum
6790: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20 70 53  nType(pParse, pS
67a0: 65 6c 65 63 74 2d 3e 70 53 72 63 20 2c 70 29 29  elect->pSrc ,p))
67b0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  ;.    pCol->zTyp
67c0: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
67d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
67e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
67f0: 49 43 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  IC;.    if( zTyp
6800: 65 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  e ){.      pCol-
6810: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
6820: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
6830: 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54  zType, strlen(zT
6840: 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ype));.    }.   
6850: 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73   pCol->pColl = s
6860: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6870: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
6880: 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f    if( !pCol->pCo
6890: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
68a0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ->pColl = pParse
68b0: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
68c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
68d0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
68e0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
68f0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67  ./*.** For the g
6900: 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
6910: 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20  ement, do three 
6920: 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  things..**.**   
6930: 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (1)  Fill in th
6940: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
6950: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
6960: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
6970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
6980: 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 74  nes the set of t
6990: 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c  ables that shoul
69a0: 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 20 46  d be scanned.  F
69b0: 6f 72 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20  or views,.**    
69c0: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
69d0: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
69e0: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
69f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6a00: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
6a10: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
6a20: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
6a30: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
6a40: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
6a50: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
6a60: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
6a70: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
6a80: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
6a90: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
6aa0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
6ab0: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
6ac0: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
6ad0: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
6ae0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
6af0: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
6b00: 2a 20 20 20 20 28 32 29 20 20 41 64 64 20 74 65  *    (2)  Add te
6b10: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
6b20: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
6b30: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
6b40: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
6b50: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
6b60: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
6b70: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
6b80: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ns..**.**    (3)
6b90: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
6ba0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
6bb0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
6bc0: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
6bd0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
6be0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
6bf0: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
6c00: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
6c10: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
6c20: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
6c30: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
6c40: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
6c50: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
6c60: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
6c70: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
6c80: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
6c90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
6ca0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
6cb0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
6cc0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
6cd0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
6ce0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
6cf0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
6d00: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
6d10: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20  olumnList(Parse 
6d20: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
6d30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
6d40: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
6d50: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
6d60: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
6d70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
6d80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
6d90: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
6da0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
6db0: 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSrc==0 ) return
6dc0: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
6dd0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
6de0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
6df0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
6e00: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ery table in the
6e10: 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a   table list..  *
6e20: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
6e30: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
6e40: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
6e50: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
6e60: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
6e70: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pTab ){.      /*
6e80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
6e90: 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20 4e  s run before!  N
6ea0: 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e  o need to contin
6eb0: 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ue */.      retu
6ec0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6ed0: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
6ee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6ef0: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
6f00: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
6f10: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
6f20: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
6f30: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  m->pSelect!=0 );
6f40: 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
6f50: 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ->zAlias==0 ){. 
6f60: 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b         char zFak
6f70: 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20  eName[60];.     
6f80: 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65     sprintf(zFake
6f90: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75  Name, "sqlite_su
6fa0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
6fb0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
6fc0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
6fd0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
6fe0: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 7a 46  From->zAlias, zF
6ff0: 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  akeName, 0);.   
7000: 20 20 20 7d 0a 20 20 20 20 20 20 70 46 72 6f 6d     }.      pFrom
7010: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
7020: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7030: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
7040: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
7050: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
7060: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7070: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
7080: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
70a0: 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e  * The isTransien
70b0: 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
70c0: 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20   that the Table 
70d0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
70e0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61  en.      ** dyna
70f0: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
7100: 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65  d and may be fre
7110: 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20  ed at any time. 
7120: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
7130: 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69  .      ** pTab i
7140: 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
7150: 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74  o a persistent t
7160: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
7170: 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20  hat defines.    
7180: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
7190: 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20   schema. */.    
71a0: 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69    pTab->isTransi
71b0: 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ent = 1;.    }el
71c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
71d0: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
71e0: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
71f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7200: 2f 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  /.      pFrom->p
7210: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
7220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
7230: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
7240: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72  pFrom->zName,pFr
7250: 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om->zDatabase);.
7260: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7270: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7280: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7290: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
72a0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
72b0: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
72c0: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
72d0: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
72e0: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
72f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
7300: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
7310: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
7320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
7330: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
7340: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
7350: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
7360: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
7370: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
7380: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
7390: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
73a0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
73b0: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
73c0: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
73d0: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
73e0: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
73f0: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
7400: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
7410: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7420: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
7430: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7440: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
7450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7460: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
7470: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7480: 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  p(pTab->pSelect)
7490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
74a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
74b0: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
74c0: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
74d0: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
74e0: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
74f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
7500: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
7510: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
7520: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
7530: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
7540: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
7550: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
7560: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
7570: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
7580: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
7590: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
75a0: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
75b0: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
75c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
75d0: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
75e0: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
75f0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
7600: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
7610: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
7620: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
7630: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
7640: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
7650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
7660: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
7670: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
7680: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
7690: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
76a0: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
76b0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
76c0: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
76d0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
76e0: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
76f0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
7700: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
7710: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
7720: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
7730: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
7740: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
7750: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
7760: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
7770: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
7780: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
7790: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
77a0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
77b0: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
77c0: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
77d0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
77e0: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
77f0: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
7800: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
7810: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
7820: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
7830: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
7840: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
7850: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
7860: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7870: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
7880: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
7890: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
78a0: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
78b0: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
78c0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
78d0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
78e0: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
78f0: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
7900: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
7910: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7920: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
7930: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
7940: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
7950: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
7960: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
7970: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
7980: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
7990: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
79a0: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
79b0: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
79c0: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
79d0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
79e0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
79f0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
7a00: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
7a10: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
7a20: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
7a30: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
7a40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
7a50: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
7a60: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
7a70: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
7a80: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
7a90: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
7aa0: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
7ab0: 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  e;.        a[k].
7ac0: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
7ad0: 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
7ae0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
7af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
7b00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7b10: 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
7b20: 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
7b30: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
7b40: 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
7b50: 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
7b60: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
7b70: 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
7b80: 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
7b90: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
7ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7bb0: 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
7bc0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
7bd0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
7be0: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66  _DOT && pE->pLef
7bf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
7c00: 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  TName = sqlite3N
7c10: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
7c20: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b  ->pLeft->token);
7c30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7c40: 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
7c50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7c60: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
7c70: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
7c80: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
7c90: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
7ca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
7cb0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
7cc0: 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
7cd0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
7ce0: 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
7cf0: 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  as;.          if
7d00: 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c  ( zTabName==0 ||
7d10: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
7d20: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
7d30: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
7d40: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7d50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7d60: 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61  ( zTName && (zTa
7d70: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7d80: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7db0: 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
7dc0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
7dd0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7de0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7df0: 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
7e00: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
7e10: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
7e20: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
7e30: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7e40: 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  r, *pLeft, *pRig
7e50: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
7e60: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
7e70: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
7e80: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
7e90: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
7ea0: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
7eb0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
7ec0: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
7ed0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
7ee0: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
7ef0: 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61  a[i-1].pTab, zNa
7f00: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7f10: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7f20: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
7f30: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
7f40: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7f60: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7f70: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
7f80: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7f90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7fa0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7fb0: 26 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  & sqlite3IdListI
7fc0: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
7fd0: 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  [i-1].pUsing, zN
7fe0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
7ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
8000: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
8010: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
8020: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8040: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
8050: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
8060: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
8070: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8080: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8090: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
80a0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
80b0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
80c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
80d0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
80e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
80f0: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
8100: 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  n.z = zName;.   
8110: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
8120: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
8130: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
8140: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
8150: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
8160: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
8170: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
8180: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
8190: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
81a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
81b0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
81d0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
81e0: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
81f0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
8200: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8210: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
8220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8230: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Left->token.z = 
8240: 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zTabName;.      
8250: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
8260: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
8270: 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
8280: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
8290: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
82b0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 28 63  ite3SetString((c
82c0: 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70  har**)&pExpr->sp
82d0: 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  an.z, zTabName, 
82e0: 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ".", zName, 0);.
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8300: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74  xpr->span.n = st
8310: 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e  rlen(pExpr->span
8320: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .z);.           
8330: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
8340: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
8350: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8360: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
8370: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8380: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
8390: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
83a0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
83c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
83d0: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
83e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
83f0: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
8400: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
8410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8420: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8430: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8440: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
8450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8470: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
8480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8490: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
84a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
84b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
84c0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
84d0: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
84e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
84f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8510: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
8520: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
8530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8540: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
8550: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
8560: 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  Free(zTName);.  
8570: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8590: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
85a0: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
85b0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
85c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
85d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
85e0: 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20  rsively unlinks 
85f0: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e  the Select.pSrc.
8600: 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72  a[].pTab pointer
8610: 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74  s.** in a select
8620: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
8630: 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f  just sets the po
8640: 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20  inters to NULL. 
8650: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
8660: 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e   is recursive in
8670: 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
8680: 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  if the Select.pS
8690: 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a  rc.a[].pSelect.*
86a0: 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  * pointer is not
86b0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74   NULL, this rout
86c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
86d0: 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61  cursively on tha
86e0: 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  t pointer..**.**
86f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8700: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53   called on the S
8710: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
8720: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a  that defines a.*
8730: 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20  * VIEW in order 
8740: 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64  to undo any bind
8750: 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20  ings to tables. 
8760: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
8770: 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  ry.** because th
8780: 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74  ose tables might
8790: 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20   be DROPed by a 
87a0: 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63  subsequent SQL c
87b0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68  ommand..** If th
87c0: 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e  e bindings are n
87d0: 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e  ot removed, then
87e0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
87f0: 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
8800: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  .** will be left
8810: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64   pointing to a d
8820: 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65  eallocated Table
8830: 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72   structure after
8840: 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64   the.** DROP and
8850: 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c   a coredump will
8860: 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74 20   occur the next 
8870: 74 69 6d 65 20 74 68 65 20 56 49 45 57 20 69 73  time the VIEW is
8880: 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
8890: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
88a0: 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  nd(Select *p){. 
88b0: 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
88c0: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
88d0: 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  c;.  Table *pTab
88e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
88f0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8900: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
8910: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  i++){.    if( (p
8920: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  Tab = pSrc->a[i]
8930: 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20  .pTab)!=0 ){.   
8940: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
8950: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
8960: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
8970: 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b  eTable(0, pTab);
8980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8990: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  Src->a[i].pTab =
89a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   0;.      if( pS
89b0: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
89c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
89d0: 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  te3SelectUnbind(
89e0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
89f0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
8a00: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8a10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
8a20: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
8a30: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
8a40: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
8a50: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
8a60: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
8a70: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
8a80: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
8a90: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
8aa0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8ab0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
8ac0: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
8ad0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
8ae0: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
8af0: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
8b00: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
8b10: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
8b20: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
8b30: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
8b40: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
8b50: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
8b60: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
8b70: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
8b80: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
8b90: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
8ba0: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
8bb0: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
8bc0: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
8bd0: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
8be0: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
8bf0: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
8c00: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
8c10: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
8c20: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
8c30: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
8c40: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
8c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
8c60: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
8c70: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
8c80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
8c90: 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61  * A place to lea
8ca0: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
8cb0: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
8cc0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f  Select,        /
8cd0: 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c  * Match to resul
8ce0: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69  t columns of thi
8cf0: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78  s SELECT */.  Ex
8d00: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
8d10: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
8d20: 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20  ER BY values to 
8d30: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f  match against co
8d40: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lumns */.  int i
8d50: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
8d60: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
8d70: 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c  s value in iTabl
8d80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43  e */.  int mustC
8d90: 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f  omplete        /
8da0: 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52  * If TRUE all OR
8db0: 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74  DER BYs must mat
8dc0: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ch */.){.  int n
8dd0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
8de0: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
8df0: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
8e00: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
8e10: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
8e20: 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74  rn 1;.  if( must
8e30: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
8e40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8e50: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8e60: 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  { pOrderBy->a[i]
8e70: 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d  .done = 0; }.  }
8e80: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
8e90: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
8ea0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
8eb0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
8ec0: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  if( pSelect->pPr
8ed0: 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  ior ){.    if( m
8ee0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
8ef0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c  umn(pParse, pSel
8f00: 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72  ect->pPrior, pOr
8f10: 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30  derBy, iTable, 0
8f20: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8f30: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
8f40: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
8f50: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  t->pEList;.  for
8f60: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
8f70: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8f80: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
8f90: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
8fa0: 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  pr;.    int iCol
8fb0: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
8fc0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
8fd0: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
8fe0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
8ff0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
9000: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
9010: 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
9020: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
9030: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
9040: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9050: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
9060: 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f  ORDER BY positio
9070: 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62  n %d should be b
9080: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
9090: 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  ,.          iCol
90a0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
90b0: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
90c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
90d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
90e0: 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65  f( !mustComplete
90f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9100: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
9110: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43  .    for(j=0; iC
9120: 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74  ol<0 && j<pEList
9130: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
9140: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
9150: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
9160: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
9170: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
9180: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
9190: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
91a0: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
91b0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
91c0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
91d0: 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   zLabel = sqlite
91e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26  3NameFromToken(&
91f0: 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pE->token);.    
9200: 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62      assert( zLab
9210: 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  el!=0 );.       
9220: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9230: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
9240: 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  l)==0 ){ .      
9250: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
9260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9270: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65  sqliteFree(zLabe
9280: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
9290: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
92a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
92b0: 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61  re(pE, pEList->a
92c0: 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [j].pExpr) ){.  
92d0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
92e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92f0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
9300: 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20  .      pE->op = 
9310: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
9320: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
9330: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  Col;.      pE->i
9340: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
9350: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
9360: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20  a[i].done = 1;. 
9370: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
9380: 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c  l<0 && mustCompl
9390: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ete ){.      sql
93a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
93b0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52  rse,.        "OR
93c0: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
93d0: 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d  er %d does not m
93e0: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
93f0: 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20  column", i+1);. 
9400: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
9410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
9430: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  r;  .}../*.** Ge
9440: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
9450: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
9460: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
9470: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
9480: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
9490: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
94a0: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
94b0: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
94c0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
94d0: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
94e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
94f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
9500: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
9510: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
9520: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
9530: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
9540: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
9550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
9560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
9570: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
9580: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
9590: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
95a0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c  sed on the.** nL
95b0: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
95c0: 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74   fields.  nLimit
95d0: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c   and nOffset hol
95e0: 64 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a  d the integers.*
95f0: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
9600: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
9610: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
9620: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
9630: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
9640: 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c  ds.  Or that hol
9650: 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68  d -1 and 0 if th
9660: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
9670: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69   omitted..** iLi
9680: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
9690: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
96a0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
96b0: 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63  numbers for.** c
96c0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
96d0: 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  compute the limi
96e0: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
96f0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a  f there is no.**
9700: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
9710: 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69  fset, then iLimi
9720: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
9730: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
9740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9750: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
9760: 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s if iLimit and 
9770: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
9780: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
9790: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
97a0: 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f  by nLimit and nO
97b0: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
97c0: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
97d0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
97e0: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
97f0: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
9800: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
9810: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
9820: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
9830: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
9840: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69  ..** Only if nLi
9850: 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65  mit>=0 or nOffse
9860: 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  t>0 do the limit
9870: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
9880: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
9890: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
98a0: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
98b0: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
98c0: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
98d0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
98e0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
98f0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
9900: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
9910: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
9920: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
9930: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
9940: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
9950: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20  elect *p){.  /* 
9960: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  .  ** If the com
9970: 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c  parison is p->nL
9980: 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d  imit>0 then "LIM
9990: 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a  IT 0" shows.  **
99a0: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69   all rows.  It i
99b0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f  s the same as no
99c0: 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63   limit. If the c
99d0: 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20  omparision is.  
99e0: 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  ** p->nLimit>=0 
99f0: 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73  then "LIMIT 0" s
9a00: 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61  how no rows at a
9a10: 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  ll..  ** "LIMIT 
9a20: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
9a30: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
9a40: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
9a50: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
9a60: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
9a70: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
9a80: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
9a90: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
9aa0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
9ab0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
9ac0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
9ad0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
9ae0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
9af0: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
9b00: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56  e->nMem++;.    V
9b10: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9b20: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9b30: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
9b40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
9b50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9b60: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e  OP_Integer, -p->
9b70: 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  nLimit, 0);.    
9b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9b90: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
9ba0: 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70   iMem, 1);.    p
9bb0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b  ->iLimit = iMem;
9bc0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  .  }.  if( p->nO
9bd0: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69  ffset>0 ){.    i
9be0: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
9bf0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
9c00: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9c10: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9c20: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
9c30: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
9c40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9c50: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
9c60: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
9c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9c80: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
9c90: 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70   iMem, 1);.    p
9ca0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d  ->iOffset = iMem
9cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
9cc0: 65 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e 73  enerate VDBE ins
9cd0: 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77  tructions that w
9ce0: 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73  ill open a trans
9cf0: 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a  ient table that.
9d00: 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ** will be used 
9d10: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  for an index or 
9d20: 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72  to store keyed r
9d30: 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d  esults for a com
9d40: 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e  pound.** select.
9d50: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9d60: 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65  , open a transie
9d70: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65  nt table that ne
9d80: 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f  eds a.** KeyInfo
9d90: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
9da0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
9db0: 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66  ns in the KeyInf
9dc0: 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  o is determined.
9dd0: 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c 74  ** by the result
9de0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
9df0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
9e00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
9e10: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ent..**.** Speci
9e20: 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  fically, this ro
9e30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9e40: 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78  to open an index
9e50: 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49   table for.** DI
9e60: 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49  STINCT, UNION, I
9e70: 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43  NTERSECT and EXC
9e80: 45 50 54 20 73 65 6c 65 63 74 20 73 74 61 74 65  EPT select state
9e90: 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a  ments (but not .
9ea0: 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a  ** UNION ALL)..*
9eb0: 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65  *.** Make the ne
9ec0: 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44  w table a KeyAsD
9ed0: 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79  ata table if key
9ee0: 41 73 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a  AsData is true..
9ef0: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
9f00: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
9f10: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
9f20: 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72  P_OpenTemp instr
9f30: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
9f40: 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e  c int openTempIn
9f50: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
9f60: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
9f70: 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41  t iTab, int keyA
9f80: 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66  sData){.  KeyInf
9f90: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
9fa0: 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71  nt nColumn;.  sq
9fb0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
9fc0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
9fd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9fe0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
9ff0: 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 66 69   addr;..  if( fi
a000: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
a010: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
a020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a030: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45   nColumn = p->pE
a040: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
a050: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
a060: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
a070: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d  pKeyInfo)+nColum
a080: 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  n*sizeof(CollSeq
a090: 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  *) );.  if( pKey
a0a0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
a0b0: 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e   0;.  pKeyInfo->
a0c0: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
a0d0: 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66  ->enc;.  pKeyInf
a0e0: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
a0f0: 75 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  umn;.  for(i=0; 
a100: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
a110: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  .    pKeyInfo->a
a120: 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
a130: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
a140: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
a150: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
a160: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e   if( !pKeyInfo->
a170: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
a180: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
a190: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
a1a0: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Coll;.    }.  }.
a1b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
a1c0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
a1d0: 65 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c  enTemp, iTab, 0,
a1e0: 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 70   .      (char*)p
a1f0: 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
a200: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
a210: 69 66 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b  if( keyAsData ){
a220: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
a240: 73 44 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b  sData, iTab, 1);
a250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
a260: 64 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  dr;.}..static in
a270: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65  t multiSelectOpe
a280: 6e 54 65 6d 70 41 64 64 72 28 53 65 6c 65 63 74  nTempAddr(Select
a290: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 49   *p, int addr, I
a2a0: 64 4c 69 73 74 20 2a 2a 70 70 4f 70 65 6e 54 65  dList **ppOpenTe
a2b0: 6d 70 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70  mp){.  if( !p->p
a2c0: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
a2d0: 20 2a 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73   *ppOpenTemp = s
a2e0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
a2f0: 6e 64 28 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  nd(0, 0);.    p-
a300: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 70  >ppOpenTemp = pp
a310: 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 65 6c 73  OpenTemp;.  }els
a320: 65 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 4f 70 65  e{.    *p->ppOpe
a330: 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49  nTemp = sqlite3I
a340: 64 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e  dListAppend(*p->
a350: 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b 0a  ppOpenTemp, 0);.
a360: 20 20 7d 0a 20 20 69 66 28 20 21 28 2a 70 2d 3e    }.  if( !(*p->
a370: 70 70 4f 70 65 6e 54 65 6d 70 29 20 29 7b 0a 20  ppOpenTemp) ){. 
a380: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a390: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 28 2a  _NOMEM;.  }.  (*
a3a0: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29 2d 3e  p->ppOpenTemp)->
a3b0: 61 5b 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  a[(*p->ppOpenTem
a3c0: 70 29 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d  p)->nId-1].idx =
a3d0: 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20   addr;.  return 
a3e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
a3f0: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
a400: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
a410: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a420: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
a430: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
a440: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
a450: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
a460: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
a470: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
a480: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
a490: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Col);.  }.  if( 
a4a0: 21 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65  !pRet ){.    pRe
a4b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
a4c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a4d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
a4e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
a4f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
a500: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a510: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a520: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
a530: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
a540: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
a550: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
a560: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
a570: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
a580: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
a590: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
a5a0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
a5b0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
a5c0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
a5d0: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
a5e0: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
a5f0: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
a600: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
a610: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
a620: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
a630: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
a640: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
a650: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
a660: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
a670: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
a680: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
a690: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
a6a0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
a6b0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
a6c0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
a6d0: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
a6e0: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
a6f0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
a700: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
a710: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
a720: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
a730: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
a740: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
a750: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
a760: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
a770: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
a780: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
a790: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
a7a0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
a7b0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
a7c0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
a7d0: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
a7e0: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
a7f0: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
a800: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
a810: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
a820: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
a830: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
a840: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
a850: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a860: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
a870: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
a880: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
a890: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
a8a0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
a8b0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
a8c0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
a8d0: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
a8e0: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
a8f0: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
a900: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
a910: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
a920: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
a930: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
a940: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
a950: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
a960: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
a970: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
a980: 70 2c 20 0a 20 20 69 6e 74 20 65 44 65 73 74 2c  p, .  int eDest,
a990: 20 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 0a   .  int iParm, .
a9a0: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
a9b0: 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
a9c0: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
a9d0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
a9e0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
a9f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
aa00: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
aa10: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
aa20: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
aa30: 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41  pPrior;     /* A
aa40: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
aa50: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
aa60: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
aa70: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v;            /
aa80: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
aa90: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
aaa0: 20 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 54    IdList *pOpenT
aab0: 65 6d 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  emp = 0;..  /* M
aac0: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
aad0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
aae0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
aaf0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
ab00: 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
ab10: 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68  ast SELECT in th
ab20: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
ab30: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
ab40: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69   LIMIT..  */.  i
ab50: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50  f( p==0 || p->pP
ab60: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rior==0 ){.    r
ab70: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
ab80: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ab90: 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d  ;.  }.  pPrior =
aba0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66   p->pPrior;.  if
abb0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
abc0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
abd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
abe0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
abf0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
ac00: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
ac10: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
ac20: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
ac30: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
ac40: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
ac50: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
ac60: 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e   pPrior->nLimit>
ac70: 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f  =0 || pPrior->nO
ac80: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
ac90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
aca0: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
acb0: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
acc0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
acd0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
ace0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
acf0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
ad00: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ad10: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
ad20: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
ad30: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
ad40: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
ad50: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
ad60: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
ad70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ad80: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
ad90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
ada0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
adb0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
adc0: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
add0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
ade0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
adf0: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
ae00: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
ae10: 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
ae20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
ae30: 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
ae40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ae50: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
ae60: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
ae70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ae80: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
ae90: 2c 20 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  , iParm, p->pELi
aea0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
aeb0: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
aec0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
aed0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
aee0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
aef0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
af00: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
af10: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
af20: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
af30: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
af40: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
af50: 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d      pPrior->nLim
af60: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
af70: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
af80: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
af90: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50  fset;.        pP
afa0: 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  rior->ppOpenTemp
afb0: 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70   = p->ppOpenTemp
afc0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
afd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
afe0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65  rse, pPrior, eDe
aff0: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
b000: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
b010: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
b020: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
b030: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
b040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
b050: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
b060: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
b070: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
b080: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
b090: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
b0a0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
b0b0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->nLimit = -1;.
b0c0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73          p->nOffs
b0d0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
b0e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
b0f0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
b100: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
b110: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
b120: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
b130: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
b140: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
b150: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b160: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
b170: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
b180: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b190: 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c   /* For UNION AL
b1a0: 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66  L ... ORDER BY f
b1b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
b1c0: 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  he next case */.
b1d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b1e0: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
b1f0: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
b200: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
b210: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
b220: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
b230: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
b240: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
b250: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30        int op = 0
b260: 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;      /* One of
b270: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
b280: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
b290: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
b2a0: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
b2b0: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
b2c0: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
b2d0: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
b2e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  */.      int nLi
b2f0: 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a  mit, nOffset; /*
b300: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
b310: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
b320: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
b330: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
b340: 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f  derBy;  /* The O
b350: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
b360: 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c  or the right SEL
b370: 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ECT */.      int
b380: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72   addr;..      pr
b390: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
b3a0: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
b3b0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
b3c0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
b3d0: 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f  priorOp && p->pO
b3e0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e  rderBy==0 && p->
b3f0: 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e  nLimit<0 && p->n
b400: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
b410: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
b420: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
b430: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
b440: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
b450: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
b460: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
b470: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
b480: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
b490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b4a0: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
b4b0: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
b4c0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
b4d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
b4e0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
b4f0: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
b500: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b510: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
b520: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
b530: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
b540: 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26  erBy .        &&
b550: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
b560: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
b570: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e   p->pOrderBy, un
b580: 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20  ionTab, 1) ){.  
b590: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
b5a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
b5b0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b5c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b5d0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
b5e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b5f0: 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e  _OpenTemp, union
b600: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
b610: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41   if( p->op!=TK_A
b620: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
b630: 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
b640: 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20  OpenTempAddr(p, 
b650: 61 64 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d 70  addr, &pOpenTemp
b660: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
b690: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
b6a0: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  end;.          }
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b6c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b6d0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69  P_KeyAsData, uni
b6e0: 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20  onTab, 1);.     
b6f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
b700: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
b710: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b720: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
b730: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
b740: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
b750: 20 2a 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72   */.      pPrior
b760: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70  ->ppOpenTemp = p
b770: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20  ->ppOpenTemp;.  
b780: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b790: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b7a0: 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20  Prior, priorOp, 
b7b0: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
b7c0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
b7d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
b7e0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b7f0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
b800: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
b810: 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20  =TK_ALL ){.     
b820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b830: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
b840: 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61  Columns, unionTa
b850: 62 2c 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  b, pPrior->pELis
b860: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
b870: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
b880: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
b890: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
b8a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77       */.      sw
b8b0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
b8c0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
b8d0: 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52  EXCEPT:  op = SR
b8e0: 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61  T_Except;   brea
b8f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
b900: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20   TK_UNION:   op 
b910: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20  = SRT_Union;    
b920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b930: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
b940: 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b   op = SRT_Table;
b950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b960: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
b970: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  or = 0;.      pO
b980: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
b990: 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70  erBy;.      p->p
b9a0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
b9b0: 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e     nLimit = p->n
b9c0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
b9d0: 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  nLimit = -1;.   
b9e0: 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e     nOffset = p->
b9f0: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  nOffset;.      p
ba00: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
ba10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ba20: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ba30: 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  p, op, unionTab,
ba40: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
ba50: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ba60: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
ba70: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
ba80: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d  rderBy;.      p-
ba90: 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74  >nLimit = nLimit
baa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73  ;.      p->nOffs
bab0: 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20  et = nOffset;.  
bac0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
bad0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
bae0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
baf0: 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20     }...      /* 
bb00: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
bb10: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
bb20: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
bb30: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
bb40: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
bb50: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
bb60: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
bb70: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
bb80: 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69  !=priorOp || uni
bb90: 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a  onTab!=iParm ){.
bba0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
bbb0: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
bbc0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
bbd0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
bbe0: 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73          if( eDes
bbf0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
bc00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
bc10: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
bc20: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
bc30: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
bc40: 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
bc50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bc60: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bc70: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
bc80: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
bc90: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
bca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bcb0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
bcc0: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
bcd0: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
bce0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
bcf0: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  rse, p);.       
bd00: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
bd10: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
bd20: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
bd30: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
bd40: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
bd50: 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
bd60: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
bd70: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
bda0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
bdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
bdd0: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
bdf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
be00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
be10: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
be20: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
be30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
be40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
be50: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
be60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be70: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
be80: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
be90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bea0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
beb0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
bec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bed0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
bee0: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
bef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bf00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bf10: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
bf20: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
bf30: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
bf40: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
bf50: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
bf60: 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20      int nLimit, 
bf70: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  nOffset;.      i
bf80: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
bf90: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
bfa0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
bfb0: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
bfc0: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
bfd0: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
bfe0: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
bff0: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
c000: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
c010: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
c020: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
c030: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
c040: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
c050: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
c060: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
c070: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c080: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
c090: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
c0a0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
c0b0: 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65  Parse,p,p->pOrde
c0c0: 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20  rBy,tab1,1) ){. 
c0d0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
c0e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c0f0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c100: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64 64      }..      add
c110: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c120: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
c130: 65 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  emp, tab1, 0);. 
c140: 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53       rc = multiS
c150: 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64  electOpenTempAdd
c160: 72 28 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65  r(p, addr, &pOpe
c170: 6e 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  nTemp);.      if
c180: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c190: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c1a0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c1b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c1c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c1d0: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
c1e0: 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20  , tab1, 1);.    
c1f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c200: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
c210: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
c220: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
c230: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
c240: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
c250: 20 2a 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72   */.      pPrior
c260: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70  ->ppOpenTemp = p
c270: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20  ->ppOpenTemp;.  
c280: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c290: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c2a0: 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e  Prior, SRT_Union
c2b0: 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c  , tab1, 0, 0, 0,
c2c0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
c2d0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c2e0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c2f0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
c300: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
c310: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
c320: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
c330: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
c340: 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
c350: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c360: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
c370: 70 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  p, tab2, 0);.   
c380: 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
c390: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
c3a0: 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54  p, addr, &pOpenT
c3b0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  emp);.      if( 
c3c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c3d0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c3e0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c400: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c410: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
c420: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
c430: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
c440: 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d       nLimit = p-
c450: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >nLimit;.      p
c460: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
c470: 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70       nOffset = p
c480: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->nOffset;.     
c490: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
c4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c4b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c4c0: 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  , p, SRT_Union, 
c4d0: 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab2, 0, 0, 0, a
c4e0: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
c4f0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
c500: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
c510: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
c520: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
c530: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
c540: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
c550: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c560: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
c570: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
c580: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
c590: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
c5a0: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
c5b0: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
c5c0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
c5d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c5e0: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
c5f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
c600: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
c610: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
c620: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
c630: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
c640: 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
c650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c660: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
c670: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
c680: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
c690: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c6a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
c6b0: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
c6c0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  eak);.      comp
c6d0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
c6e0: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
c6f0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
c700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c710: 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62   OP_FullKey, tab
c720: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
c730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c740: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
c750: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
c760: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
c770: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
c780: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
c790: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
c7a0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
c7d0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
c7e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c800: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
c810: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c820: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
c830: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
c840: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c860: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c870: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
c880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c890: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
c8a0: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
c8b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c8c0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
c8d0: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
c8e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c8f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c900: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
c910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c920: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
c930: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
c940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
c950: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
c960: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
c970: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
c980: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c990: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
c9a0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
c9b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c9c0: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
c9d0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
c9e0: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
c9f0: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
ca00: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
ca10: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
ca20: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
ca30: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
ca40: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
ca50: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ca60: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
ca70: 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70  pOrderBy || (pOp
ca80: 65 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54  enTemp && pOpenT
ca90: 65 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20  emp->nId>0) ){. 
caa0: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d     int nCol = p-
cab0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
cac0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4b      int i;.    K
cad0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
cae0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
caf0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
cb00: 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f  )+nCol*sizeof(Co
cb10: 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66  llSeq*));.    if
cb20: 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
cb30: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cb40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
cb50: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cb60: 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
cb70: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
cb80: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
cb90: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  .    pKeyInfo->n
cba0: 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20  Field = nCol;.. 
cbb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
cbc0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cbd0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
cbe0: 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
cbf0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
cc00: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
cc10: 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c   !pKeyInfo->aCol
cc20: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
cc30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
cc40: 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  i] = pParse->db-
cc50: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
cc60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
cc70: 6f 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d  or(i=0; pOpenTem
cc80: 70 20 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70  p && i<pOpenTemp
cc90: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
cca0: 20 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20     int p3type = 
ccb0: 28 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f  (i==0?P3_KEYINFO
ccc0: 5f 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49  _HANDOFF:P3_KEYI
ccd0: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  NFO);.      int 
cce0: 61 64 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70  addr = pOpenTemp
ccf0: 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20  ->a[i].idx;.    
cd00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cd10: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
cd20: 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
cd30: 20 70 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a   p3type);.    }.
cd40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
cd50: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
cd60: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64  r(i=0; i<p->pOrd
cd70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
cd80: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
cd90: 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64  *pExpr = p->pOrd
cda0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
cdb0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
cdc0: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 70 4f 72 64 65  zName = p->pOrde
cdd0: 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  rBy->a[i].zName;
cde0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cdf0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
ce00: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
ce10: 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a  iColumn<nCol );.
ce20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ce30: 21 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  !pExpr->pColl );
ce40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
ce50: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
ce60: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
ce70: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
ce80: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  Seq(pParse, zNam
ce90: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
cea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ceb0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
cec0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
ced0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b  pExpr->iColumn];
cee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cef0: 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74   }.      generat
cf00: 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
cf10: 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  , p, v, p->pELis
cf20: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
cf30: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a   iParm);.    }..
cf40: 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65      if( !pOpenTe
cf50: 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  mp ){.      /* T
cf60: 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
cf70: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
cf80: 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20  DER BY */.      
cf90: 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49  sqliteFree(pKeyI
cfa0: 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nfo);.    }.  }.
cfb0: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
cfc0: 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65  d:.  if( pOpenTe
cfd0: 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mp ){.    sqlite
cfe0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f  3IdListDelete(pO
cff0: 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20  penTemp);.  }.  
d000: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  p->ppOpenTemp = 
d010: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
d020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
d030: 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
d040: 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
d050: 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
d060: 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
d070: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
d080: 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
d090: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
d0a0: 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
d0b0: 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
d0c0: 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
d0d0: 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
d0e0: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
d0f0: 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
d100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
d110: 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
d120: 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
d130: 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
d140: 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
d150: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
d160: 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
d170: 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
d180: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
d190: 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
d1a0: 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
d1b0: 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
d1c0: 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
d1d0: 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
d1e0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
d1f0: 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
d200: 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
d210: 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
d220: 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
d230: 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
d240: 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
d250: 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
d260: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
d270: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
d280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d290: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45   substExprList(E
d2a0: 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70  xprList*,int,Exp
d2b0: 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72  rList*);  /* For
d2c0: 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61  ward Decl */.sta
d2d0: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
d2e0: 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  pr(Expr *pExpr, 
d2f0: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
d300: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
d310: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
d320: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
d330: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
d340: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
d350: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
d360: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
d370: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
d380: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
d390: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
d3a0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
d3b0: 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
d3c0: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
d3d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
d3e0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
d3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d400: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
d410: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
d420: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  && pExpr->pList=
d430: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
d440: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78   = pEList->a[pEx
d450: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
d460: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d470: 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20  ( pNew!=0 );.   
d480: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70     pExpr->op = p
d490: 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61  New->op;.      a
d4a0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
d4b0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft==0 );.      
d4c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
d4d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e  qlite3ExprDup(pN
d4e0: 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
d4f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
d500: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
d510: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
d520: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
d530: 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  up(pNew->pRight)
d540: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d550: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
d560: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
d570: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d580: 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d  xprListDup(pNew-
d590: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
d5a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
d5b0: 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
d5c0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
d5d0: 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
d5e0: 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
d5f0: 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
d600: 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
d610: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72  TokenCopy(&pExpr
d620: 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e  ->token, &pNew->
d630: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71  token);.      sq
d640: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
d650: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
d660: 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  ew->span);.    }
d670: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
d680: 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
d690: 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
d6a0: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
d6b0: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67  Expr(pExpr->pRig
d6c0: 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
d6d0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
d6e0: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
d6f0: 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
d700: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
d710: 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78  ic void .substEx
d720: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
d730: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62  *pList, int iTab
d740: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
d750: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
d760: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d770: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
d780: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
d790: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
d7a0: 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
d7b0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
d7c0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
d7d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d7e0: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
d7f0: 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
d800: 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
d810: 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
d820: 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
d830: 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
d840: 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
d850: 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
d860: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
d870: 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
d880: 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
d890: 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
d8a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
d8b0: 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
d8c0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
d8d0: 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
d8e0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
d8f0: 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
d900: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
d910: 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
d920: 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
d930: 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
d940: 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
d950: 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
d960: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
d970: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d980: 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
d990: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
d9a0: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
d9b0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
d9c0: 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
d9d0: 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
d9e0: 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
d9f0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
da00: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
da10: 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
da20: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
da30: 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
da40: 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
da50: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
da60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
da70: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
da80: 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
da90: 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
daa0: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
dab0: 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
dac0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
dad0: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
dae0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
daf0: 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
db00: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
db10: 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
db20: 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
db30: 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
db40: 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
db50: 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
db60: 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
db70: 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
db80: 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
db90: 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
dba0: 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
dbb0: 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
dbc0: 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
dbd0: 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
dbe0: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
dbf0: 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
dc00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
dc10: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
dc20: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
dc30: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
dc40: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
dc50: 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
dc60: 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
dc70: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
dc80: 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
dc90: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
dca0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
dcb0: 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
dcc0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
dcd0: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
dce0: 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
dcf0: 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
dd00: 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
dd10: 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
dd20: 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
dd30: 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
dd40: 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
dd50: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
dd60: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
dd70: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
dd80: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
dd90: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
dda0: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
ddb0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ddc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
ddd0: 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
dde0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
ddf0: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
de00: 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
de10: 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
de20: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
de30: 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
de40: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
de50: 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
de60: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
de70: 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
de80: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
de90: 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
dea0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
deb0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
dec0: 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
ded0: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
dee0: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
def0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
df00: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
df10: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
df20: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
df30: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
df40: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
df50: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
df60: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
df70: 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
df80: 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
df90: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
dfa0: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
dfb0: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
dfc0: 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
dfd0: 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
dfe0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
dff0: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
e000: 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
e010: 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
e020: 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
e030: 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
e040: 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
e050: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
e060: 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ).**.** In this 
e070: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
e080: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
e090: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
e0a0: 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
e0b0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
e0c0: 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
e0d0: 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
e0e0: 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
e0f0: 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
e100: 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
e110: 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
e120: 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
e130: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
e140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
e150: 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
e160: 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
e170: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
e180: 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
e190: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
e1a0: 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
e1b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
e1c0: 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
e1d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e1e0: 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
e1f0: 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
e200: 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
e210: 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
e220: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
e230: 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
e240: 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
e250: 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
e260: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e270: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
e280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
e290: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
e2a0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
e2b0: 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
e2c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
e2d0: 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
e2e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
e2f0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
e300: 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
e310: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
e320: 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
e330: 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
e340: 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
e350: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
e360: 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
e370: 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
e380: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
e390: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
e3a0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
e3b0: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
e3c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
e3d0: 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
e3e0: 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
e3f0: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
e400: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
e410: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
e420: 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
e430: 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
e440: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
e450: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
e460: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e470: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
e480: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
e490: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
e4a0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
e4b0: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
e4c0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
e4d0: 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
e4e0: 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
e4f0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  */.  int i;.  Ex
e500: 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f  pr *pWhere;..  /
e510: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e520: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
e530: 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
e540: 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
e550: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
e560: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
e570: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
e580: 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
e590: 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
e5a0: 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
e5b0: 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  Sub = pSrc->a[iF
e5c0: 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  rom].pSelect;.  
e5d0: 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
e5e0: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
e5f0: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
e600: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e610: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
e620: 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
e630: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
e640: 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
e650: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
e660: 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70  ubSrc );.  if( p
e670: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
e680: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e690: 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
e6a0: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69  nct || pSub->nLi
e6b0: 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72  mit>=0) &&  (pSr
e6c0: 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
e6d0: 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
e6e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
e6f0: 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  (p->isDistinct |
e700: 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20  | p->nLimit>=0) 
e710: 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
e720: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
e730: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
e740: 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
e750: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
e760: 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  /* Restriction 3
e770: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
e780: 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
e790: 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
e7a0: 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
e7b0: 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
e7c0: 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
e7d0: 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
e7e0: 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
e7f0: 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
e800: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
e810: 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
e820: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
e830: 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
e840: 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
e850: 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
e860: 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
e870: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
e880: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
e890: 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
e8a0: 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
e8b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
e8c0: 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  ame thing..  */.
e8d0: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
e8e0: 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30  Src>1 && iFrom>0
e8f0: 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72   && (pSrc->a[iFr
e900: 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  om-1].jointype &
e910: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
e920: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
e930: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
e940: 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
e950: 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
e960: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
e970: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
e980: 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
e990: 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
e9a0: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
e9b0: 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
e9c0: 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
e9d0: 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
e9e0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
e9f0: 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
ea00: 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
ea10: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
ea20: 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
ea30: 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
ea40: 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
ea50: 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
ea60: 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
ea70: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
ea80: 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
ea90: 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
eaa0: 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
eab0: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
eac0: 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
ead0: 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
eae0: 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
eaf0: 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
eb00: 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
eb10: 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  JOIN..  */.  if(
eb20: 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72   iFrom>0 && (pSr
eb30: 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f  c->a[iFrom-1].jo
eb40: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
eb50: 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20  R)!=0 .      && 
eb60: 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20  pSub->pWhere!=0 
eb70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
eb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
eb90: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
eba0: 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74  t, it means flat
ebb0: 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
ebc0: 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
ebd0: 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
ebe0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
ebf0: 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  se in the outer 
ec00: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  query..  */..  /
ec10: 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
ec20: 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
ec30: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
ec40: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
ec50: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
ec60: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ec70: 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
ec80: 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
ec90: 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
eca0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
ecb0: 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
ecc0: 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
ecd0: 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
ece0: 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
ecf0: 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
ed00: 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
ed10: 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
ed20: 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
ed30: 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
ed40: 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
ed50: 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
ed60: 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
ed70: 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
ed80: 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
ed90: 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
eda0: 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
edb0: 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
edc0: 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
edd0: 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
ede0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43  Src->a[iFrom].iC
edf0: 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69  ursor;.  {.    i
ee00: 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75  nt nSubSrc = pSu
ee10: 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  bSrc->nSrc;.    
ee20: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70  int jointype = p
ee30: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
ee40: 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 28  intype;..    if(
ee50: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
ee60: 70 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b  pTab && pSrc->a[
ee70: 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54  iFrom].pTab->isT
ee80: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
ee90: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
eea0: 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b  able(0, pSrc->a[
eeb0: 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20  iFrom].pTab);.  
eec0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
eed0: 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  ee(pSrc->a[iFrom
eee0: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
eef0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 72    sqliteFree(pSr
ef00: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d  c->a[iFrom].zNam
ef10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
ef20: 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  ee(pSrc->a[iFrom
ef30: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ].zAlias);.    i
ef40: 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
ef50: 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
ef60: 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
ef70: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
ef80: 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
ef90: 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71         pSrc = sq
efa0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
efb0: 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  nd(pSrc, 0, 0);.
efc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
efd0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
efe0: 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
eff0: 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e  nSrc-1; i-extra>
f000: 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20  =iFrom; i--){.  
f010: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d        pSrc->a[i]
f020: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74   = pSrc->a[i-ext
f030: 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra];.      }.   
f040: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
f050: 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
f060: 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
f070: 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
f080: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
f090: 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
f0a0: 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
f0b0: 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
f0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
f0d0: 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63  >a[iFrom+nSubSrc
f0e0: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  -1].jointype = j
f0f0: 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
f100: 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
f110: 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
f120: 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
f130: 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
f140: 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
f150: 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
f160: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f170: 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
f180: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
f190: 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
f1a0: 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
f1b0: 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
f1c0: 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
f1d0: 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
f200: 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
f210: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
f220: 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
f230: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f240: 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
f250: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f260: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
f270: 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
f280: 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
f290: 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
f2a0: 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
f2b0: 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
f2c0: 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
f2d0: 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
f2e0: 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
f2f0: 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
f300: 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
f310: 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  /.  substExprLis
f320: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  t(p->pEList, iPa
f330: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
f340: 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  st);.  pList = p
f350: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
f360: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
f370: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
f380: 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
f390: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
f3a0: 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
f3b0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
f3c0: 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
f3d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
f3e0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
f3f0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
f400: 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78  xpr->span.z, pEx
f410: 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20  pr->span.n);.   
f420: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
f430: 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  gg ){.    substE
f440: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
f450: 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
f460: 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
f470: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
f480: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
f490: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
f4a0: 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
f4b0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
f4c0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
f4d0: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
f4e0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
f4f0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
f500: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
f510: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
f520: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f530: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
f540: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
f550: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
f560: 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
f570: 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
f580: 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
f590: 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
f5a0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73  >pWhere);.  }els
f5b0: 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  e{.    pWhere = 
f5c0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62  0;.  }.  if( sub
f5d0: 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
f5e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
f5f0: 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ving==0 );.    p
f600: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70  ->pHaving = p->p
f610: 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57  Where;.    p->pW
f620: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
f630: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
f640: 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
f650: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
f660: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
f670: 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
f680: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20  Expr *pHaving = 
f690: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
f6a0: 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  Sub->pHaving);. 
f6b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
f6c0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
f6d0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
f6e0: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
f6f0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76  p->pHaving, pHav
f700: 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ing, 0);.      }
f710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
f720: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
f730: 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ng;.      }.    
f740: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
f750: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
f760: 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
f770: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
f780: 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75  tDup(pSub->pGrou
f790: 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  pBy);.  }else if
f7a0: 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29  ( p->pWhere==0 )
f7b0: 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  {.    p->pWhere 
f7c0: 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73  = pWhere;.  }els
f7d0: 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
f7e0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
f7f0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
f800: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65  t);.    if( pWhe
f810: 72 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  re ){.      p->p
f820: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
f830: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70  xpr(TK_AND, p->p
f840: 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30  Where, pWhere, 0
f850: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
f860: 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
f870: 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
f880: 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
f890: 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
f8a0: 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
f8b0: 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a  s distinct. .  *
f8c0: 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  /.  p->isDistinc
f8d0: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
f8e0: 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73  t || pSub->isDis
f8f0: 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61  tinct;..  /* Tra
f900: 6e 73 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20  nsfer the limit 
f910: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
f920: 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
f930: 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71  the outer.  ** q
f940: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  uery..  */.  if(
f950: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   pSub->nLimit>=0
f960: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
f970: 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
f980: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75   p->nLimit = pSu
f990: 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  b->nLimit;.    }
f9a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d  else if( p->nLim
f9b0: 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20  it+p->nOffset > 
f9c0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75  pSub->nLimit+pSu
f9d0: 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20  b->nOffset ){.  
f9e0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
f9f0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70  pSub->nLimit + p
fa00: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70  Sub->nOffset - p
fa10: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d  ->nOffset;.    }
fa20: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65  .  }.  p->nOffse
fa30: 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73  t += pSub->nOffs
fa40: 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c  et;..  /* Finial
fa50: 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
fa60: 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
fa70: 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
fa80: 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
fa90: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
faa0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62  electDelete(pSub
fab0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
fac0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
fad0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
fae0: 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61  ment passed in a
faf0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
fb00: 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
fb10: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
fb20: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
fb30: 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68   If it is and th
fb40: 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a  is query can be.
fb50: 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69  ** satisfied usi
fb60: 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b  ng a single seek
fb70: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
fb80: 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69  g or end of an i
fb90: 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65  ndex,.** then ge
fba0: 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
fbb0: 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
fbc0: 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49  and return 1.  I
fbd0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
fbe0: 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  .** simple min()
fbf0: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c   or max() query,
fc00: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a   then return 0;.
fc10: 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d  **.** A simply m
fc20: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
fc30: 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ery looks like t
fc40: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
fc50: 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d  LECT min(a) FROM
fc60: 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45   table;.**    SE
fc70: 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d  LECT max(a) FROM
fc80: 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68   table;.**.** Th
fc90: 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65  e query may have
fca0: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
fcb0: 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d  able in its FROM
fcc0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72   argument.  Ther
fcd0: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47  e.** can be no G
fce0: 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
fcf0: 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73  G or WHERE claus
fd00: 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  es.  The result 
fd10: 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74  set must.** be t
fd20: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
fd30: 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  ) of a single co
fd40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
fd50: 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a  e.  The column.*
fd60: 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f  * in the min() o
fd70: 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
fd80: 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64   must be indexed
fd90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
fda0: 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72  meters to this r
fdb0: 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73  outine are the s
fdc0: 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74  ame as for sqlit
fdd0: 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53  e3Select()..** S
fde0: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
fdf0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
fe00: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
fe10: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
fe20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe30: 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
fe40: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
fe50: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
fe60: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
fe70: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
fe80: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
fe90: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
fea0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
feb0: 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a  t base;.  Vdbe *
fec0: 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b  v;.  int seekOp;
fed0: 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45  .  int cont;.  E
fee0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
fef0: 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a   *pList, eList;.
ff00: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ff10: 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d  t_item eListItem
ff20: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
ff30: 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 43 68 65 63  c;.  ..  /* Chec
ff40: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
ff50: 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
ff60: 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
ff70: 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  ) query.  Return
ff80: 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74  .  ** zero if it
ff90: 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20   is  not..  */. 
ffa0: 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
ffb0: 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c   || p->pHaving |
ffc0: 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  | p->pWhere ) re
ffd0: 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
ffe0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
fff0: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
10000 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69  return 0;.  pELi
10010 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
10020 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
10030 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
10040 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c  0;.  pExpr = pEL
10050 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
10060 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
10070 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
10080 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
10090 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
100a0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
100b0 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  t==0 || pList->n
100c0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
100d0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
100e0 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
100f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
10100 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45  lite3StrNICmp(pE
10110 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
10120 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
10130 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
10140 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nd;.  }else if( 
10150 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
10160 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
10170 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
10180 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61    seekOp = OP_La
10190 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
101a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
101b0 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   pExpr = pList->
101c0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
101d0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
101e0 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
101f0 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70  0;.  iCol = pExp
10200 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54  r->iColumn;.  pT
10210 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
10220 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  pTab;..  /* If w
10230 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69  e get to here, i
10240 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72  t means the quer
10250 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  y is of the corr
10260 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43  ect form..  ** C
10270 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
10280 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64  e we have an ind
10290 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78  ex and make pIdx
102a0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20   point to the.  
102b0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  ** appropriate i
102c0 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69  ndex.  If the mi
102d0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
102e0 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  on an INTEGER PR
102f0 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63  IMARY.  ** key c
10300 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20  olumn, no index 
10310 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  is necessary so 
10320 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c  set pIdx to NULL
10330 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73  .  If no.  ** us
10340 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f  able index is fo
10350 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  und, return 0.. 
10360 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30   */.  if( iCol<0
10370 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30   ){.    pIdx = 0
10380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43  ;.  }else{.    C
10390 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
103a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
103b0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
103c0 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  );.    for(pIdx=
103d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
103e0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
103f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
10400 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
10410 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
10420 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
10430 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49  n[0]==iCol && pI
10440 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
10450 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72  l[0]==pColl ) br
10460 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10470 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
10480 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
10490 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
104a0 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c   types if we wil
104b0 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63  l be using the c
104c0 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
104d0 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
104e0 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
104f0 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
10500 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72  table or a memor
10510 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65  y cell..  ** The
10520 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61   column names ha
10530 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
10540 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
10550 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
10560 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  n..  */.  v = sq
10570 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10580 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
10590 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
105a0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
105b0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
105c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
105d0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
105e0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
105f0 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
10600 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
10610 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10620 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
10630 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
10640 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10650 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10660 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d  , iParm, 1);.  }
10670 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e  ..  /* Generatin
10680 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74  g code to find t
10690 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61  he min or the ma
106a0 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c  x.  Basically al
106b0 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
106c0 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65  o do is find the
106d0 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61   first or the la
106e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
106f0 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49  chosen index.  I
10700 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29  f.  ** the min()
10710 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20   or max() is on 
10720 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
10730 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69  ARY KEY, then fi
10740 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  nd the first.  *
10750 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20  * or last entry 
10760 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
10770 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
10780 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
10790 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  a(pParse, pTab->
107a0 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70  iDb);.  base = p
107b0 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
107c0 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  r;.  computeLimi
107d0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
107e0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72  e, p);.  if( pSr
107f0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d  c->a[0].pSelect=
10800 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
10810 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10820 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
10830 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
10840 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10850 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61   OP_OpenRead, ba
10860 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b  se, pTab->tnum);
10870 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10880 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
10890 75 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c  umColumns, base,
108a0 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
108b0 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  }.  cont = sqlit
108c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
108d0 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  v);.  if( pIdx==
108e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
108f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
10900 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  kOp, base, 0);. 
10910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
10920 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10930 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
10940 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
10950 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
10960 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61   OP_OpenRead, ba
10970 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  se+1, pIdx->tnum
10980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10990 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 64       (char*)&pId
109a0 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  x->keyInfo, P3_K
109b0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28  EYINFO);.    if(
109c0 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69   seekOp==OP_Rewi
109d0 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nd ){.      sqli
109e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
109f0 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
10a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10a10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
10a20 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29  akeRecord, 1, 0)
10a30 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d  ;.      seekOp =
10a40 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20   OP_MoveGt;.    
10a50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
10a60 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
10a70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
10a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a90 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e  Op(v, OP_IdxRecn
10aa0 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20  o, base+1, 0);. 
10ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10ac0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
10ad0 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
10ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10af0 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
10b00 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
10b10 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
10b20 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
10b30 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
10b40 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
10b50 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
10b60 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
10b70 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
10b80 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
10b90 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
10ba0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
10bb0 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
10bc0 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b   cont, cont, 0);
10bd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
10be0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
10bf0 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  nt);.  sqlite3Vd
10c00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
10c10 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  ose, base, 0);. 
10c20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a   .  return 1;.}.
10c30 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61  ./*.** Analyze a
10c40 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  nd ORDER BY or G
10c50 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
10c60 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
10c70 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  ment.  Return.**
10c80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
10c90 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a  rrors seen..**.*
10ca0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  * An ORDER BY or
10cb0 20 47 52 4f 55 50 20 42 59 20 69 73 20 61 20 6c   GROUP BY is a l
10cc0 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
10cd0 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72  ns.  If any expr
10ce0 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20  ession.** is an 
10cf0 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
10d00 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78 70 72  , then that expr
10d10 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63  ession is replac
10d20 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72  ed by the.** cor
10d30 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79  responding entry
10d40 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
10d50 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
10d60 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72  t processOrderGr
10d70 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a  oupBy(.  Parse *
10d80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10d90 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10da0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
10db0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
10dc0 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
10dd0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
10de0 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
10df0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
10e00 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68  abList,    /* Th
10e10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
10e20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
10e30 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
10e40 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
10e50 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
10e60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10e70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
10e80 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f 6c 76 65  ions are involve
10e90 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
10ea0 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
10eb0 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f  Either "ORDER" o
10ec0 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70  r "GROUP", as ap
10ed0 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a  propriate */.){.
10ee0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
10ef0 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
10f00 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
10f10 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
10f20 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
10f30 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70  nt iCol;.    Exp
10f40 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
10f50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10f60 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10f70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
10f80 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20  iCol) && iCol>0 
10f90 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d  && iCol<=pEList-
10fa0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
10fb0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
10fc0 65 28 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20  e(pE);.      pE 
10fd0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10fe0 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
10ff0 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
11000 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
11010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11020 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
11030 76 65 41 6e 64 43 68 65 63 6b 28 70 50 61 72 73  veAndCheck(pPars
11040 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
11050 69 73 74 2c 20 70 45 2c 20 69 73 41 67 67 2c 20  ist, pE, isAgg, 
11060 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
11070 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
11080 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
11090 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
110a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
110b0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
110c0 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b  pE, &iCol)==0 ){
110d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
110e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
110f0 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42  .          "%s B
11100 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
11110 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
11120 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70  constants", zTyp
11130 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
11140 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
11150 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
11160 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
11170 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
11180 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11190 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
111a0 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e     "%s BY column
111b0 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
111c0 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
111d0 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
111e0 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
111f0 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c  %d", zType, iCol
11200 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
11210 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
11220 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11230 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
11240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
11250 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
11260 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
11270 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
11280 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
11290 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
112a0 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
112b0 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
112c0 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
112d0 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
112e0 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
112f0 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
11300 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
11310 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
11320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
11340 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
11350 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
11360 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
11370 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
11380 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
11390 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
113a0 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
113b0 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
113c0 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
113d0 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
113e0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
113f0 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65  as keys of table
11400 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
11410 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
11420 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
11430 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
11440 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
11450 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
11460 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65  T_Except      Re
11470 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f  move results fro
11480 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  m the temporary 
11490 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
114a0 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65  **     SRT_Table
114b0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
114c0 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  ults in temporar
114d0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
114e0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62  .** The table ab
114f0 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74  ove is incomplet
11500 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  e.  Additional e
11510 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20  Dist value have 
11520 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63  be added.** sinc
11530 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77  e this comment w
11540 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65  as written.  See
11550 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72   the selectInner
11560 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  Loop() function 
11570 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74  for.** a complet
11580 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  e listing of the
11590 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   allowed values 
115a0 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65  of eDest and the
115b0 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a  ir meanings..**.
115c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
115d0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
115e0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
115f0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
11600 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
11610 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
11620 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
11630 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
11640 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
11650 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11660 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
11670 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
11680 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
11690 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
116a0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
116b0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a  s to do that..**
116c0 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c  .** The pParent,
116d0 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20   parentTab, and 
116e0 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c  *pParentAgg fiel
116f0 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e  ds are filled in
11700 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45   if this.** SELE
11710 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79  CT is a subquery
11720 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11730 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69  may try to combi
11740 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a  ne this SELECT.*
11750 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e  * with its paren
11760 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67  t to form a sing
11770 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20  le flat query.  
11780 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20  In so doing, it 
11790 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20  might.** change 
117a0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
117b0 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72   from a non-aggr
117c0 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72  egate to an aggr
117d0 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
117e0 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  For that reason,
117f0 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20   the pParentAgg 
11800 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61  flag is passed a
11810 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  s a pointer, so 
11820 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61  it.** can be cha
11830 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  nged..**.** Exam
11840 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61  ple 1:   The mea
11850 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72  ning of the pPar
11860 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ent parameter..*
11870 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
11880 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53   FROM t1 JOIN (S
11890 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a  ELECT x, count(*
118a0 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20  ) FROM t2) JOIN 
118b0 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20  t3;.**    \     
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65   \_______ subque
118e0 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  ry _______/     
118f0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20     /.**     \   
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f     /.**      \__
11940 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11950 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
11960 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11970 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  __/.**.** This r
11980 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11990 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71   for the outer q
119a0 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f  uery first.   Fo
119b0 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20  r that call,.** 
119c0 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20  pParent will be 
119d0 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68  NULL.  During th
119e0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  e processing of 
119f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c  the outer query,
11a00 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e   this .** routin
11a10 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
11a20 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c  rsively to handl
11a30 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
11a40 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   For the recursi
11a50 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72  ve.** call, pPar
11a60 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74  ent will point t
11a70 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
11a80 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20  y.  Because the 
11a90 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74  subquery is.** t
11aa0 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
11ab0 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79  t in a three-way
11ac0 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e   join, the paren
11ad0 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77  tTab parameter w
11ae0 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65  ill.** be 1 (the
11af0 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20   2nd value of a 
11b00 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e  0-indexed array.
11b10 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
11b20 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
11b30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11b40 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
11b50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
11b60 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
11b70 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
11b80 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
11b90 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74   coded. */.  int
11ba0 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
11bb0 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
11bc0 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
11bd0 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
11be0 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
11bf0 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20   /* A parameter 
11c00 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73  used by the eDes
11c10 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  t disposal metho
11c20 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  d */.  Select *p
11c30 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a  Parent,       /*
11c40 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
11c50 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
11c60 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  s a sub-query */
11c70 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62  .  int parentTab
11c80 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ,         /* Ind
11c90 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70  ex in pParent->p
11ca0 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72  Src of this quer
11cb0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72  y */.  int *pPar
11cc0 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a  entAgg,       /*
11cd0 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
11ce0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
11cf0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  functions */.  c
11d00 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
11d10 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
11d20 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
11d30 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
11d40 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
11d50 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  i;.  WhereInfo *
11d60 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a  pWInfo;.  Vdbe *
11d70 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d  v;.  int isAgg =
11d80 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
11d90 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
11da0 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
11db0 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
11dc0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
11dd0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
11de0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
11df0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
11e00 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
11e10 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
11e20 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
11e30 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
11e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e50 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
11e60 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11e70 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
11e80 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
11e90 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
11ea0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
11eb0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
11ec0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
11ed0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
11ee0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
11ef0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
11f00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11f10 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
11f20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
11f30 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
11f40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11f50 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
11f60 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
11f70 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
11f80 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
11f90 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
11fa0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
11fb0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
11fc0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
11fd0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
11fe0 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
11ff0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
12000 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
12010 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
12020 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20  >nErr || p==0 ) 
12030 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
12040 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
12050 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
12060 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
12070 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
12080 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
12090 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
120a0 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
120b0 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
120c0 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
120d0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
120e0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
120f0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
12100 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66  Dest, iParm, aff
12110 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
12120 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
12130 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
12140 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
12150 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
12160 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57   = p->pSrc;.  pW
12170 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
12180 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
12190 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47  ->pOrderBy;.  pG
121a0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
121b0 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
121c0 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
121d0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
121e0 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
121f0 2a 20 41 6c 6c 6f 63 61 74 65 20 56 44 42 45 20  * Allocate VDBE 
12200 63 75 72 73 6f 72 73 20 66 6f 72 20 65 61 63 68  cursors for each
12210 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
12220 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
12230 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
12240 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
12250 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
12260 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
12270 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
12280 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
12290 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
122a0 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
122b0 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
122c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
122d0 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
122e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
122f0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12300 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64 20 61  ;..  /* Expand a
12310 6e 79 20 22 2a 22 20 74 65 72 6d 73 20 69 6e 20  ny "*" terms in 
12320 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
12330 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 20 74 68   (For example th
12340 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20 22 53  e "*" in.  ** "S
12350 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
12360 29 20 20 54 68 65 20 66 69 6c 6c 49 6e 43 6f 6c  )  The fillInCol
12370 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74 69 6e  umnlist() routin
12380 65 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f 6d 65  e also does some
12390 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f 75 73  .  ** other hous
123a0 65 6b 65 65 70 69 6e 67 20 2d 20 73 65 65 20 74  ekeeping - see t
123b0 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
123c0 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  t for details.. 
123d0 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e   */.  if( fillIn
123e0 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
123f0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74  e, p) ){.    got
12400 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12410 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  }.  pWhere = p->
12420 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69 73 74  pWhere;.  pEList
12430 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
12440 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
12450 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12460 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
12470 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
12480 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
12490 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
124a0 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
124b0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
124c0 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f  if( (eDest==SRT_
124d0 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
124e0 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74  T_Set) && pEList
124f0 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20  ->nExpr>1 ){.   
12500 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12510 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
12520 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
12530 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
12540 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
12550 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
12560 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
12570 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12580 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52  nd;.  }..  /* OR
12590 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
125a0 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
125b0 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
125c0 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
125d0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
125e0 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ion:.    case SR
125f0 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61  T_Except:.    ca
12600 73 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a  se SRT_Discard:.
12610 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
12620 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
12630 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
12640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12650 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
12660 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  nt, we should ha
12670 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c  ve allocated all
12680 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
12690 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74  t we.  ** need t
126a0 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72  o handle subquer
126b0 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  ys and temporary
126c0 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a   tables.  .  **.
126d0 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    ** Resolve the
126e0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
126f0 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73  d do a semantics
12700 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68   check on all th
12710 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  e expressions.. 
12720 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
12730 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
12740 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
12750 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
12760 41 6e 64 43 68 65 63 6b 28 70 50 61 72 73 65 2c  AndCheck(pParse,
12770 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45   pTabList, 0, pE
12780 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 20 20 20 31 2c 20 26 69 73 41 67 67 29        1, &isAgg)
127c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
127d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
127e0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
127f0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 41 6e 64  e3ExprResolveAnd
12800 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54  Check(pParse, pT
12810 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
12820 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b  pWhere, 0, 0) ){
12830 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
12840 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
12850 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69  pHaving ){.    i
12860 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
12870 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12880 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12890 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
128a0 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
128b0 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
128c0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
128d0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
128e0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
128f0 52 65 73 6f 6c 76 65 41 6e 64 43 68 65 63 6b 28  ResolveAndCheck(
12900 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12910 2c 20 70 45 4c 69 73 74 2c 70 48 61 76 69 6e 67  , pEList,pHaving
12920 2c 31 2c 26 69 73 41 67 67 29 20 29 7b 0a 20 20  ,1,&isAgg) ){.  
12930 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12940 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  end;.    }.  }. 
12950 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
12960 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
12970 20 70 4f 72 64 65 72 42 79 2c 20 70 54 61 62 4c   pOrderBy, pTabL
12980 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 69 73 41  ist, pEList, isA
12990 67 67 2c 20 22 4f 52 44 45 52 22 29 0a 20 20 20  gg, "ORDER").   
129a0 7c 7c 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  || processOrderG
129b0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
129c0 47 72 6f 75 70 42 79 2c 20 70 54 61 62 4c 69 73  GroupBy, pTabLis
129d0 74 2c 20 70 45 4c 69 73 74 2c 20 69 73 41 67 67  t, pEList, isAgg
129e0 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a  , "GROUP").  ){.
129f0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12a00 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  end;.  }..  /* B
12a10 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
12a20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
12a30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12a40 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
12a50 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
12a60 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65  t_end;..  /* Ide
12a70 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
12a80 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
12a90 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
12aa0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
12ab0 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
12ac0 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
12ad0 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
12ae0 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
12af0 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
12b00 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
12b10 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
12b20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
12b30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
12b40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
12b50 0a 0a 23 69 66 20 31 20 20 2f 2a 20 49 20 64 6f  ..#if 1  /* I do
12b60 20 6e 6f 74 20 74 68 69 6e 6b 20 77 65 20 6e 65   not think we ne
12b70 65 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ed the following
12b80 20 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 2e 2e   code any more..
12b90 2e 2e 20 2a 2f 0a 20 20 2f 2a 20 49 66 20 74 68  .. */.  /* If th
12ba0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
12bb0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 6e   SRT_Union, then
12bc0 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   set the number 
12bd0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  of columns in.  
12be0 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 73 20 74  ** the records t
12bf0 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
12c00 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74 65  rted into the te
12c10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 54  mporary table. T
12c20 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 63  he caller.  ** c
12c30 6f 75 6c 64 6e 27 74 20 64 6f 20 74 68 69 73 2c  ouldn't do this,
12c40 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 6c   in case the sel
12c50 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ect statement is
12c60 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20   of the form .  
12c70 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
12c80 4d 20 2e 2e 2e 2e 22 2e 20 0a 20 20 2a 2a 0a 20  M ....". .  **. 
12c90 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 64   ** We need to d
12ca0 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 77 65  o this before we
12cb0 20 73 74 61 72 74 20 69 6e 73 65 72 74 69 6e 67   start inserting
12cc0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
12cd0 65 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  e .  ** temporar
12ce0 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 68  y table (which h
12cf0 61 73 20 68 61 64 20 4f 50 5f 4b 65 79 41 73 44  as had OP_KeyAsD
12d00 61 74 61 20 65 78 65 63 75 74 65 64 20 6f 6e 20  ata executed on 
12d10 69 74 29 2c 20 62 65 63 61 75 73 65 0a 20 20 2a  it), because.  *
12d20 2a 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  * it is required
12d30 20 62 79 20 74 68 65 20 6b 65 79 20 63 6f 6d 70   by the key comp
12d40 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
12d50 20 53 6f 20 64 6f 20 69 74 20 6e 6f 77 2c 20 65   So do it now, e
12d60 76 65 6e 0a 20 20 2a 2a 20 74 68 6f 75 67 68 20  ven.  ** though 
12d70 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
12d80 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
12d90 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
12da0 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 20 20 2a   on the same.  *
12db0 2a 20 63 75 72 73 6f 72 20 6d 6f 72 65 20 74 68  * cursor more th
12dc0 61 6e 20 6f 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  an once..  */.  
12dd0 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
12de0 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  nion ){.    sqli
12df0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12e00 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
12e10 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
12e20 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e  >nExpr);.  }.#en
12e30 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
12e40 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
12e50 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
12e60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
12e70 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
12e80 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
12e90 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
12ea0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
12eb0 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  hContext = 0;.  
12ec0 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72    int needRestor
12ed0 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69  eContext;..    i
12ee0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
12ef0 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
12f00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
12f10 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12f20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  zName!=0 ){.    
12f30 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
12f40 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
12f50 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
12f60 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
12f70 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73  ontext = pTabLis
12f80 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
12f90 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
12fa0 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
12fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
12fc0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
12fd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
12fe0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12ff0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
13000 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
13010 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20  T_TempTable, .  
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13030 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
13040 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73  ursor, p, i, &is
13050 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Agg, 0);.    if(
13060 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
13070 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
13080 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
13090 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
130a0 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
130b0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
130c0 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
130d0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
130e0 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
130f0 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d  Union && eDest!=
13100 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44  SRT_Except && eD
13110 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64  est!=SRT_Discard
13120 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
13130 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
13140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
13150 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
13160 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
13170 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
13180 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
13190 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
131a0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
131b0 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
131c0 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
131d0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
131e0 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
131f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
13200 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
13210 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
13220 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
13230 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
13240 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
13250 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
13260 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
13270 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
13280 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61  subquery that ca
13290 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22  n be "flattened"
132a0 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
132b0 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65  ..  ** If flatte
132c0 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62  ning is a possib
132d0 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20  lity, do so and 
132e0 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
132f0 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ly.  .  */.  if(
13300 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72   pParent && pPar
13310 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20  entAgg &&.      
13320 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
13330 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
13340 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61   parentTab, *pPa
13350 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20  rentAgg, isAgg) 
13360 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
13370 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d   ) *pParentAgg =
13380 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
13390 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
133a0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
133b0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73  R BY clause, res
133c0 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  olve any collati
133d0 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a  on sequences.  *
133e0 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76  * names that hav
133f0 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  e been explicitl
13400 79 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  y specified..  *
13410 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
13420 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
13430 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
13440 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
13450 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
13460 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
13470 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
13480 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  i].pExpr->pColl 
13490 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  = .            s
134a0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
134b0 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64  Seq(pParse, pOrd
134c0 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  erBy->a[i].zName
134d0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
134e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
134f0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
13500 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13510 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
13520 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
13530 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70  ter..  */.  comp
13540 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
13550 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  s(pParse, p);.. 
13560 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
13570 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
13580 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
13590 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
135a0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
135b0 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
135c0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
135d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
135e0 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
135f0 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
13600 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13610 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
13620 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  s, iParm, pEList
13630 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
13640 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73   /* Do an analys
13650 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  is of aggregate 
13660 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
13670 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67  /.  sqliteAggreg
13680 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  ateInfoReset(pPa
13690 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67  rse);.  if( isAg
136a0 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b  g || pGroupBy ){
136b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
136c0 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a  rse->nAgg==0 );.
136d0 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
136e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
136f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13700 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
13710 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13720 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
13730 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
13740 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
13750 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13770 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
13780 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
13790 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
137a0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
137b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
137c0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
137d0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72  ates(pParse, pGr
137e0 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
137f0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
13800 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
13810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13820 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13830 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69   pHaving && sqli
13840 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
13850 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
13860 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
13870 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13880 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
13890 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
138a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
138b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
138c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
138d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
138e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
138f0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
13900 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
13910 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
13920 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13930 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13940 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73   }.  }..  /* Res
13950 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  et the aggregato
13960 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  r.  */.  if( isA
13970 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  gg ){.    int ad
13980 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13990 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52  AddOp(v, OP_AggR
139a0 65 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79 3f  eset, (pGroupBy?
139b0 30 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e 41  0:1), pParse->nA
139c0 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  gg);.    for(i=0
139d0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
139e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75  ; i++){.      Fu
139f0 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20  ncDef *pFunc;.  
13a00 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d      if( (pFunc =
13a10 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
13a20 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46  .pFunc)!=0 && pF
13a30 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  unc->xFinalize!=
13a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
13a50 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
13a60 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c  P_AggInit, 0, i,
13a70 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50   (char*)pFunc, P
13a80 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
13a90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13aa0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
13ab0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a      int sz = siz
13ac0 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 70  eof(KeyInfo) + p
13ad0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a 73  GroupBy->nExpr*s
13ae0 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
13af0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
13b00 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
13b10 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
13b20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  z);.      if( 0=
13b30 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  =pKey ){.       
13b40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b60 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61 72  pKey->enc = pPar
13b70 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
13b80 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
13b90 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
13ba0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
13bb0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
13bc0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13bd0 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
13be0 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
13bf0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13c00 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
13c10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
13c20 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69  ( !pKey->aColl[i
13c30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ] ){.          p
13c40 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
13c50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
13c60 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  tColl;.        }
13c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13c80 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13c90 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
13ca0 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  r *)pKey, P3_KEY
13cb0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
13cc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
13cd0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
13ce0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
13cf0 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
13d00 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
13d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d20 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
13d30 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  8, 0, 0);.    sq
13d40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13d50 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
13d60 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
13d70 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f   /* Open a tempo
13d80 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
13d90 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
13da0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
13db0 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
13dc0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
13dd0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13de0 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65      openTempInde
13df0 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73  x(pParse, p, dis
13e00 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  tinct, 0);.  }el
13e10 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
13e20 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
13e30 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
13e40 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
13e50 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
13e60 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
13e70 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
13e80 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ere, 0, .       
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20       pGroupBy ? 
13eb0 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a  0 : &pOrderBy);.
13ec0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
13ed0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
13ee0 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  d;..  /* Use the
13ef0 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
13f00 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e  loop if we are n
13f10 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a  ot dealing with.
13f20 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a    ** aggregates.
13f30 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67    */.  if( !isAg
13f40 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c  g ){.    if( sel
13f50 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
13f60 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
13f70 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
13f80 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
13f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13fa0 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e       iParm, pWIn
13fb0 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
13fc0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61  WInfo->iBreak, a
13fd0 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ff) ){.       go
13fe0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13ff0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14000 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
14010 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65 73   with aggregates
14020 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70  , then do the sp
14030 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a  ecial aggregate.
14040 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e    ** processing.
14050 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a    .  */.  else{.
14060 20 20 20 20 41 67 67 45 78 70 72 20 2a 70 41 67      AggExpr *pAg
14070 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  g;.    if( pGrou
14080 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
14090 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72   lbl1;.      for
140a0 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
140b0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
140c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
140d0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
140e0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
140f0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
14100 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e 69      /* No affini
14110 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 74 74  ty string is att
14120 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f 6c  ached to the fol
14130 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 52 65  lowing OP_MakeRe
14140 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  cord .      ** b
14150 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f 74  ecause we do not
14160 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20   need to do any 
14170 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74 61  coercion of data
14180 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  types. */.      
14190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
141a0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
141b0 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  d, pGroupBy->nEx
141c0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62  pr, 0);.      lb
141d0 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  l1 = sqlite3Vdbe
141e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
141f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14200 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f  ddOp(v, OP_AggFo
14210 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20  cus, 0, lbl1);. 
14220 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41       for(i=0, pA
14230 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b  gg=pParse->aAgg;
14240 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
14250 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20   i++, pAgg++){. 
14260 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 2d         if( pAgg-
14270 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  >isAgg ) continu
14280 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
14290 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
142a0 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72 29 3b  e, pAgg->pExpr);
142b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
142c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
142d0 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20  AggSet, 0, i);. 
142e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
142f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14300 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20  abel(v, lbl1);. 
14310 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
14320 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61  , pAgg=pParse->a
14330 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  Agg; i<pParse->n
14340 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b  Agg; i++, pAgg++
14350 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
14360 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  E;.      int nEx
14370 70 72 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  pr;.      FuncDe
14380 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
14390 66 28 20 21 70 41 67 67 2d 3e 69 73 41 67 67 20  f( !pAgg->isAgg 
143a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
143b0 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
143c0 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20  pFunc!=0 );.    
143d0 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
143e0 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20  pFunc->xStep!=0 
143f0 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
14400 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pAgg->pFunc;.   
14410 20 20 20 70 45 20 3d 20 70 41 67 67 2d 3e 70 45     pE = pAgg->pE
14420 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
14430 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
14440 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
14450 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
14460 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  N );.      nExpr
14470 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14480 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
14490 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20  e, pE->pList);. 
144a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
144b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
144c0 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
144d0 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
144e0 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
144f0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
14500 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
14510 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
14520 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26  r(j=0; !pColl &&
14530 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
14540 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
14550 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
14560 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 2d  lSeq(pParse, pE-
14570 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  >pList->a[j].pEx
14580 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
14590 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
145a0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
145b0 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
145c0 6c 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  l;.        sqlit
145d0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
145e0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
145f0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
14600 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
14610 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14620 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
14630 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c  gFunc, 0, nExpr,
14640 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
14650 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
14660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  .  }..  /* End t
14670 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
14680 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
14690 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
146a0 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Info);..  /* If 
146b0 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e  we are processin
146c0 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65  g aggregates, we
146d0 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20   need to set up 
146e0 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20  a second loop.  
146f0 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
14700 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  he aggregate val
14710 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ues and process 
14720 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  them..  */.  if(
14730 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e   isAgg ){.    in
14740 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74  t endagg = sqlit
14750 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14760 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
14770 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
14780 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  gg = sqlite3Vdbe
14790 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e  AddOp(v, OP_AggN
147a0 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b  ext, 0, endagg);
147b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
147c0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Agg = 1;.    if(
147d0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
147e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
147f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
14800 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20  ving, startagg, 
14810 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
14820 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
14830 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
14840 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
14850 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
14860 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
14870 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
14880 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67   startagg, endag
14890 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20  g, aff) ){.     
148a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
148b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
148c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
148d0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72  OP_Goto, 0, star
148e0 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  tagg);.    sqlit
148f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14900 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
14910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14920 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
14930 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
14940 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
14950 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
14960 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
14970 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
14980 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
14990 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
149a0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
149b0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
149c0 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
149d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
149e0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
149f0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
14a00 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
14a10 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
14a20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14a30 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
14a40 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
14a50 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
14a60 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
14a70 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
14a80 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74 68  e.  So delete th
14a90 65 20 73 75 62 71 75 65 72 79 20 73 74 72 75 63  e subquery struc
14aa0 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ture from the pa
14ab0 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65  rent.  ** to pre
14ac0 76 65 6e 74 20 74 68 69 73 20 73 75 62 71 75 65  vent this subque
14ad0 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76  ry from being ev
14ae0 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e  aluated again an
14af0 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a 20  d to force the. 
14b00 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 74   ** the use of t
14b10 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
14b20 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
14b30 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  Parent ){.    as
14b40 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
14b50 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74  Src->nSrc>parent
14b60 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Tab );.    asser
14b70 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
14b80 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
14b90 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20  Select==p );.   
14ba0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14bb0 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61  lete(p);.    pPa
14bc0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
14bd0 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
14be0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
14bf0 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
14c00 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
14c10 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
14c20 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
14c30 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
14c40 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
14c50 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
14c60 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
14c70 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
14c80 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
14c90 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
14ca0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
14cb0 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
14cc0 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
14cd0 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67  _end:.  sqliteAg
14ce0 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
14cf0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
14d00 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.