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

Artifact b8d0a8325552e46bf295ccfdad54668404fad88b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 39 39  select.c,v 1.199
0200: 20 32 30 30 34 2f 30 37 2f 31 39 20 32 33 3a 33   2004/07/19 23:3
0210: 38 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a 2a  8:11 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0a00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0a10: 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20 69 6e 74  Keyword;.    int
0a20: 20 6e 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20   nChar;.    int 
0a30: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0a40: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0a50: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0a60: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0a70: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0a80: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0a90: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0aa0: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0ab0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ac0: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0ad0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0ae0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0af0: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0b00: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0b10: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0b20: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0b30: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0b40: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d   JT_INNER },.  }
0b50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
0b60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
0b70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
0b80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
0b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
0ba0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
0bb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
0bc0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
0bd0: 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ; j<sizeof(keywo
0be0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0bf0: 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a  ords[0]); j++){.
0c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
0c10: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
0c20: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
0c30: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
0c40: 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a  p->z, keywords[j
0c50: 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e  ].zKeyword, p->n
0c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
0c70: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77  jointype |= keyw
0c80: 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  ords[j].code;.  
0c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0ca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0cb0: 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79  f( j>=sizeof(key
0cc0: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
0cd0: 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20  ywords[0]) ){.  
0ce0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0cf0: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
0d00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0d10: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
0d20: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
0d30: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
0d40: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0d50: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
0d60: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
0d70: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 73 74 61 74  =0.  ){.    stat
0d80: 69 63 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 20 3d  ic Token dummy =
0d90: 20 7b 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 63   { 0, 0 };.    c
0da0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 2c  har *zSp1 = " ",
0db0: 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20   *zSp2 = " ";.  
0dc0: 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 70    if( pB==0 ){ p
0dd0: 42 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 31  B = &dummy; zSp1
0de0: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 69 66 28 20   = 0; }.    if( 
0df0: 70 43 3d 3d 30 20 29 7b 20 70 43 20 3d 20 26 64  pC==0 ){ pC = &d
0e00: 75 6d 6d 79 3b 20 7a 53 70 32 20 3d 20 30 3b 20  ummy; zSp2 = 0; 
0e10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  }.    sqlite3Set
0e20: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
0e30: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
0e40: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
0e50: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 2c 20  d join type: ", 
0e60: 30 2c 0a 20 20 20 20 20 20 20 70 41 2d 3e 7a 2c  0,.       pA->z,
0e70: 20 70 41 2d 3e 6e 2c 20 7a 53 70 31 2c 20 31 2c   pA->n, zSp1, 1,
0e80: 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e 6e 2c 20 7a   pB->z, pB->n, z
0e90: 53 70 32 2c 20 31 2c 20 70 43 2d 3e 7a 2c 20 70  Sp2, 1, pC->z, p
0ea0: 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  C->n, 0);.    pP
0eb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0ec0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0ed0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
0ee0: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
0ef0: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
0f00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0f10: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
0f20: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
0f30: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
0f40: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
0f50: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
0f60: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
0f80: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
0f90: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
0fa0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
0fb0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
0fc0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
0fd0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
0fe0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
0ff0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1000: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1010: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1020: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1050: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1060: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1070: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1080: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1090: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
10a0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
10b0: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
10c0: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
10d0: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
10e0: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
10f0: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
1100: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
1110: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
1120: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
1130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1140: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63  ddWhereTerm(.  c
1150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1180: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1190: 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46  pTab1,      /* F
11a0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
11b0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11c0: 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  b2,      /* Seco
11d0: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  nd table */.  Ex
11e0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
11f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1200: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1210: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1220: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  on */.){.  Token
1230: 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a   dummy;.  Expr *
1240: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1250: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1260: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1270: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 64    Expr *pE;..  d
1280: 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b 0a 20  ummy.z = zCol;. 
1290: 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65   dummy.n = strle
12a0: 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d 6d 79  n(zCol);.  dummy
12b0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45 31 61  .dyn = 0;.  pE1a
12c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
12d0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
12e0: 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71  my);.  pE2a = sq
12f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1300: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1310: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1320: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1330: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1340: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1350: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1360: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1370: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
1380: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
1390: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
13a0: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
13b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13c0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13d0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13f0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1400: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1410: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1420: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1430: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1440: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1450: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1460: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1470: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66  _FromJoin);.  if
1480: 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20  ( *ppExpr ){.   
1490: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
14a0: 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a  e3Expr(TK_AND, *
14b0: 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a  ppExpr, pE, 0);.
14c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
14d0: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d  Expr = pE;.  }.}
14e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1500: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
1510: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
1520: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1530: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1540: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1550: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1560: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1570: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1580: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1590: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
15a0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
15b0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
15c0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
15d0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
15e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
15f0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1600: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1610: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
1620: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
1630: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
1640: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
1650: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
1660: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
1670: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1680: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1690: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
16a0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
16b0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  NG clause..*/.st
16c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
16d0: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  nExpr(Expr *p){.
16e0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
16f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1700: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
1710: 29 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  );.    setJoinEx
1720: 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
1730: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
1740: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
1750: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
1760: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
1770: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
1780: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1790: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
17a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
17b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
17c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
17d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
17e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
17f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
1800: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
1810: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  erms..**.** This
1820: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1830: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1840: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
1850: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1860: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1870: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
1880: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1890: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
18a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72   int i, j;.  pSr
18b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  c = p->pSrc;.  f
18c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
18d0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  nSrc-1; i++){.  
18e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18f0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26  _item *pTerm = &
1900: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
1910: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1920: 74 65 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  tem *pOther = &p
1930: 53 72 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20  Src->a[i+1];..  
1940: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61    if( pTerm->pTa
1950: 62 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  b==0 || pOther->
1960: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
1970: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
1980: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
1990: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
19a0: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
19b0: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
19c0: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
19d0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
19e0: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
19f0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1a00: 66 28 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79  f( pTerm->jointy
1a10: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
1a20: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1a30: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1a40: 70 54 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54  pTerm->pOn || pT
1a50: 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  erm->pUsing ){. 
1a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a80: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
1a90: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
1aa0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
1ab0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
1ac0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
1ad0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1ae0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 65        pTab = pTe
1af0: 72 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  rm->pTab;.      
1b00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1b10: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1b20: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
1b30: 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61  ndex(pOther->pTa
1b40: 62 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  b, pTab->aCol[j]
1b50: 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20  .zName)>=0 ){.  
1b60: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
1b70: 54 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  Term(pTab->aCol[
1b80: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20  j].zName, pTab, 
1b90: 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70  pOther->pTab, &p
1ba0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
1bb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
1bd0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
1be0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
1bf0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
1c00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1c10: 65 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72  erm->pOn && pTer
1c20: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1c30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c40: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1c50: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
1c60: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
1c70: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
1c80: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
1c90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1cb0: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
1cc0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1cd0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
1ce0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
1cf0: 20 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65    ** and AND ope
1d00: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
1d10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1d20: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
1d30: 6e 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e  nExpr(pTerm->pOn
1d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1d50: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
1d60: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
1d70: 20 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20   pTerm->pOn;.   
1d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d90: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
1da0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1db0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65  , p->pWhere, pTe
1dc0: 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20  rm->pOn, 0);.   
1dd0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
1de0: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
1df0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1e00: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
1e10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
1e30: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
1e40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
1e50: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
1e60: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
1e70: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
1e80: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
1e90: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
1ea0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
1eb0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
1ec0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
1ee0: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
1ef0: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
1f00: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
1f10: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
1f20: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
1f30: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
1f40: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
1f50: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1f60: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
1f70: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
1f80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1f90: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
1fa0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b    IdList *pList;
1fb0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1fc0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 53      assert( i<pS
1fd0: 72 63 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20  rc->nSrc-1 );.  
1fe0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72      pList = pTer
1ff0: 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  m->pUsing;.     
2000: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
2010: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
2020: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
2030: 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61  Index(pTerm->pTa
2040: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  b, pList->a[j].z
2050: 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20  Name)<0 ||.     
2060: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
2070: 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c  ex(pOther->pTab,
2080: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
2090: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
20a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20b0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
20c0: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
20d0: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
20e0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
20f0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2100: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 70 4c 69  oth tables", pLi
2110: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  st->a[j].zName);
2120: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2130: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2140: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2150: 65 72 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  erm(pList->a[j].
2160: 7a 4e 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54  zName, pTerm->pT
2170: 61 62 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62  ab, pOther->pTab
2180: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21b0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
21c0: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
21d0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
21e0: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
21f0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2200: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2210: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
2220: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2230: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  n;.  sqlite3Expr
2240: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2250: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2260: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2270: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
2280: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2290: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
22a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
22b0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
22c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
22d0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22f0: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
2300: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
2310: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
2320: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  rior);.  sqliteF
2330: 72 65 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b  ree(p->zSelect);
2340: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
2350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2360: 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2370: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2380: 20 74 68 65 20 70 61 72 73 65 20 73 74 72 75 63   the parse struc
2390: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
23a0: 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72 65  void sqliteAggre
23b0: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61  gateInfoReset(Pa
23c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23d0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73  sqliteFree(pPars
23e0: 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72  e->aAgg);.  pPar
23f0: 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20  se->aAgg = 0;.  
2400: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
2410: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41  ;.  pParse->useA
2420: 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
2430: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2440: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2450: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2460: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2470: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2480: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
2490: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
24a0: 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20  ntoSorter(Parse 
24b0: 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76  *pParse, Vdbe *v
24c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64  , ExprList *pOrd
24d0: 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erBy){.  int i;.
24e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
24f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
2500: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
2510: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2520: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2530: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Expr);.  }.  sql
2540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2550: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2560: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c  pOrderBy->nExpr,
2570: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
2590: 72 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  rtPut, 0, 0);.}.
25a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
25b0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
25c0: 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49   OFFSET and LIMI
25d0: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
25e0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20 20   codeLimiter(.  
25f0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
2600: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2610: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
2620: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2630: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2640: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2650: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
2660: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
2670: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2680: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
2690: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  nt record */.  i
26a0: 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20  nt iBreak,      
26b0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
26c0: 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f   end the loop */
26d0: 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20  .  int nPop     
26e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26f0: 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73  f times to pop s
2700: 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e  tack when jumpin
2710: 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  g */.){.  if( p-
2720: 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20  >iOffset>=0 ){. 
2730: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
2740: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2750: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
2760: 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61 64   if( nPop>0 ) ad
2770: 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr++;.    sqlite
2780: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2790: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66  _MemIncr, p->iOf
27a0: 66 73 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20  fset, addr);.   
27b0: 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20   if( nPop>0 ){. 
27c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
27e0: 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d   nPop, 0);.    }
27f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2800: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
2810: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
2820: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c  .  }.  if( p->iL
2830: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  imit>=0 ){.    s
2840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2850: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
2860: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
2870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
2890: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
28a0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
28b0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
28c0: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
28d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
28e0: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
28f0: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
2900: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
2910: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
2920: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
2930: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
2940: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
2950: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
2960: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
2970: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
2980: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
2990: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
29a0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
29b0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
29c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
29e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
29f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2a00: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2a10: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
2a40: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
2a50: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
2a60: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2a70: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
2a80: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
2a90: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
2aa0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
2ab0: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
2ac0: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
2ad0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
2ae0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
2af0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2b00: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
2b10: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
2b20: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2b30: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
2b40: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
2b50: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
2b60: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
2b70: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
2b80: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
2b90: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
2ba0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
2bb0: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
2bc0: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
2bd0: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
2be0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
2bf0: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
2c00: 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d       /* An argum
2c10: 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f  ent to the dispo
2c20: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
2c30: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
2c40: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
2c50: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
2c60: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
2c70: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20  /.  int iBreak, 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
2c90: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
2ca0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
2cb0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61  er loop */.  cha
2cc0: 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
2cd0: 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79       /* affinity
2ce0: 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74   string if eDest
2cf0: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f   is SRT_Union */
2d00: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
2d10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2d20: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
2d30: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
2d40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2d50: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
2d60: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
2d70: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2d80: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
2d90: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
2da0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
2db0: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
2dc0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
2dd0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
2de0: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
2df0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
2e00: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
2e10: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73  tput..  */.  has
2e20: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
2e30: 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74  nct>=0 && pEList
2e40: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
2e50: 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  r>0;.  if( pOrde
2e60: 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69  rBy==0 && !hasDi
2e70: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f  stinct ){.    co
2e80: 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20  deLimiter(v, p, 
2e90: 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61  iContinue, iBrea
2ea0: 6b 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k, 0);.  }..  /*
2eb0: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
2ec0: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
2ed0: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
2ee0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
2ef0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
2f00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2f10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f20: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
2f30: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
2f40: 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  e{.    nColumn =
2f50: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
2f60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2f70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
2f80: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2f90: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2fa0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
2fb0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2fc0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
2fd0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
2fe0: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
2ff0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3000: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
3010: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
3020: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
3030: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
3040: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
3050: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
3060: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
3070: 69 6e 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c  inct ){.#if NULL
3080: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
30b0: 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78  ll, -pEList->nEx
30c0: 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  pr, sqlite3VdbeC
30d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29  urrentAddr(v)+7)
30e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
30f0: 44 65 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61  Deliberately lea
3100: 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ve the affinity 
3110: 73 74 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68  string off of th
3120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
3130: 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  ** OP_MakeRecord
3140: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
3150: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3160: 61 6b 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73  akeRecord, pELis
3170: 74 2d 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30  t->nExpr * -1, 0
3180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3190: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69  beAddOp(v, OP_Di
31a0: 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74  stinct, distinct
31b0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
31c0: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
31d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
31f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c  pEList->nExpr+1,
3200: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3220: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
3230: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
3240: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3250: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3270: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3280: 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  rKey, distinct, 
3290: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  0);.    if( pOrd
32a0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
32b0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20   codeLimiter(v, 
32c0: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42  p, iContinue, iB
32d0: 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  reak, nColumn);.
32e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
32f0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
3300: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
3310: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
3320: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
3330: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
3340: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
3350: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
3360: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  /.    case SRT_U
3370: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71  nion: {.      sq
3380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3390: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
33a0: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
33b0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
33c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
33e0: 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43  , aff, P3_STATIC
33f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3400: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3410: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
3420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3440: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
3450: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3460: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
3470: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
3480: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
3490: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
34a0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
34b0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
34c0: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
34d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
34f0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
3500: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
3510: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
3520: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3530: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3540: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3570: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
3580: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35a0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
35b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
35c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
35d0: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
35e0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
35f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3600: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
3610: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
3620: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
3630: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
3640: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
3650: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
3660: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
3670: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
3680: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
3690: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
36a0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
36b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
36c0: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
36d0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
36e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
36f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
3700: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3710: 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  n, NULL_ALWAYS_D
3720: 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20  ISTINCT);.      
3730: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3740: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
3750: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3770: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
3780: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
3790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
37b0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
37c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
37d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
37e0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
37f0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
3800: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
3810: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
3820: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
3830: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
3840: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
3850: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
3860: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
3870: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
3880: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
3890: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
38a0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
38b0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d       int addr1 =
38c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
38d0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
38e0: 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20    int addr2;..  
38f0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
3900: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
3910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3920: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
3930: 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20  -1, addr1+3);.  
3940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3950: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3960: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  1, 0);.      add
3970: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
3980: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
3990: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
39a0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
39b0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
39c0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
39d0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
39e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
39f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66   char const *aff
3a00: 53 74 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61  Str;.        cha
3a10: 72 20 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e  r aff = (iParm>>
3a20: 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20  16)&0xFF;.      
3a30: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
3a40: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
3a50: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
3a60: 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  r, aff);.       
3a70: 20 61 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65   affStr = sqlite
3a80: 33 41 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28  3AffinityString(
3a90: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  aff);.        sq
3aa0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
3ab0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
3ac0: 2c 20 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f  , 0, affStr, P3_
3ad0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
3ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3af0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
3b00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b20: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
3b30: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
3b40: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
3b50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
3b60: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
3b70: 64 64 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62  ddr2, sqlite3Vdb
3b80: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3b90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ba0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3bb0: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
3bc0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
3bd0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
3be0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
3bf0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
3c00: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
3c10: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
3c20: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
3c30: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
3c40: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
3c50: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
3c60: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3c70: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3c80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3c90: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3ca0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3cb0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3cc0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3cd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3ce0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3cf0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
3d00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
3d10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3d20: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
3d30: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  reak);.      }. 
3d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d50: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  }..    /* Send t
3d60: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
3d70: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
3d80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3d90: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a  e SRT_Callback:.
3da0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72      case SRT_Sor
3db0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ter: {.      if(
3dc0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3de0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3df0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3e00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
3e10: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3e20: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3e30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3e40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
3e50: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
3e60: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ck );.        sq
3e70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3e80: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
3e90: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
3ea0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3eb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
3ec0: 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69  nvoke a subrouti
3ed0: 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ne to handle the
3ee0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73   results.  The s
3ef0: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
3f00: 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f  .    ** is respo
3f10: 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69  nsible for poppi
3f20: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
3f30: 66 66 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  ff of the stack.
3f40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3f50: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
3f60: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
3f70: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f90: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3fa0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
3fb0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3fc0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3fd0: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3ff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4000: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
4010: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
4020: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4030: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
4040: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
4050: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
4060: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
4070: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
4080: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
4090: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
40a0: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
40b0: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
40c0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
40d0: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
40e0: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
40f0: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
4100: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
4110: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
4120: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
4130: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
4140: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
4160: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
4170: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4190: 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  _Pop, nColumn, 0
41a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
41b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
41c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
41d0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
41e0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
41f0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
4200: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
4210: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
4220: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
4230: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
4240: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
4250: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
4260: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
4270: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
4280: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
4290: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
42a0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
42b0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
42c0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
42d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
42e0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
42f0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
4300: 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  rse,   /* The pa
4310: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
4320: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4330: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
4340: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
4350: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
4360: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
4370: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
4380: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
4390: 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  mn,     /* Numbe
43a0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
43b0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44  data */.  int eD
43c0: 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  est,       /* Wr
43d0: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
43e0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
43f0: 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20   int iParm      
4400: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61    /* Optional pa
4410: 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74  rameter associat
4420: 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f  ed with eDest */
4430: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d  .){.  int end1 =
4440: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4450: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
4460: 65 6e 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  end2 = sqlite3Vd
4470: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4480: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65    int addr;.  Ke
4490: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
44a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
44b0: 42 79 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20  By;.  int nCol, 
44c0: 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  i;.  sqlite *db 
44d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
44e0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
44f0: 53 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b  Sorter ) return;
4500: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
4510: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f  >pOrderBy;.  nCo
4520: 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  l = pOrderBy->nE
4530: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
4540: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
4550: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43  eof(*pInfo) + nC
4560: 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ol*(sizeof(CollS
4570: 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28  eq*)+1) );.  if(
4580: 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75   pInfo==0 ) retu
4590: 72 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f  rn;.  pInfo->aSo
45a0: 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a  rtOrder = (char*
45b0: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
45c0: 43 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  Col];.  pInfo->n
45d0: 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20  Field = nCol;.  
45e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
45f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66   i++){.    /* If
4600: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
4610: 75 65 6e 63 65 20 77 61 73 20 73 70 65 63 69 66  uence was specif
4620: 69 65 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74  ied explicity, t
4630: 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73  hen it.    ** is
4640: 20 73 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65   stored in pOrde
4650: 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e  rBy->a[i].zName.
4660: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
4670: 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20  the default.    
4680: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
4690: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
46a0: 73 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sion..    */.   
46b0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
46c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
46d0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f  llSeq(pParse, pO
46e0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
46f0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49  pr);.    if( !pI
4700: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
4710: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
4720: 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66  oll[i] = db->pDf
4730: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
4740: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
4750: 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
4760: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
4770: 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
4780: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  VdbeOp3(v, OP_So
4790: 72 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a  rt, 0, 0, (char*
47a0: 29 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  )pInfo, P3_KEYIN
47b0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61  FO_HANDOFF);.  a
47c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
47d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
47e0: 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b  tNext, 0, end1);
47f0: 0a 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76  .  codeLimiter(v
4800: 2c 20 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c  , p, addr, end2,
4810: 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65   1);.  switch( e
4820: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
4830: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
4840: 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62  case SRT_TempTab
4850: 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  le: {.      sqli
4860: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4870: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
4880: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  rm, 0);.      sq
4890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
48a0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
48b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
48c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
48d0: 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c  utIntKey, iParm,
48e0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
48f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4900: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
4910: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
4920: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
4930: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4940: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
4950: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
4960: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
4970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4980: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4990: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
49a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
49b0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
49c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
49d0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
49e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
49f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4a00: 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50  rd, 1, 0, "n", P
4a10: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
4a20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a30: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
4a40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
4a50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4a60: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
4a70: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
4a80: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  F), 0);.      br
4a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4aa0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4ac0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ae0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
4af0: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
4b00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4b10: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4b20: 30 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20  0, end1);.      
4b30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4b40: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4b50: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
4b60: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
4b70: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4b90: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4ba0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
4bb0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
4bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4bd0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
4be0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4bf0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
4c00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4c10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4c20: 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69  _Column, -1-i, i
4c30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4c40: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
4c50: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
4c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
4c80: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
4c90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4cc0: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
4cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4cf0: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
4d00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d10: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4d20: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
4d30: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
4d40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4d50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4d60: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4d70: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
4d80: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
4d90: 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20  bel(v, end2);.  
4da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4db0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4dd0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4de0: 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  end1);.  sqlite3
4df0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4e00: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
4e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4e20: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
4e30: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
4e40: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
4e50: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
4e60: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
4e70: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
4e80: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
4e90: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
4ea0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
4eb0: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
4ec0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
4ed0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
4ee0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
4ef0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
4f00: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
4f10: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
4f20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4f30: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
4f40: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
4f50: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
4f60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
4f70: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
4f80: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
4f90: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
4fa0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
4fb0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
4fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4fd0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
4fe0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4ff0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
5000: 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  st, Expr *pExpr)
5010: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
5020: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
5030: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
5040: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20  | pTabList==0 ) 
5050: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69  return 0;..  swi
5060: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5070: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
5080: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61  LUMN: {.      Ta
5090: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
50a0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
50b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
50c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
50d0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
50e0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
50f0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
5100: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
5110: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
5120: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
5130: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
5140: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
5150: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5160: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
5170: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
5180: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
5190: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
51a0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
51b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
51c0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  <0 ){.        zT
51d0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
51e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
51f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
5200: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5210: 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Type;.      }.  
5220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5230: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
5240: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
5250: 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65  olumnType(pParse
5260: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 78 70  , pTabList, pExp
5270: 72 2d 3e 70 4c 65 66 74 29 3b 20 0a 20 20 20 20  r->pLeft); .    
5280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5290: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
52a0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
52b0: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
52c0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
52d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73  columnType(pPars
52e0: 65 2c 20 70 53 2d 3e 70 53 72 63 2c 20 70 53 2d  e, pS->pSrc, pS-
52f0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
5300: 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65  xpr); .      bre
5310: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5320: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79  fault:.      zTy
5330: 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20  pe = 0;.  }.  . 
5340: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
5350: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5360: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
5370: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
5380: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5390: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
53a0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
53b0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
53c0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
53d0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
53e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
53f0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
5400: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
5410: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
5420: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
5430: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5440: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5450: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5460: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5470: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5480: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5490: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
54a0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
54b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
54c0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
54d0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
54e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
54f0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61  = columnType(pPa
5500: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
5510: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
5520: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5530: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
5540: 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f  must make it's o
5550: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
5560: 6f 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63  olumn-type, in c
5570: 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
5580: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
5590: 62 65 66 6f 72 65 20 74 68 69 73 20 76 69 72 74  before this virt
55a0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
55b0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
55c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
55d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45  tColName(v, i+pE
55e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79  List->nExpr, zTy
55f0: 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65  pe, strlen(zType
5600: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
5610: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5620: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
5630: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
5640: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
5650: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
5660: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
5670: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
5680: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
5690: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
56a0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
56b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
56c0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
56d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
56e0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
56f0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5700: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5710: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
5720: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
5730: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
5740: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
5750: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
5760: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
5770: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5780: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
5790: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
57a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
57b0: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
57c0: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20  ortNames;..  /* 
57d0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
57e0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
57f0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
5800: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
5810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
5820: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  }..  assert( v!=
5830: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  0 );.  if( pPars
5840: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
5850: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5860: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5870: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
5880: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5890: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
58a0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
58b0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
58c0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
58d0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
58e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
58f0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
5900: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
5910: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
5920: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
5930: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5940: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5950: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
5960: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
5970: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
5980: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5990: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
59a0: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
59b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
59c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
59d0: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
59e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
59f0: 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  v, i, zName, str
5a00: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
5a10: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5a20: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
5a30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
5a40: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
5a50: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5a60: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
5a70: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
5a80: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
5a90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
5aa0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
5ab0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
5ac0: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
5ad0: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
5ae0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
5af0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
5b00: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
5b10: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
5b20: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5b30: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
5b40: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
5b50: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
5b60: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5b70: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
5b80: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5b90: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
5ba0: 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20  = "_ROWID_";.   
5bb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5bc0: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
5bd0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
5be0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5bf0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
5c00: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20  & !fullNames && 
5c10: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
5c20: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
5c50: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
5c60: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
5c70: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
5c80: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
5c90: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
5ca0: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
5cb0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5cc0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
5cd0: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
5ce0: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
5cf0: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
5d00: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
5d10: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
5d20: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
5d30: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
5d40: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
5d50: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
5d60: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
5d70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5d80: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
5d90: 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49  zName, P3_DYNAMI
5da0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
5db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5dc0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
5dd0: 2c 20 69 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  , i, zCol, 0);. 
5de0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5df0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
5e00: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
5e10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5e20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5e30: 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70   i, p->span.z, p
5e40: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
5e50: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
5e60: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
5e70: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
5e80: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
5e90: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
5ea0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
5eb0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
5ec0: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
5ed0: 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c    sprintf(zName,
5ee0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
5ef0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f00: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
5f10: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , i, zName, 0);.
5f20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
5f30: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
5f40: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
5f50: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
5f60: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
5f70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
5f80: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
5f90: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
5fa0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5fb0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
5fc0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
5fd0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
5fe0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
5ff0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
6000: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
6010: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6020: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
6030: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
6040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6050: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
6060: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
6070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6080: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
6090: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
60a0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
60b0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
60c0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
60d0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
60e0: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
60f0: 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  List(Parse*, Sel
6100: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
6110: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6120: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6130: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
6140: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
6150: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
6160: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
6170: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
6180: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
6190: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
61a0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
61b0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
61c0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
61d0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
61e0: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
61f0: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
6200: 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69  *aCol;..  if( fi
6210: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
6220: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
6230: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6240: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
6250: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6260: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
6270: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6280: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6290: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
62a0: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
62b0: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
62c0: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
62d0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
62e0: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
62f0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6300: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
6310: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
6320: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
6330: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
6340: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
6350: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
6360: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6370: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
6380: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 3b 0a  {.    Expr *pR;.
6390: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
63a0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
63b0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
63c0: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  r;.    if( pELis
63d0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
63e0: 0a 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a  .      aCol[i].z
63f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
6400: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  Dup(pEList->a[i]
6410: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  .zName);.    }el
6420: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
6430: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
6440: 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70       && (pR=p->p
6450: 52 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d  Right)!=0 && pR-
6460: 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e  >token.z && pR->
6470: 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  token.z[0] ){.  
6480: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
6490: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
64a0: 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e  ring(&aCol[i].zN
64b0: 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  ame, pR->token.z
64c0: 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  , pR->token.n, 0
64d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 63  );.      for(j=c
64e0: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
64f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
6500: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
6510: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b  [j].zName, aCol[
6520: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
6530: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
6540: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
6550: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
6560: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
6570: 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20  ,"_%d",++cnt);. 
6580: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72           n = str
6590: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  len(zBuf);.     
65a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e       sqlite3SetN
65b0: 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e  String(&aCol[i].
65c0: 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e  zName, pR->token
65d0: 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c  .z, pR->token.n,
65e0: 20 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20 20   zBuf,n,0);.    
65f0: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
6600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6620: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
6630: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
6640: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
6650: 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  ng(&pTab->aCol[i
6660: 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e  ].zName, p->span
6670: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30  .z, p->span.n, 0
6680: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6690: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
66a0: 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ];.      sprintf
66b0: 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64  (zBuf, "column%d
66c0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70  ", i+1);.      p
66d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
66e0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
66f0: 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 0a  p(zBuf);.    }..
6700: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
6710: 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54  teStrDup(columnT
6720: 79 70 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ype(pParse, pSel
6730: 65 63 74 2d 3e 70 53 72 63 20 2c 70 29 29 3b 0a  ect->pSrc ,p));.
6740: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
6750: 5d 2e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b  ].zType = zType;
6760: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
6770: 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  i].affinity = SQ
6780: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
6790: 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
67a0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  ){.      pTab->a
67b0: 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79 20  Col[i].affinity 
67c0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
67d0: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 73 74 72  yType(zType, str
67e0: 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 20  len(zType));.   
67f0: 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f   }.    pTab->aCo
6800: 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 73 71 6c  l[i].pColl = sql
6810: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
6820: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
6830: 69 66 28 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b  if( !pTab->aCol[
6840: 69 5d 2e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  i].pColl ){.    
6850: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
6860: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
6870: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
6880: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
6890: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72  >iPKey = -1;.  r
68a0: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
68b0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76  *.** For the giv
68c0: 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
68d0: 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74 68  ent, do three th
68e0: 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings..**.**    (
68f0: 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  1)  Fill in the 
6900: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
6910: 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
6920: 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
6930: 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
6940: 73 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  s the set of tab
6950: 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  les that should 
6960: 62 65 20 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72  be scanned.  For
6970: 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20   views,.**      
6980: 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
6990: 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
69a0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
69b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
69c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
69d0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
69e0: 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
69f0: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
6a00: 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
6a10: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
6a20: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
6a30: 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
6a40: 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
6a50: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
6a60: 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
6a70: 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
6a80: 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
6a90: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
6aa0: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
6ab0: 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
6ac0: 20 20 20 28 32 29 20 20 41 64 64 20 74 65 72 6d     (2)  Add term
6ad0: 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
6ae0: 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
6af0: 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
6b00: 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
6b10: 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
6b20: 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
6b30: 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
6b40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
6b50: 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
6b60: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
6b70: 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
6b80: 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
6b90: 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
6ba0: 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
6bb0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
6bc0: 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
6bd0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
6be0: 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
6bf0: 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
6c00: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
6c10: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
6c20: 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
6c30: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6c40: 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
6c50: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  ** Return 0 on s
6c60: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72  uccess.  If ther
6c70: 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20  e are problems, 
6c80: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
6c90: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
6ca0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
6cb0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
6cc0: 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c  ic int fillInCol
6cd0: 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70  umnList(Parse *p
6ce0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
6cf0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
6d00: 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20  , rc;.  SrcList 
6d10: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
6d20: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
6d30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20   Table *pTab;.. 
6d40: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
6d50: 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSrc==0 ) return
6d60: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
6d70: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
6d80: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
6d90: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
6da0: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ery table in the
6db0: 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a   table list..  *
6dc0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
6dd0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
6de0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
6df0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
6e00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
6e10: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
6e20: 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65  n before!  No ne
6e30: 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a  ed to continue *
6e40: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
6e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6e70: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
6e80: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
6e90: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
6ea0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
6eb0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
6ec0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6ed0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
6ee0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6ef0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20  >a[i].zAlias==0 
6f00: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6f10: 7a 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20  zFakeName[60];. 
6f20: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
6f30: 46 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74  FakeName, "sqlit
6f40: 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
6f60: 64 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  d*)pTabList->a[i
6f70: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
6f80: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
6f90: 72 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d 3e  ring(&pTabList->
6fa0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61  a[i].zAlias, zFa
6fb0: 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  keName, 0);.    
6fc0: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c 69    }.      pTabLi
6fd0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
6fe0: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
6ff0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
7000: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
7010: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
7020: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7060: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
7070: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
70a0: 20 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74   The isTransient
70b0: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
70c0: 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73  that the Table s
70d0: 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
70e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d  n.      ** dynam
70f0: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
7100: 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65   and may be free
7110: 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20  d at any time.  
7120: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
7130: 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73        ** pTab is
7140: 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
7150: 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61   a persistent ta
7160: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
7170: 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20  at defines.     
7180: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
7190: 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20  schema. */.     
71a0: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
71b0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  nt = 1;.    }els
71c0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
71d0: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
71e0: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
71f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7200: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
7210: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
7220: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
7230: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
7240: 70 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2d  pParse,pTabList-
7250: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62  >a[i].zName,pTab
7260: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  List->a[i].zData
7270: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
7280: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
7290: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
72a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
72b0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
72c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
72d0: 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
72e0: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
72f0: 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
7300: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
7310: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
7320: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
7330: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
7340: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7360: 2f 2a 20 49 66 20 70 54 61 62 4c 69 73 74 2d 3e  /* If pTabList->
7370: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20  a[i].pSelect!=0 
7380: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
7390: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
73a0: 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
73b0: 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
73c0: 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
73d0: 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
73e0: 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
73f0: 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
7400: 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
7410: 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
7420: 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
7430: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
7440: 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
7450: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7460: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7470: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
7480: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7490: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
74a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
74b0: 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b  (pTab->pSelect);
74c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
74d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
74e0: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
74f0: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
7500: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7510: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
7520: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
7530: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
7540: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
7550: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
7560: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
7570: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
7580: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
7590: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
75a0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
75b0: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
75c0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
75d0: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
75e0: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
75f0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
7600: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
7610: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
7620: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
7630: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
7640: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
7650: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
7660: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
7670: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
7680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
7690: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
76a0: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
76b0: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
76c0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
76d0: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
76e0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
76f0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
7700: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
7710: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
7720: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
7730: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
7740: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
7750: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
7760: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
7770: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
7780: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
7790: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
77a0: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
77b0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
77c0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
77d0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
77e0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
77f0: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
7800: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
7810: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
7820: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
7830: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
7840: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
7850: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
7860: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
7870: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
7880: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
7890: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
78a0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
78b0: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
78c0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
78d0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
78e0: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
78f0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7900: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
7910: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
7920: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
7930: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
7940: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
7950: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
7960: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
7970: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
7980: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
7990: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
79a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
79b0: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
79c0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
79d0: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
79e0: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
79f0: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
7a00: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
7a10: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
7a20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
7a30: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
7a40: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
7a50: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
7a60: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
7a70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
7a80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7a90: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61  stAppend(pNew, a
7aa0: 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
7ab0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
7ac0: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
7ad0: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
7ae0: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  ;.        a[k].p
7af0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
7b00: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
7b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b20: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
7b30: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
7b40: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
7b50: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
7b60: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
7b70: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
7b80: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
7b90: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
7ba0: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
7bb0: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
7bc0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65      Token *pName
7bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  ;           /* t
7be0: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
7bf0: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
7c00: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
7c10: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61  ){.          pNa
7c30: 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d  me = &pE->pLeft-
7c40: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
7c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7c60: 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   pName = 0;.    
7c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
7c80: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
7c90: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
7ca0: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
7cb0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
7cc0: 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[i].pTab;.    
7cd0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7ce0: 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Name = pTabList-
7cf0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[i].zAlias;.  
7d00: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
7d10: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
7d20: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
7d30: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
7d40: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
7d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7d60: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
7d70: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
7d80: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
7d90: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
7da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7db0: 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e  StrNICmp(pName->
7dc0: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61  z, zTabName, pNa
7dd0: 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20  me->n)!=0 ||.   
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
7df0: 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d  abName[pName->n]
7e00: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
7e10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e30: 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
7e40: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
7e50: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
7e60: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
7e70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7e80: 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  r, *pLeft, *pRig
7e90: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
7ea0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
7eb0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
7ec0: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
7ed0: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
7ee0: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
7ef0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
7f00: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
7f10: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
7f20: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
7f30: 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61  a[i-1].pTab, zNa
7f40: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7f60: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
7f70: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
7f80: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7fa0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7fb0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
7fc0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7fd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7fe0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7ff0: 26 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  & sqlite3IdListI
8000: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
8010: 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  [i-1].pUsing, zN
8020: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
8030: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
8040: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
8050: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
8060: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8080: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
8090: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
80a0: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
80b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
80c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
80d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
80e0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
80f0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
8100: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8110: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
8120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8130: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
8140: 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  n.z = zName;.   
8150: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
8160: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
8170: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
8180: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
8190: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
81a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
81b0: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
81c0: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
81d0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
81e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
81f0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8210: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8220: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
8230: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
8240: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8250: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
8260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8270: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Left->token.z = 
8280: 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zTabName;.      
8290: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
82a0: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
82b0: 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
82c0: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
82d0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
82f0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 28 63  ite3SetString((c
8300: 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70  har**)&pExpr->sp
8310: 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  an.z, zTabName, 
8320: 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ".", zName, 0);.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8340: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74  xpr->span.n = st
8350: 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e  rlen(pExpr->span
8360: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .z);.           
8370: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
8380: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
8390: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
83a0: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
83b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
83c0: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
83d0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
83e0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
8400: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
8410: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
8420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8430: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
8440: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
8450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8460: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8470: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8480: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
8490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
84a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
84b0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
84c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
84d0: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
84e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
84f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8500: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54  o such table: %T
8510: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
8520: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8540: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8550: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
8560: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
8570: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
8580: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
8590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
85a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
85b0: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
85c0: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
85d0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74   pNew;.  }.  ret
85e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
85f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8600: 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b  cursively unlink
8610: 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  s the Select.pSr
8620: 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74  c.a[].pTab point
8630: 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65  ers.** in a sele
8640: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ct structure.  I
8650: 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  t just sets the 
8660: 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c  pointers to NULL
8670: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
8680: 6e 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20  ne is recursive 
8690: 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
86a0: 74 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e  t if the Select.
86b0: 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74  pSrc.a[].pSelect
86c0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  .** pointer is n
86d0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f  ot NULL, this ro
86e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
86f0: 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
8700: 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  hat pointer..**.
8710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8720: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
8730: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
8740: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
8750: 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65  .** VIEW in orde
8760: 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69  r to undo any bi
8770: 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73  ndings to tables
8780: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
8790: 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20  sary.** because 
87a0: 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67  those tables mig
87b0: 68 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20  ht be DROPed by 
87c0: 61 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c  a subsequent SQL
87d0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20   command..** If 
87e0: 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65  the bindings are
87f0: 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68   not removed, th
8800: 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  en the Select.pS
8810: 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  rc->a[].pTab fie
8820: 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65  ld.** will be le
8830: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ft pointing to a
8840: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62   deallocated Tab
8850: 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74  le structure aft
8860: 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61  er the.** DROP a
8870: 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69  nd a coredump wi
8880: 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78  ll occur the nex
8890: 74 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20  t time the VIEW 
88a0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
88b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
88c0: 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b  bind(Select *p){
88d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
88e0: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
88f0: 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Src;.  Table *pT
8900: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
8910: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
8920: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
8930: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8940: 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b  (pTab = pSrc->a[
8950: 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20  i].pTab)!=0 ){. 
8960: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69       if( pTab->i
8970: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
8980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
8990: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
89a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
89b0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
89c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
89d0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
89e0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
89f0: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
8a00: 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  d(pSrc->a[i].pSe
8a10: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
8a20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8a30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
8a40: 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65  ssociates entrie
8a50: 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s in an ORDER BY
8a60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8a70: 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   with.** columns
8a80: 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46   in a result.  F
8a90: 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59  or each ORDER BY
8aa0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8ab0: 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68   opcode of.** th
8ac0: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
8ad0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
8ae0: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
8af0: 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f   iColumn value o
8b00: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
8b10: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
8b20: 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e  d in with column
8b30: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8b40: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
8b50: 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
8b60: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
8b70: 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61  with iTable para
8b80: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
8b90: 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20  there are prior 
8ba0: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20  SELECT clauses, 
8bb0: 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73  they are process
8bc0: 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74  ed first.  A mat
8bd0: 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c  ch.** in an earl
8be0: 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73  ier SELECT takes
8bf0: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
8c00: 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e   a later SELECT.
8c10: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79  .**.** Any entry
8c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
8c30: 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20  atch is flagged 
8c40: 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  as an error.  Th
8c50: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
8c60: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
8c70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8c80: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
8c90: 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
8ca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8cb0: 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c   /* A place to l
8cc0: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
8cd0: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
8ce0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
8cf0: 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73   /* Match to res
8d00: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ult columns of t
8d10: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
8d20: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8d30: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
8d40: 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74  RDER BY values t
8d50: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
8d60: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
8d70: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
8d80: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74       /* Insert t
8d90: 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61  his value in iTa
8da0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
8db0: 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20  tComplete       
8dc0: 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20   /* If TRUE all 
8dd0: 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d  ORDER BYs must m
8de0: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
8df0: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nErr = 0;.  int
8e00: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
8e10: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
8e20: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20  ( pSelect==0 || 
8e30: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
8e40: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75  turn 1;.  if( mu
8e50: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
8e60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
8e70: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
8e80: 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  +){ pOrderBy->a[
8e90: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20  i].done = 0; }. 
8ea0: 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43   }.  if( fillInC
8eb0: 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65  olumnList(pParse
8ec0: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
8ed0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
8ee0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
8ef0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
8f00: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
8f10: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53  olumn(pParse, pS
8f20: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70  elect->pPrior, p
8f30: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
8f40: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
8f50: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
8f60: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
8f70: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  ect->pEList;.  f
8f80: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
8f90: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
8fa0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
8fb0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
8fc0: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
8fd0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ol = -1;.    if(
8fe0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8ff0: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
9000: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9010: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
9020: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
9030: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
9040: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
9050: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
9060: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9070: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
9080: 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74   "ORDER BY posit
9090: 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65  ion %d should be
90a0: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25   between 1 and %
90b0: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43  d",.          iC
90c0: 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
90d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  r);.        nErr
90e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
90f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
9100: 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65   if( !mustComple
9110: 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  te ) continue;. 
9120: 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20       iCol--;.   
9130: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
9140: 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69  iCol<0 && j<pELi
9150: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
9160: 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
9170: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26  t->a[j].zName &&
9180: 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20   (pE->op==TK_ID 
9190: 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  || pE->op==TK_ST
91a0: 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20  RING) ){.       
91b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a   char *zName, *z
91c0: 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a  Label;.        z
91d0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
91e0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
91f0: 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69     zLabel = sqli
9200: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9210: 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  (&pE->token);.  
9220: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c        assert( zL
9230: 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  abel!=0 );.     
9240: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9250: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
9260: 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20  bel)==0 ){ .    
9270: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
9280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9290: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
92a0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
92b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
92c0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
92d0: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
92e0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
92f0: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9310: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
9320: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
9330: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
9340: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
9350: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
9360: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
9370: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
9380: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
9390: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
93a0: 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d  Col<0 && mustCom
93b0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73  plete ){.      s
93c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
93d0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
93e0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
93f0: 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74  mber %d does not
9400: 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c   match any resul
9410: 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b  t column", i+1);
9420: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
9430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9440: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9450: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
9460: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
9470: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
9480: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
9490: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
94a0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
94b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
94c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
94d0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
94e0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
94f0: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
9500: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
9510: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
9520: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9530: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
9540: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9550: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
9560: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
9570: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9580: 76 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 2a  v;.}..#if 0  /**
9590: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
95a0: 20 6e 65 65 64 73 20 64 65 6c 65 74 69 6e 67 20   needs deleting 
95b0: 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  *****/.static vo
95c0: 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66  id multiSelectAf
95d0: 66 69 6e 69 74 79 28 53 65 6c 65 63 74 20 2a 70  finity(Select *p
95e0: 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20  , char *zAff){. 
95f0: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21   int i;..  if( !
9600: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 75  p ) return;.  mu
9610: 6c 74 69 53 65 6c 65 63 74 41 66 66 69 6e 69 74  ltiSelectAffinit
9620: 79 28 70 2d 3e 70 50 72 69 6f 72 2c 20 7a 41 66  y(p->pPrior, zAf
9630: 66 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f);..  for(i=0; 
9640: 69 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  i<p->pEList->nEx
9650: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
9660: 28 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c 30 27 20  ( zAff[i]=='\0' 
9670: 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69 5d  ){.      zAff[i]
9680: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9690: 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
96a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
96b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
96c0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  f../*.** Compute
96d0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
96e0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
96f0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
9700: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69  ed on the.** nLi
9710: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20  mit and nOffset 
9720: 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20  fields.  nLimit 
9730: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
9740: 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   the integers.**
9750: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
9760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
9770: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
9780: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
9790: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
97a0: 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64  s.  Or that hold
97b0: 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f   -1 and 0 if tho
97c0: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
97d0: 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d  omitted..** iLim
97e0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
97f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
9800: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
9810: 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f  umbers for.** co
9820: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
9830: 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
9840: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
9850: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
9860: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
9870: 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74  set, then iLimit
9880: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
9890: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
98a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
98b0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
98c0: 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   if iLimit and i
98d0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
98e0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
98f0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
9900: 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  y nLimit and nOf
9910: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
9920: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
9930: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
9940: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
9950: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
9960: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
9970: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
9980: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
9990: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
99a0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d  .** Only if nLim
99b0: 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74  it>=0 or nOffset
99c0: 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  >0 do the limit 
99d0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
99e0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
99f0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
9a00: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
9a10: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
9a20: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
9a30: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
9a40: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
9a50: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
9a60: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
9a70: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
9a80: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
9a90: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
9aa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
9ab0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a  lect *p){.  /* .
9ac0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70    ** If the comp
9ad0: 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69  arison is p->nLi
9ae0: 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49  mit>0 then "LIMI
9af0: 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20  T 0" shows.  ** 
9b00: 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73  all rows.  It is
9b10: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20   the same as no 
9b20: 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f  limit. If the co
9b30: 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a  mparision is.  *
9b40: 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74  * p->nLimit>=0 t
9b50: 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68  hen "LIMIT 0" sh
9b60: 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c  ow no rows at al
9b70: 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  l..  ** "LIMIT -
9b80: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
9b90: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
9ba0: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
9bb0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
9bc0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
9bd0: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
9be0: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
9bf0: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
9c00: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
9c10: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
9c20: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
9c30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
9c40: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
9c50: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
9c60: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
9c70: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9c80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9c90: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
9ca0: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
9cb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9cc0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
9cd0: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
9ce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9cf0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
9d00: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d  iMem, 1);.    p-
9d10: 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a  >iLimit = iMem;.
9d20: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66    }.  if( p->nOf
9d30: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
9d40: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
9d50: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
9d60: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
9d70: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9d80: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
9d90: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
9da0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9db0: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f  _Integer, -p->nO
9dc0: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
9dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9de0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
9df0: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d  iMem, 1);.    p-
9e00: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b  >iOffset = iMem;
9e10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9e20: 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74  nerate VDBE inst
9e30: 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69  ructions that wi
9e40: 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  ll open a transi
9e50: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
9e60: 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  * will be used f
9e70: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74  or an index or t
9e80: 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65  o store keyed re
9e90: 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70  sults for a comp
9ea0: 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20  ound.** select. 
9eb0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9ec0: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   open a transien
9ed0: 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65  t table that nee
9ee0: 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ds a.** KeyInfo 
9ef0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
9f00: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9f10: 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  s in the KeyInfo
9f20: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
9f30: 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20  * by the result 
9f40: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
9f50: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  T statement in t
9f60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
9f70: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  nt..**.** Specif
9f80: 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75  ically, this rou
9f90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
9fa0: 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20  o open an index 
9fb0: 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53  table for.** DIS
9fc0: 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e  TINCT, UNION, IN
9fd0: 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45  TERSECT and EXCE
9fe0: 50 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  PT select statem
9ff0: 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a  ents (but not .*
a000: 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a  * UNION ALL)..**
a010: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77  .** Make the new
a020: 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61   table a KeyAsDa
a030: 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41  ta table if keyA
a040: 73 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a  sData is true..*
a050: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
a060: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 61  eturned is the a
a070: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
a080: 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75  _OpenTemp instru
a090: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a0a0: 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64   int openTempInd
a0b0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
a0c0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
a0d0: 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73   iTab, int keyAs
a0e0: 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  Data){.  KeyInfo
a0f0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
a100: 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c  t nColumn;.  sql
a110: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
a120: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
a130: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a140: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
a150: 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 66 69 6c  addr;..  if( fil
a160: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
a170: 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
a180: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a190: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c  nColumn = p->pEL
a1a0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b  ist->nExpr;.  pK
a1b0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
a1c0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a1d0: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e  KeyInfo)+nColumn
a1e0: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
a1f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  ) );.  if( pKeyI
a200: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
a210: 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  0;.  pKeyInfo->e
a220: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
a230: 3e 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  >enc;.  pKeyInfo
a240: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75  ->nField = nColu
a250: 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  mn;.  for(i=0; i
a260: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
a270: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
a280: 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
a290: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
a2a0: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
a2b0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
a2c0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61  if( !pKeyInfo->a
a2d0: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
a2e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
a2f0: 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  [i] = db->pDfltC
a300: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oll;.    }.  }. 
a310: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a320: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
a330: 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20  nTemp, iTab, 0, 
a340: 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b  .      (char*)pK
a350: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
a360: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
a370: 66 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a  f( keyAsData ){.
a380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a390: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
a3a0: 44 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a  Data, iTab, 1);.
a3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
a3c0: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  r;.}..static int
a3d0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
a3e0: 54 65 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20  TempAddr(Select 
a3f0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 49 64  *p, int addr, Id
a400: 4c 69 73 74 20 2a 2a 70 70 4f 70 65 6e 54 65 6d  List **ppOpenTem
a410: 70 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70 70  p){.  if( !p->pp
a420: 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20  OpenTemp ){.    
a430: 2a 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71  *ppOpenTemp = sq
a440: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
a450: 64 28 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  d(0, 0);.    p->
a460: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 70 4f  ppOpenTemp = ppO
a470: 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 65 6c 73 65  penTemp;.  }else
a480: 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 4f 70 65 6e  {.    *p->ppOpen
a490: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49 64  Temp = sqlite3Id
a4a0: 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70  ListAppend(*p->p
a4b0: 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b 0a 20  pOpenTemp, 0);. 
a4c0: 20 7d 0a 20 20 69 66 28 20 21 28 2a 70 2d 3e 70   }.  if( !(*p->p
a4d0: 70 4f 70 65 6e 54 65 6d 70 29 20 29 7b 0a 20 20  pOpenTemp) ){.  
a4e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 28 2a 70  NOMEM;.  }.  (*p
a500: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29 2d 3e 61  ->ppOpenTemp)->a
a510: 5b 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  [(*p->ppOpenTemp
a520: 29 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20  )->nId-1].idx = 
a530: 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  addr;.  return S
a540: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
a550: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
a560: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
a570: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a580: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
a590: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
a5a0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
a5b0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
a5c0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
a5d0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
a5e0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
a5f0: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ol);.  }.  if( !
a600: 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74  pRet ){.    pRet
a610: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
a620: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
a630: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
a640: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
a650: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
a660: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a670: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
a680: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
a690: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
a6a0: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
a6b0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
a6c0: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
a6d0: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  te queries..**.*
a6e0: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
a6f0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
a700: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
a710: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
a720: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
a730: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
a740: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
a750: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
a760: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
a770: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
a780: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
a790: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
a7a0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
a7b0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
a7c0: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
a7d0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
a7e0: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
a7f0: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
a800: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
a810: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
a820: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
a830: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
a840: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
a850: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
a860: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
a870: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
a880: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
a890: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
a8a0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
a8b0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
a8c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
a8d0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
a8e0: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
a8f0: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
a900: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
a910: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
a920: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
a930: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
a940: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
a950: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
a960: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
a970: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
a980: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
a990: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
a9a0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
a9b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
a9c0: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
a9d0: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
a9e0: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
a9f0: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
aa00: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
aa10: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
aa20: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
aa30: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
aa40: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
aa50: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
aa60: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
aa70: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
aa80: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
aa90: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
aaa0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
aab0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
aac0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
aad0: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
aae0: 2c 20 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  , .  int eDest, 
aaf0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 0a 20  .  int iParm, . 
ab00: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
ab10: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
ab20: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
ab30: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
ab40: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
ab50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ab60: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
ab70: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
ab80: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
ab90: 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e  Prior;     /* An
aba0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
abb0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
abc0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
abd0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
abe0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
abf0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
ac00: 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 54 65   IdList *pOpenTe
ac10: 6d 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61  mp = 0;..  /* Ma
ac20: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
ac30: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
ac40: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
ac50: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
ac60: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
ac70: 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  st SELECT in the
ac80: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
ac90: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
aca0: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
acb0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
acc0: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
acd0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
ace0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
acf0: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
ad00: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
ad10: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
ad20: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ad30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ad40: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
ad50: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
ad60: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
ad70: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
ad80: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
ad90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
ada0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
adb0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
adc0: 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d  pPrior->nLimit>=
add0: 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66  0 || pPrior->nOf
ade0: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
adf0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ae00: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
ae10: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
ae20: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
ae30: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
ae40: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
ae50: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
ae60: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
ae70: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
ae80: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
ae90: 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72  ave a valid quer
aea0: 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f  y engine.  If no
aeb0: 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  t, create a new 
aec0: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  one..  */.  v = 
aed0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
aee0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
aef0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
af00: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
af10: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
af20: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
af30: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
af40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
af50: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
af60: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
af70: 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
af80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
af90: 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
afa0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
afb0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
afc0: 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
afd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
afe0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
aff0: 20 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73   iParm, p->pELis
b000: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 65  t->nExpr);.    e
b010: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
b020: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
b030: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
b040: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
b050: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b060: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
b070: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
b080: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
b090: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
b0a0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
b0b0: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69     pPrior->nLimi
b0c0: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
b0d0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e         pPrior->n
b0e0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
b0f0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  set;.        pPr
b100: 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20  ior->ppOpenTemp 
b110: 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b  = p->ppOpenTemp;
b120: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
b130: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
b140: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
b150: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
b160: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
b170: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
b180: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
b190: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
b1b0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
b1c0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
b1d0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
b1e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
b1f0: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
b200: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
b210: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
b220: 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65         p->nOffse
b230: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
b240: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
b250: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
b260: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
b270: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
b280: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
b290: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
b2a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b2b0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b2c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
b2d0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
b2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2f0: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
b300: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
b310: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
b320: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
b330: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b340: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
b350: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
b360: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
b370: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
b380: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
b390: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
b3a0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
b3b0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
b3c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
b3d0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
b3e0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
b3f0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
b400: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
b410: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
b420: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
b430: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
b440: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  /.      int nLim
b450: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20  it, nOffset; /* 
b460: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
b470: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
b480: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
b490: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
b4a0: 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52  erBy;  /* The OR
b4b0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
b4c0: 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45  r the right SELE
b4d0: 43 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  CT */.      int 
b4e0: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
b4f0: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
b500: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
b510: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
b520: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
b530: 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72  riorOp && p->pOr
b540: 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e  derBy==0 && p->n
b550: 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f  Limit<0 && p->nO
b560: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
b570: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
b580: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
b590: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
b5a0: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
b5b0: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
b5c0: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
b5d0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
b5e0: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20   = iParm;.      
b5f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
b600: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
b610: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
b620: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b630: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
b640: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
b650: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
b660: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b670: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
b680: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b690: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
b6a0: 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20  rBy .        && 
b6b0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
b6c0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
b6d0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p->pOrderBy, uni
b6e0: 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20  onTab, 1) ){.   
b6f0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
b700: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
b710: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
b720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b730: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b740: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b750: 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54  OpenTemp, unionT
b760: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
b770: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  if( p->op!=TK_AL
b780: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  L ){.          r
b790: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
b7a0: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
b7b0: 64 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29  ddr, &pOpenTemp)
b7c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b7d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
b7f0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b800: 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  nd;.          }.
b810: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b820: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b830: 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f  _KeyAsData, unio
b840: 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20  nTab, 1);.      
b850: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
b860: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
b870: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b880: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
b890: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
b8a0: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
b8b0: 2a 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  */.      pPrior-
b8c0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
b8d0: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20  >ppOpenTemp;.   
b8e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b8f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
b900: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
b910: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
b920: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
b930: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b940: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
b950: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
b960: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
b970: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
b980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b990: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
b9a0: 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62  olumns, unionTab
b9b0: 2c 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  , pPrior->pEList
b9c0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
b9d0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
b9e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
b9f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
ba00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
ba10: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
ba20: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
ba30: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
ba40: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
ba50: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
ba60: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
ba70: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
ba80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
ba90: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
baa0: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
bab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bac0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
bad0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72  r = 0;.      pOr
bae0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
baf0: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
bb00: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
bb10: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
bb20: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
bb30: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
bb40: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
bb50: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
bb60: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
bb70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bb80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
bb90: 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  , op, unionTab, 
bba0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
bbb0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
bbc0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
bbd0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
bbe0: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e  derBy;.      p->
bbf0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
bc00: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
bc10: 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  t = nOffset;.   
bc20: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
bc30: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
bc40: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
bc50: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
bc60: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
bc70: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
bc80: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
bc90: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
bca0: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
bcb0: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
bcc0: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
bcd0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21        if( eDest!
bce0: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
bcf0: 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20  nTab!=iParm ){. 
bd00: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
bd10: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
bd20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bd30: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
bd40: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
bd50: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
bd60: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
bd70: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
bd80: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
bd90: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
bda0: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
bdb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
bdc0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
bdd0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
bde0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
bdf0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
be00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
be10: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
be20: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
be30: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
be40: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
be50: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
be60: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
be70: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
be80: 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
be90: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
bea0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
beb0: 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
bec0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
bed0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
bf00: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
bf30: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
bf40: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
bf50: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bf60: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
bf70: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
bf80: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
bf90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bfa0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bfb0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
bfc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bfd0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
bfe0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
bff0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c000: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
c010: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
c020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c030: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c040: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
c050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c070: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
c080: 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
c090: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
c0a0: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
c0b0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
c0c0: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e     int nLimit, n
c0d0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
c0e0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f  t addr;..      /
c0f0: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
c100: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
c110: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
c120: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
c130: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
c140: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
c150: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
c160: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
c170: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
c180: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
c190: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
c1a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
c1b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
c1c0: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
c1d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
c1e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
c1f0: 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72  derBy && matchOr
c200: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
c210: 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72  arse,p,p->pOrder
c220: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
c230: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c240: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c250: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c260: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64 64 72     }..      addr
c270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c280: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
c290: 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  mp, tab1, 0);.  
c2a0: 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
c2b0: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
c2c0: 28 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e  (p, addr, &pOpen
c2d0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Temp);.      if(
c2e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c2f0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c300: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c330: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
c340: 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20   tab1, 1);.     
c350: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c360: 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
c370: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
c380: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
c390: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
c3a0: 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
c3b0: 2a 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  */.      pPrior-
c3c0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
c3d0: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20  >ppOpenTemp;.   
c3e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c3f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
c400: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
c410: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20   tab1, 0, 0, 0, 
c420: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
c430: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c440: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c450: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
c460: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
c470: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
c480: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
c490: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
c4a0: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
c4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4c0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
c4d0: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
c4e0: 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
c4f0: 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70  ctOpenTempAddr(p
c500: 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54 65  , addr, &pOpenTe
c510: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
c520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c530: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c540: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
c560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c570: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
c580: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ab2, 1);.      p
c590: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c5a0: 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e      nLimit = p->
c5b0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
c5c0: 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >nLimit = -1;.  
c5d0: 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d      nOffset = p-
c5e0: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >nOffset;.      
c5f0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
c600: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c610: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c620: 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   p, SRT_Union, t
c630: 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab2, 0, 0, 0, af
c640: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
c650: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
c660: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
c670: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
c680: 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73  >nOffset = nOffs
c690: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
c6a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c6b0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c6c0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
c6d0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
c6e0: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
c6f0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
c700: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
c710: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
c720: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c730: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c740: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
c750: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
c760: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ack ){.        g
c770: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
c780: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d  es(pParse, 0, p-
c790: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
c7a0: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
c7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c7c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
c7d0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
c7e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
c810: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
c820: 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  ak);.      compu
c830: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c840: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
c850: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
c860: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c870: 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31  OP_FullKey, tab1
c880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c890: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c8a0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
c8b0: 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
c8c0: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
c8d0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
c8e0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
c8f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
c900: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
c930: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
c940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
c960: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
c970: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c980: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
c990: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c9a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c9b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c9c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
c9d0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
c9e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c9f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
ca00: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
ca10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ca20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
ca30: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
ca40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca50: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
ca60: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
ca70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca80: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
ca90: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
caa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
cab0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
cac0: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
cad0: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
cae0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
caf0: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
cb00: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
cb10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
cb20: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
cb30: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
cb40: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
cb50: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
cb60: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
cb70: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
cb80: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
cb90: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
cba0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
cbb0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
cbc0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
cbd0: 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65  OrderBy || (pOpe
cbe0: 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65  nTemp && pOpenTe
cbf0: 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20  mp->nId>0) ){.  
cc00: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
cc10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
cc20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4b 65     int i;.    Ke
cc30: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
cc40: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
cc50: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
cc60: 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c  +nCol*sizeof(Col
cc70: 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28  lSeq*));.    if(
cc80: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
cc90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cca0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
ccb0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ccc0: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
ccd0: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70  KeyInfo->enc = p
cce0: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
ccf0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
cd00: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
cd10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
cd20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
cd30: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
cd40: 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
cd50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
cd60: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
cd70: 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  !pKeyInfo->aColl
cd80: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  [i] ){.        p
cd90: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
cda0: 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ] = pParse->db->
cdb0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
cdc0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
cdd0: 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70  r(i=0; pOpenTemp
cde0: 20 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d   && i<pOpenTemp-
cdf0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ce00: 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28    int p3type = (
ce10: 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f  i==0?P3_KEYINFO_
ce20: 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e  HANDOFF:P3_KEYIN
ce30: 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  FO);.      int a
ce40: 64 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d  ddr = pOpenTemp-
ce50: 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20  >a[i].idx;.     
ce60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ce70: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
ce80: 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
ce90: 70 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a  p3type);.    }..
cea0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
ceb0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  rBy ){.      for
cec0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65  (i=0; i<p->pOrde
ced0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
cee0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
cef0: 70 45 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65  pExpr = p->pOrde
cf00: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
cf10: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
cf20: 4e 61 6d 65 20 3d 20 70 2d 3e 70 4f 72 64 65 72  Name = p->pOrder
cf30: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  By->a[i].zName;.
cf40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cf50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
cf60: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
cf70: 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20  Column<nCol );. 
cf80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
cf90: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a  pExpr->pColl );.
cfa0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
cfb0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
cfc0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
cfd0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
cfe0: 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  eq(pParse, zName
cff0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
d000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d010: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
d020: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70  KeyInfo->aColl[p
d030: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
d040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d050: 7d 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65  }.      generate
d060: 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
d070: 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74   p, v, p->pEList
d080: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
d090: 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  iParm);.    }.. 
d0a0: 20 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d     if( !pOpenTem
d0b0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
d0c0: 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55  is happens for U
d0d0: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
d0e0: 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73  ER BY */.      s
d0f0: 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e  qliteFree(pKeyIn
d100: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  fo);.    }.  }..
d110: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d120: 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d  :.  if( pOpenTem
d130: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
d140: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70  IdListDelete(pOp
d150: 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70  enTemp);.  }.  p
d160: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30  ->ppOpenTemp = 0
d170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d180: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
d190: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
d1a0: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
d1b0: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
d1c0: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
d1d0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
d1e0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
d1f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
d200: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
d210: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
d220: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
d230: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
d240: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
d250: 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
d260: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
d270: 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
d280: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
d290: 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
d2a0: 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
d2b0: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
d2c0: 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
d2d0: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
d2e0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
d2f0: 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
d300: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
d310: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
d320: 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
d330: 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
d340: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d350: 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
d360: 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
d370: 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
d380: 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
d390: 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
d3a0: 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
d3b0: 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
d3c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d3d0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
d3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d3f0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
d400: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
d410: 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
d420: 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
d430: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
d440: 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
d450: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
d460: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
d470: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
d480: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
d490: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
d4a0: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
d4b0: 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
d4c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
d4d0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
d4e0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
d4f0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
d500: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
d510: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d520: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
d530: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
d540: 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
d550: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
d560: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
d570: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
d580: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
d590: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
d5a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
d5b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
d5c0: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
d5d0: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
d5e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
d5f0: 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
d600: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
d610: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
d620: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
d630: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65  lite3ExprDup(pNe
d640: 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
d650: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
d660: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
d670: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
d680: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
d690: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
d6a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d6b0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
d6c0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
d6d0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
d6e0: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
d6f0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45  pList);.      pE
d700: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
d710: 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
d720: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
d730: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
d740: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
d750: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
d760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
d770: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
d780: 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
d790: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
d7a0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
d7b0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
d7c0: 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a  w->span);.    }.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
d7e0: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
d7f0: 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
d800: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
d810: 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
d820: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
d830: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
d840: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
d850: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
d860: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
d870: 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70  c void .substExp
d880: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
d890: 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c  pList, int iTabl
d8a0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
d8b0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
d8c0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
d8d0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d8e0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
d8f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
d900: 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
d910: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
d920: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
d930: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d940: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
d950: 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
d960: 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
d970: 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
d980: 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
d990: 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
d9a0: 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
d9b0: 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
d9c0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
d9d0: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
d9e0: 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
d9f0: 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
da00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
da10: 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
da20: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
da30: 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
da40: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
da50: 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
da60: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
da70: 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
da80: 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
da90: 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
daa0: 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
dab0: 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
dac0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
dad0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
dae0: 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
daf0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
db00: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
db10: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
db20: 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
db30: 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
db40: 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
db50: 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
db60: 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
db70: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
db80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
db90: 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
dba0: 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
dbb0: 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
dbc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
dbd0: 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
dbe0: 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
dbf0: 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
dc00: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
dc10: 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
dc20: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
dc30: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
dc40: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
dc50: 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
dc60: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
dc70: 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
dc80: 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
dc90: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
dca0: 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
dcb0: 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
dcc0: 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
dcd0: 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
dce0: 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
dcf0: 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
dd00: 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
dd10: 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
dd20: 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
dd30: 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
dd40: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
dd50: 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
dd60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
dd70: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
dd80: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
dd90: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
dda0: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
ddb0: 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
ddc0: 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
ddd0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
dde0: 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
ddf0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
de00: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
de10: 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
de20: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
de30: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
de40: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
de50: 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20   join, or.**    
de60: 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79      the subquery
de70: 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61   is not itself a
de80: 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20   join.  (Ticket 
de90: 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  #306).**.**   (4
dea0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
deb0: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
dec0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
ded0: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
dee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
def0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
df00: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
df10: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
df20: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
df30: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
df40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
df50: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
df60: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
df70: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
df80: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
df90: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
dfa0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
dfb0: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
dfc0: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
dfd0: 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
dfe0: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
dff0: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
e000: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
e010: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
e020: 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
e030: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
e040: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
e050: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
e060: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
e070: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
e080: 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
e090: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
e0a0: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
e0b0: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
e0c0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
e0d0: 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
e0e0: 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
e0f0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
e100: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
e110: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
e120: 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
e130: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29  ses..**.**  (12)
e140: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
e150: 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
e160: 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f  term of a LEFT O
e170: 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65  UTER JOIN or the
e180: 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
e190: 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
e1a0: 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64   clause.  (added
e1b0: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29   by ticket #350)
e1c0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
e1d0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
e1e0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
e1f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
e200: 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
e210: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
e220: 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
e230: 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
e240: 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
e250: 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
e260: 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
e270: 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
e280: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
e290: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
e2a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
e2b0: 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
e2c0: 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
e2d0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
e2e0: 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
e2f0: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
e300: 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
e310: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
e320: 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
e330: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e340: 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
e350: 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
e360: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
e370: 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
e380: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
e390: 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
e3a0: 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
e3b0: 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
e3c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e3d0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
e3e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
e3f0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
e400: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
e410: 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
e420: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
e430: 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
e440: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
e450: 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
e460: 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
e470: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
e480: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
e490: 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
e4a0: 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
e4b0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
e4c0: 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
e4d0: 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
e4e0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
e4f0: 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
e500: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
e510: 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
e520: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
e530: 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
e540: 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
e550: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
e560: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
e570: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
e580: 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
e590: 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
e5a0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
e5b0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
e5c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e5d0: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
e5e0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
e5f0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
e600: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
e610: 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
e620: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
e630: 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
e640: 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
e650: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  /.  int i;.  Exp
e660: 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a  r *pWhere;..  /*
e670: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
e680: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
e690: 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
e6a0: 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
e6b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
e6c0: 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
e6d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
e6e0: 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
e6f0: 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
e700: 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
e710: 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  ub = pSrc->a[iFr
e720: 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61  om].pSelect;.  a
e730: 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
e740: 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
e750: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
e760: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e770: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
e780: 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
e790: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75   return 0;.  pSu
e7a0: 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
e7b0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
e7c0: 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53  bSrc );.  if( pS
e7d0: 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
e7e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e7f0: 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e   (pSub->isDistin
e800: 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d  ct || pSub->nLim
e810: 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63  it>=0) &&  (pSrc
e820: 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
e830: 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
e840: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
e850: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
e860: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26   p->nLimit>=0) &
e870: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
e880: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e890: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
e8a0: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
e8b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
e8c0: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
e8d0: 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
e8e0: 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
e8f0: 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
e900: 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
e910: 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
e920: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
e930: 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
e940: 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
e950: 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
e960: 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
e970: 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
e980: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
e990: 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
e9a0: 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
e9b0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
e9c0: 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
e9d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
e9e0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
e9f0: 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
ea00: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
ea10: 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
ea20: 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
ea30: 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
ea40: 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20  rc>1 && iFrom>0 
ea50: 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
ea60: 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
ea70: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
ea80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ea90: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
eaa0: 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
eab0: 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
eac0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
ead0: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
eae0: 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
eaf0: 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
eb00: 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
eb10: 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
eb20: 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
eb30: 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
eb40: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
eb50: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
eb60: 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
eb70: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
eb80: 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
eb90: 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
eba0: 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
ebb0: 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
ebc0: 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
ebd0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
ebe0: 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
ebf0: 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
ec00: 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
ec10: 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
ec20: 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
ec30: 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
ec40: 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
ec50: 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
ec60: 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
ec70: 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
ec80: 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
ec90: 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
eca0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
ecb0: 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70  )!=0 .      && p
ecc0: 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29  Sub->pWhere!=0 )
ecd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ece0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
ecf0: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
ed00: 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74  , it means flatt
ed10: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
ed20: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
ed30: 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
ed40: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
ed50: 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e in the outer q
ed60: 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  uery..  */..  /*
ed70: 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65   Move all of the
ed80: 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
ed90: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
eda0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
edb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
edc0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
edd0: 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
ede0: 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
edf0: 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
ee00: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
ee10: 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
ee20: 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
ee30: 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
ee40: 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
ee50: 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
ee60: 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
ee70: 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
ee80: 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
ee90: 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
eea0: 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
eeb0: 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
eec0: 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
eed0: 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
eee0: 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
eef0: 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
ef00: 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
ef10: 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
ef20: 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
ef30: 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  /.  iParent = pS
ef40: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75  rc->a[iFrom].iCu
ef50: 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
ef60: 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
ef70: 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
ef80: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
ef90: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
efa0: 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20  ntype;..    if( 
efb0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
efc0: 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69  Tab && pSrc->a[i
efd0: 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72  From].pTab->isTr
efe0: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
eff0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
f000: 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69  ble(0, pSrc->a[i
f010: 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20  From].pTab);.   
f020: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
f030: 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  e(pSrc->a[iFrom]
f040: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
f050: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63   sqliteFree(pSrc
f060: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65  ->a[iFrom].zName
f070: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f080: 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  e(pSrc->a[iFrom]
f090: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
f0a0: 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
f0b0: 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
f0c0: 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
f0d0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
f0e0: 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
f0f0: 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
f100: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
f110: 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
f120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
f130: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
f140: 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
f150: 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
f160: 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
f170: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
f180: 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
f190: 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
f1a0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
f1b0: 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
f1c0: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
f1d0: 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
f1e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
f1f0: 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
f200: 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
f210: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
f220: 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
f230: 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
f240: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
f250: 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
f260: 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
f270: 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
f280: 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
f290: 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
f2a0: 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
f2b0: 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
f2c0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
f2d0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
f2e0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
f2f0: 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
f300: 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
f310: 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
f320: 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
f330: 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
f360: 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
f370: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
f380: 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
f390: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f3a0: 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
f3b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f3c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
f3d0: 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
f3e0: 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
f3f0: 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
f400: 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
f410: 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
f420: 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
f430: 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
f440: 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
f450: 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
f460: 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
f470: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
f480: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
f490: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
f4a0: 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
f4b0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
f4c0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
f4d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
f4e0: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
f4f0: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
f500: 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
f510: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
f520: 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
f530: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
f540: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
f550: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
f560: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
f570: 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
f580: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
f590: 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
f5a0: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
f5b0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
f5c0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
f5d0: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
f5e0: 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
f5f0: 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
f600: 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
f610: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
f620: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
f630: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
f640: 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
f650: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
f660: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
f670: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
f680: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
f690: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f6a0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
f6b0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
f6c0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
f6d0: 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
f6e0: 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
f6f0: 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
f700: 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65  pWhere);.  }else
f710: 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
f720: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
f730: 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
f740: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
f750: 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
f760: 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
f770: 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
f780: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
f790: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
f7a0: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
f7b0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
f7c0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 48      if( pSub->pH
f7d0: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 45  aving ){.      E
f7e0: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 73  xpr *pHaving = s
f7f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
f800: 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  ub->pHaving);.  
f810: 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
f820: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ng ){.        p-
f830: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
f840: 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  e3Expr(TK_AND, p
f850: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76 69  ->pHaving, pHavi
f860: 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  ng, 0);.      }e
f870: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
f880: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
f890: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
f8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f8b0: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
f8c0: 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
f8d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f8e0: 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
f8f0: 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  By);.  }else if(
f900: 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b   p->pWhere==0 ){
f910: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
f920: 20 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65   pWhere;.  }else
f930: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
f940: 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  p->pWhere, iPare
f950: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
f960: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72  );.    if( pWher
f970: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57  e ){.      p->pW
f980: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
f990: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57  pr(TK_AND, p->pW
f9a0: 68 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29  here, pWhere, 0)
f9b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f9c0: 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
f9d0: 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
f9e0: 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
f9f0: 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a  inner or the.  *
fa00: 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
fa10: 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f   distinct. .  */
fa20: 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  .  p->isDistinct
fa30: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
fa40: 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74   || pSub->isDist
fa50: 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  inct;..  /* Tran
fa60: 73 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20 65  sfer the limit e
fa70: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
fa80: 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 74  he subquery to t
fa90: 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75  he outer.  ** qu
faa0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ery..  */.  if( 
fab0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  pSub->nLimit>=0 
fac0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c  ){.    if( p->nL
fad0: 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
fae0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62  p->nLimit = pSub
faf0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65  ->nLimit;.    }e
fb00: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  lse if( p->nLimi
fb10: 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70  t+p->nOffset > p
fb20: 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62  Sub->nLimit+pSub
fb30: 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->nOffset ){.   
fb40: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
fb50: 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53  Sub->nLimit + pS
fb60: 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d  ub->nOffset - p-
fb70: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  >nOffset;.    }.
fb80: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74    }.  p->nOffset
fb90: 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65   += pSub->nOffse
fba0: 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c  t;..  /* Finiall
fbb0: 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
fbc0: 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
fbd0: 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
fbe0: 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
fbf0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
fc00: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
fc10: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
fc20: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
fc30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fc40: 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
fc50: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
fc60: 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
fc70: 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
fc80: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
fc90: 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
fca0: 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
fcb0: 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
fcc0: 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
fcd0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
fce0: 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
fcf0: 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
fd00: 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
fd10: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
fd20: 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
fd30: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
fd40: 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
fd50: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
fd60: 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
fd70: 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
fd80: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
fd90: 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
fda0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
fdb0: 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
fdc0: 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
fdd0: 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
fde0: 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
fdf0: 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
fe00: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
fe10: 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
fe20: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
fe30: 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
fe40: 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
fe50: 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
fe60: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
fe70: 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
fe80: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
fe90: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
fea0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
feb0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
fec0: 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
fed0: 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
fee0: 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
fef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
ff00: 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
ff10: 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
ff20: 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
ff30: 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
ff40: 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
ff50: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
ff60: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
ff70: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
ff80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ff90: 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
ffa0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ffb0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
ffc0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
ffd0: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
ffe0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
fff0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
10000 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
10010 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
10020 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
10030 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
10040 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
10050 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
10060 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
10070 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
10080 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10090 3b 0a 20 20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ;.  ..  /* Check
100a0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
100b0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
100c0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
100d0 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
100e0 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
100f0 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
10100 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
10110 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
10120 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
10130 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
10140 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
10150 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
10160 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
10170 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
10180 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
10190 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
101a0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
101b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
101c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
101d0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
101e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
101f0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
10200 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
10210 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
10220 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
10230 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
10240 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
10250 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
10260 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78  ite3StrNICmp(pEx
10270 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
10280 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
10290 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
102a0 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
102b0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
102c0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
102d0 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
102e0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
102f0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
10300 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10310 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
10320 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
10330 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
10340 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10350 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
10360 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
10370 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
10380 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
10390 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
103a0 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
103b0 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
103c0 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
103d0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
103e0 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
103f0 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
10400 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
10410 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
10420 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
10430 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
10440 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
10450 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
10460 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
10470 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
10480 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
10490 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
104a0 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
104b0 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
104c0 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
104d0 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
104e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
104f0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
10500 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10510 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
10520 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
10530 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
10540 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
10550 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
10560 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
10570 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
10580 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
10590 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64  [0]==iCol && pId
105a0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
105b0 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65  [0]==pColl ) bre
105c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
105d0 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
105e0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
105f0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
10600 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
10610 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
10620 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
10630 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
10640 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
10650 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
10660 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
10670 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
10680 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
10690 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
106a0 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
106b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
106c0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
106d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
106e0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
106f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
10700 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
10710 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
10720 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
10730 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
10740 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
10750 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
10760 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
10770 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10780 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
10790 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
107a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
107b0 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
107c0 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
107d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
107e0 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
107f0 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
10800 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
10810 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
10820 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
10830 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
10840 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
10850 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
10860 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
10870 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
10880 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
10890 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
108a0 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
108b0 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
108c0 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
108d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
108e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
108f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
10900 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53  Db);.  base = pS
10910 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
10920 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
10930 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
10940 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63  , p);.  if( pSrc
10950 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
10960 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10970 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10980 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
10990 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
109a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
109b0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
109c0 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  e, pTab->tnum);.
109d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
109e0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
109f0 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20  mColumns, base, 
10a00 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d  pTab->nCol);.  }
10a10 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
10a20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10a30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
10a40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10a50 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
10a60 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
10a70 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10a80 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10a90 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
10aa0 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
10ab0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10ac0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
10ad0 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  e+1, pIdx->tnum,
10ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10af0 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78      (char*)&pIdx
10b00 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  ->keyInfo, P3_KE
10b10 59 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20  YINFO);.    if( 
10b20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e  seekOp==OP_Rewin
10b30 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
10b40 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10b50 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
10b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10b70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
10b80 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
10b90 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
10ba0 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
10bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10bc0 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
10bd0 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
10be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10bf0 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f  p(v, OP_IdxRecno
10c00 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
10c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c20 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
10c30 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
10c40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c50 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
10c60 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
10c70 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
10c80 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
10c90 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
10ca0 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
10cb0 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
10cc0 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
10cd0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
10ce0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
10cf0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
10d00 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
10d10 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
10d20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a  cont, cont, 0);.
10d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10d40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
10d50 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
10d60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10d70 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
10d80 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
10d90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10da0 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
10db0 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
10dc0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
10dd0 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
10de0 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
10df0 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
10e00 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
10e10 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
10e20 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
10e30 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
10e40 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
10e90 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
10ea0 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
10eb0 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
10ec0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
10ed0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
10ee0 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
10ef0 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
10f00 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
10f10 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
10f20 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
10f30 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
10f40 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72  ys of table iPar
10f50 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
10f60 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
10f70 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
10f80 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
10f90 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
10fa0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
10fb0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
10fc0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
10fd0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10fe0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
10ff0 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
11000 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
11010 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
11020 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54  le iParm.**.** T
11030 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69  he table above i
11040 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41  s incomplete.  A
11050 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20  dditional eDist 
11060 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64  value have be ad
11070 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69  ded.** since thi
11080 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72  s comment was wr
11090 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20  itten.  See the 
110a0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
110b0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a  ) function for.*
110c0 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73  * a complete lis
110d0 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ting of the allo
110e0 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
110f0 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
11100 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
11110 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
11120 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
11130 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
11140 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
11150 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
11160 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
11170 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
11180 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
11190 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
111a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
111b0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
111c0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
111d0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
111e0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
111f0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
11200 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
11210 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
11220 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
11230 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
11240 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
11250 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
11260 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
11270 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
11280 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
11290 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
112a0 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
112b0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
112c0 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
112d0 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
112e0 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
112f0 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
11300 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
11310 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
11320 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
11330 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
11340 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
11350 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
11360 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
11370 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
11380 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
11390 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
113a0 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
113b0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
113c0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
113d0 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
113e0 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
113f0 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
11400 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
11410 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
11420 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
11430 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
11440 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
11480 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
11490 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
114a0 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
114b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
114c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
114d0 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
114e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
114f0 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
11500 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
11510 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
11520 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
11530 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
11540 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
11550 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
11560 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
11570 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
11580 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
11590 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
115a0 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
115b0 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
115c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
115d0 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
115e0 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
115f0 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
11600 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
11610 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
11620 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
11630 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
11640 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
11650 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
11660 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
11670 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
11680 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
11690 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
116a0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
116b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
116c0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
116d0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
116e0 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
116f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
11700 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
11710 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
11720 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11740 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
11750 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
11760 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
11770 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
11780 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
11790 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
117a0 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
117b0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
117c0 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
117d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
117e0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
117f0 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
11800 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
11810 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
11820 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
11830 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
11840 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
11850 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
11860 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
11870 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
11880 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
11890 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
118a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
118b0 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
118c0 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20  int isAgg = 0;  
118d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
118e0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
118f0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
11900 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11910 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
11920 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11930 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
11940 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
11950 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
11960 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
11970 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
11980 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
11990 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
119a0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
119b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
119c0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
119d0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
119e0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
119f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
11a00 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
11a10 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
11a20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
11a30 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
11a40 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
11a50 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
11a60 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
11a70 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
11a80 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
11a90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
11aa0 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
11ab0 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
11ac0 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
11ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
11ae0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
11af0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
11b00 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
11b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
11b20 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
11b30 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
11b40 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
11b50 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
11b60 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
11b70 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72   || p==0 ) retur
11b80 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
11b90 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11ba0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
11bb0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
11bc0 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  turn 1;..  /* If
11bd0 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
11be0 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
11bf0 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
11c00 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
11c10 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
11c20 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
11c30 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
11c40 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
11c50 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20   iParm, aff);.  
11c60 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63  }..  /* Make loc
11c70 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  al copies of the
11c80 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20   parameters for 
11c90 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f  this query..  */
11ca0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
11cb0 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20  >pSrc;.  pWhere 
11cc0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
11cd0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11ce0 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42  derBy;.  pGroupB
11cf0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
11d00 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
11d10 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
11d20 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
11d30 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  tinct;..  /* All
11d40 6f 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f  ocate VDBE curso
11d50 72 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  rs for each tabl
11d60 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
11d70 61 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ause.  */.  sqli
11d80 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
11d90 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
11da0 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
11db0 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
11dc0 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
11dd0 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
11de0 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
11df0 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
11e00 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
11e10 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
11e20 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
11e30 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
11e40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
11e50 2f 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a  /* Expand any "*
11e60 22 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72  " terms in the r
11e70 65 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72  esult set.  (For
11e80 20 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22   example the "*"
11e90 20 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54   in.  ** "SELECT
11ea0 20 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68   * FROM t1")  Th
11eb0 65 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69  e fillInColumnli
11ec0 73 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73  st() routine als
11ed0 6f 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a  o does some.  **
11ee0 20 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70   other housekeep
11ef0 69 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65  ing - see the he
11f00 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72  ader comment for
11f10 20 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20   details..  */. 
11f20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
11f30 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29  nList(pParse, p)
11f40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
11f50 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
11f60 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
11f70 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  e;.  pEList = p-
11f80 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
11f90 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
11fa0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
11fb0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
11fc0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
11fd0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
11fe0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
11ff0 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
12000 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ut..  */.  if( (
12010 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
12020 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
12030 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ) && pEList->nEx
12040 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  pr>1 ){.    sqli
12050 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12060 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
12070 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
12080 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
12090 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
120a0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
120b0 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f  ession");.    go
120c0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
120d0 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42   }..  /* ORDER B
120e0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
120f0 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
12100 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ns..  */.  switc
12110 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
12120 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a  case SRT_Union:.
12130 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
12140 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ept:.    case SR
12150 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 63  T_Discard:.    c
12160 61 73 65 20 53 52 54 5f 53 65 74 3a 0a 20 20 20  ase SRT_Set:.   
12170 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
12180 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12190 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
121a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
121b0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
121c0 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
121d0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68  allocated all th
121e0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
121f0 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68  e.  ** need to h
12200 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73 20  andle subquerys 
12210 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61  and temporary ta
12220 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  bles.  .  **.  *
12230 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  * Resolve the co
12240 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64  lumn names and d
12250 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68  o a semantics ch
12260 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65  eck on all the e
12270 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
12280 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
12290 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
122a0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
122b0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
122c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
122d0 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  t, 0, pEList->a[
122e0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
122f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12300 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
12310 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
12320 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  ck(pParse, pELis
12330 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31  t->a[i].pExpr, 1
12340 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20  , &isAgg) ){.   
12350 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12360 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
12370 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20  if( pWhere ){.  
12380 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12390 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
123a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
123b0 4c 69 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b  List, pWhere) ){
123c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
123d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
123e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
123f0 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
12400 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Where, 0, 0) ){.
12410 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12420 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
12430 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29  .  if( pHaving )
12440 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  {.    if( pGroup
12450 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
12460 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12470 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
12480 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
12490 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
124a0 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ING");.      got
124b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
124c0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
124d0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
124e0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
124f0 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76  st, pEList, pHav
12500 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
12510 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12520 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12530 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
12540 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31  arse, pHaving, 1
12550 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20  , &isAgg) ){.   
12560 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12570 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
12580 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
12590 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
125a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
125b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
125c0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72  iCol;.      Expr
125d0 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
125e0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
125f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12600 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
12610 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30  &iCol) && iCol>0
12620 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
12630 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
12640 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
12650 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
12660 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
12670 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
12680 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
12690 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70  ist->a[iCol-1].p
126a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
126b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
126c0 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
126d0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
126e0 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a   pEList, pE) ){.
126f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
12700 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
12710 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12720 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
12730 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30  se, pE, isAgg, 0
12740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
12750 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12760 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12770 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
12780 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20  stant(pE) ){.   
12790 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
127a0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
127b0 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  , &iCol)==0 ){. 
127c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
127d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
127e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f  .             "O
127f0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 6d 75  RDER BY terms mu
12800 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
12810 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
12820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
12830 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12840 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12850 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
12860 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
12870 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12880 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12890 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
128a0 20 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d   "ORDER BY colum
128b0 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
128c0 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
128d0 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
128e0 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
128f0 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45  nd %d", iCol, pE
12900 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
12910 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
12920 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
12930 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12940 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75  .  }.  if( pGrou
12950 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  pBy ){.    for(i
12960 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
12970 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12980 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
12990 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47     Expr *pE = pG
129a0 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
129b0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
129c0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
129d0 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26  er(pE, &iCol) &&
129e0 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
129f0 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
12a00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12a10 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
12a20 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 47  .        pE = pG
12a30 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
12a40 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
12a50 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
12a60 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
12a70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12a80 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
12a90 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
12aa0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
12ab0 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pE) ){.        g
12ac0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12ae0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
12af0 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
12b00 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
12b10 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12b20 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
12b30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12b40 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
12b50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12b60 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
12b70 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
12b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12b90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12ba0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12bb0 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 74 65      "GROUP BY te
12bc0 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
12bd0 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
12be0 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
12bf0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12c00 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
12c10 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
12c20 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
12c30 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
12c40 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12c50 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12c60 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20        "GROUP BY 
12c70 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
12c80 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
12c90 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
12ca0 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
12cb0 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f  n 1 and %d", iCo
12cc0 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
12cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
12ce0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12d00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12d10 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
12d20 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
12d30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12d40 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
12d50 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
12d60 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64  ct_end;..  /* Id
12d70 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
12d80 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
12d90 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  e using them in 
12da0 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
12db0 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
12dc0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
12dd0 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
12de0 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74   some other dest
12df0 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ination..  */.  
12e00 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
12e10 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
12e20 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
12e30 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
12e40 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
12e50 7d 0a 0a 23 69 66 20 31 20 20 2f 2a 20 49 20 64  }..#if 1  /* I d
12e60 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 77 65 20 6e  o not think we n
12e70 65 65 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eed the followin
12e80 67 20 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 2e  g code any more.
12e90 2e 2e 2e 20 2a 2f 0a 20 20 2f 2a 20 49 66 20 74  ... */.  /* If t
12ea0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
12eb0 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65  s SRT_Union, the
12ec0 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72  n set the number
12ed0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20   of columns in. 
12ee0 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 73 20   ** the records 
12ef0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
12f00 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74  erted into the t
12f10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
12f20 54 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  The caller.  ** 
12f30 63 6f 75 6c 64 6e 27 74 20 64 6f 20 74 68 69 73  couldn't do this
12f40 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  , in case the se
12f50 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 69  lect statement i
12f60 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20  s of the form . 
12f70 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52   ** "SELECT * FR
12f80 4f 4d 20 2e 2e 2e 2e 22 2e 20 0a 20 20 2a 2a 0a  OM ....". .  **.
12f90 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20    ** We need to 
12fa0 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 77  do this before w
12fb0 65 20 73 74 61 72 74 20 69 6e 73 65 72 74 69 6e  e start insertin
12fc0 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74  g records into t
12fd0 68 65 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  he .  ** tempora
12fe0 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
12ff0 68 61 73 20 68 61 64 20 4f 50 5f 4b 65 79 41 73  has had OP_KeyAs
13000 44 61 74 61 20 65 78 65 63 75 74 65 64 20 6f 6e  Data executed on
13010 20 69 74 29 2c 20 62 65 63 61 75 73 65 0a 20 20   it), because.  
13020 2a 2a 20 69 74 20 69 73 20 72 65 71 75 69 72 65  ** it is require
13030 64 20 62 79 20 74 68 65 20 6b 65 79 20 63 6f 6d  d by the key com
13040 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13050 2e 20 53 6f 20 64 6f 20 69 74 20 6e 6f 77 2c 20  . So do it now, 
13060 65 76 65 6e 0a 20 20 2a 2a 20 74 68 6f 75 67 68  even.  ** though
13070 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
13080 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
13090 73 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  s may be execute
130a0 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 20 20  d on the same.  
130b0 2a 2a 20 63 75 72 73 6f 72 20 6d 6f 72 65 20 74  ** cursor more t
130c0 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 2a 2f 0a 20  han once..  */. 
130d0 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
130e0 55 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c  Union ){.    sql
130f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13100 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
13110 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  s, iParm, pEList
13120 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65  ->nExpr);.  }.#e
13130 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
13140 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
13150 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
13160 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
13170 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
13180 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
13190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
131a0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
131b0 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
131c0 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
131d0 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20  reContext;..    
131e0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
131f0 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  i].pSelect==0 ) 
13200 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13210 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
13220 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  .zName!=0 ){.   
13230 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e     zSavedAuthCon
13240 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
13250 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
13260 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
13270 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69  Context = pTabLi
13280 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
13290 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
132a0 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
132b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
132c0 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
132d0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
132e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
132f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
13300 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53  >a[i].pSelect, S
13310 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20  RT_TempTable, . 
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
13340 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69  Cursor, p, i, &i
13350 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  sAgg, 0);.    if
13360 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
13370 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
13380 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
13390 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
133a0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
133b0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
133c0 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
133d0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
133e0 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
133f0 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21  _Union && eDest!
13400 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65  =SRT_Except && e
13410 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72  Dest!=SRT_Discar
13420 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  d ){.      pOrde
13430 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
13440 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
13450 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
13460 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
13470 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
13480 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
13490 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
134a0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
134b0 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
134c0 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
134d0 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
134e0 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
134f0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
13500 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
13510 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
13520 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
13530 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20  , iParm) ){.    
13540 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
13550 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
13560 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
13570 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
13580 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
13590 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
135a0 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
135b0 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
135c0 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
135d0 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
135e0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
135f0 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ely.  .  */.  if
13600 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
13610 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
13620 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
13630 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
13640 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
13650 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
13660 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
13670 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
13680 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
13690 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
136a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
136b0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65  ER BY clause, re
136c0 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74  solve any collat
136d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20  ion sequences.  
136e0 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61  ** names that ha
136f0 76 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74  ve been explicit
13700 6c 79 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ly specified..  
13710 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
13720 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
13730 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
13740 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13750 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
13760 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
13770 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
13780 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
13790 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
137a0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
137b0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
137c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  derBy->a[i].zNam
137d0 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, -1);.      }.
137e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
137f0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
13800 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13810 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
13820 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
13830 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d  iter..  */.  com
13840 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
13850 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a  rs(pParse, p);..
13860 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
13870 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
13880 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
13890 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
138a0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
138b0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
138c0 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
138d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
138e0 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
138f0 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
13900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13910 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
13920 6e 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73  ns, iParm, pELis
13930 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
13940 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79    /* Do an analy
13950 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65  sis of aggregate
13960 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
13970 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65  */.  sqliteAggre
13980 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50  gateInfoReset(pP
13990 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41  arse);.  if( isA
139a0 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
139b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
139c0 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b  arse->nAgg==0 );
139d0 0a 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a  .    isAgg = 1;.
139e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
139f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
13a00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
13a10 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
13a20 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
13a30 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
13a40 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
13a50 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13a60 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
13a70 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
13a80 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
13a90 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
13aa0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13ab0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13ac0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
13ad0 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47  gates(pParse, pG
13ae0 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
13af0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
13b00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13b30 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
13b40 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13b50 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
13b60 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
13b70 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13b80 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
13b90 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13ba0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13bb0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
13bd0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
13be0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
13bf0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
13c00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
13c10 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13c20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13c30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13c40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
13c50 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
13c60 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  or.  */.  if( is
13c70 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  Agg ){.    int a
13c80 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13c90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
13ca0 52 65 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79  Reset, (pGroupBy
13cb0 3f 30 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e  ?0:1), pParse->n
13cc0 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Agg);.    for(i=
13cd0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
13ce0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
13cf0 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20  uncDef *pFunc;. 
13d00 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20       if( (pFunc 
13d10 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
13d20 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70  ].pFunc)!=0 && p
13d30 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  Func->xFinalize!
13d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13d50 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
13d60 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69  OP_AggInit, 0, i
13d70 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20  , (char*)pFunc, 
13d80 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
13d90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13da0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
13db0 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 69       int sz = si
13dc0 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
13dd0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a  pGroupBy->nExpr*
13de0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
13df0 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
13e00 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
13e10 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
13e20 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  sz);.      if( 0
13e30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ==pKey ){.      
13e40 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13e50 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
13e60 20 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61   pKey->enc = pPa
13e70 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
13e80 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64      pKey->nField
13e90 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
13ea0 70 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  pr;.      for(i=
13eb0 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
13ec0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13ed0 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
13ee0 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
13ef0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13f00 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
13f10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
13f20 66 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b  f( !pKey->aColl[
13f30 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
13f40 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
13f50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
13f60 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
13f70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13f80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13f90 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
13fa0 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  ar *)pKey, P3_KE
13fb0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
13fc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13fd0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
13fe0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55  emory cell to NU
13ff0 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  LL.  */.  if( eD
14000 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
14010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14020 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
14030 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  g8, 0, 0);.    s
14040 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14050 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
14060 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
14070 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70    /* Open a temp
14080 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
14090 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
140a0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
140b0 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
140c0 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
140d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
140e0 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64  .    openTempInd
140f0 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69  ex(pParse, p, di
14100 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65  stinct, 0);.  }e
14110 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
14120 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
14130 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
14140 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
14150 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
14160 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
14170 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
14180 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  here, 0, .      
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f        pGroupBy ?
141b0 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b   0 : &pOrderBy);
141c0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
141d0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
141e0 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68  nd;..  /* Use th
141f0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
14200 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20   loop if we are 
14210 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68  not dealing with
14220 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
14230 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
14240 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65  gg ){.    if( se
14250 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
14260 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
14270 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
14280 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
14290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
142a0 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
142b0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
142c0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
142d0 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67  aff) ){.       g
142e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
142f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14300 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
14310 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
14320 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73  s, then do the s
14330 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
14340 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
14350 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
14360 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 70 41  .    AggExpr *pA
14370 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  gg;.    if( pGro
14380 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
14390 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f  t lbl1;.      fo
143a0 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
143b0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
143c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
143d0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
143e0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
143f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
14400 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e       /* No affin
14410 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 74  ity string is at
14420 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f  tached to the fo
14430 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 52  llowing OP_MakeR
14440 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a 20  ecord .      ** 
14450 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f  because we do no
14460 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79  t need to do any
14470 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74   coercion of dat
14480 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20  atypes. */.     
14490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
144a0 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
144b0 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  rd, pGroupBy->nE
144c0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c  xpr, 0);.      l
144d0 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bl1 = sqlite3Vdb
144e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
144f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14500 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
14510 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a  ocus, 0, lbl1);.
14520 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
14530 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67  Agg=pParse->aAgg
14540 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
14550 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a  ; i++, pAgg++){.
14560 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
14570 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ->isAgg ) contin
14580 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
14590 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
145a0 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72 29  se, pAgg->pExpr)
145b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
145c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
145d0 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a  _AggSet, 0, i);.
145e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
145f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14600 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a  Label(v, lbl1);.
14610 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
14620 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e  0, pAgg=pParse->
14630 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e  aAgg; i<pParse->
14640 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b  nAgg; i++, pAgg+
14650 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
14660 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  pE;.      int nE
14670 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e 63 44  xpr;.      FuncD
14680 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20  ef *pDef;.      
14690 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41 67 67  if( !pAgg->isAgg
146a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
146b0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d     assert( pAgg-
146c0 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20  >pFunc!=0 );.   
146d0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d     assert( pAgg-
146e0 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30  >pFunc->xStep!=0
146f0 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d   );.      pDef =
14700 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20 20   pAgg->pFunc;.  
14710 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d 3e 70      pE = pAgg->p
14720 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
14730 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
14740 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
14750 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
14760 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  ON );.      nExp
14770 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
14780 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
14790 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a  se, pE->pList);.
147a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
147b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
147c0 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
147d0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
147e0 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
147f0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
14800 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ll = 0;.        
14810 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
14820 6f 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20 26  or(j=0; !pColl &
14830 26 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  & j<nExpr; j++){
14840 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
14850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14860 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
14870 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  ->pList->a[j].pE
14880 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
14890 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
148a0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  ll ) pColl = pPa
148b0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
148c0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ll;.        sqli
148d0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
148e0 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
148f0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
14900 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  3_COLLSEQ);.    
14910 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14920 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41  3VdbeOp3(v, OP_A
14930 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72  ggFunc, 0, nExpr
14940 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50  , (char*)pDef, P
14950 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
14960 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20  }.  }..  /* End 
14970 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
14980 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73  n loop..  */.  s
14990 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
149a0 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66  WInfo);..  /* If
149b0 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69   we are processi
149c0 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77  ng aggregates, w
149d0 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70  e need to set up
149e0 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20   a second loop. 
149f0 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
14a00 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61  the aggregate va
14a10 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73  lues and process
14a20 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   them..  */.  if
14a30 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ( isAgg ){.    i
14a40 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69  nt endagg = sqli
14a50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14a60 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  (v);.    int sta
14a70 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74  rtagg;.    start
14a80 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62  agg = sqlite3Vdb
14a90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
14aa0 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29  Next, 0, endagg)
14ab0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
14ac0 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66  eAgg = 1;.    if
14ad0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
14ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
14af0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
14b00 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c  aving, startagg,
14b10 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
14b20 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
14b30 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
14b40 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
14b50 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
14b60 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
14b70 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
14b80 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61  , startagg, enda
14b90 67 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20  gg, aff) ){.    
14ba0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
14bb0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  d;.    }.    sql
14bc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14bd0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61   OP_Goto, 0, sta
14be0 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  rtagg);.    sqli
14bf0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14c00 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a  bel(v, endagg);.
14c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14c20 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
14c30 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72   0, 0);.    pPar
14c40 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
14c50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14c60 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
14c70 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
14c80 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
14c90 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
14ca0 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
14cb0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
14cc0 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
14cd0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14ce0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
14cf0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
14d00 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
14d10 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
14d20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
14d30 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65  his was a subque
14d40 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20  ry, we have now 
14d50 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75  converted the su
14d60 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20  bquery into a.  
14d70 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
14d80 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74  le.  So delete t
14d90 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72 75  he subquery stru
14da0 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70  cture from the p
14db0 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72  arent.  ** to pr
14dc0 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71 75  event this subqu
14dd0 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
14de0 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
14df0 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a  nd to force the.
14e00 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20    ** the use of 
14e10 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14e20 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
14e30 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
14e40 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
14e50 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
14e60 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
14e70 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
14e80 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
14e90 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
14ea0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14eb0 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50  elete(p);.    pP
14ec0 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
14ed0 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
14ee0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
14ef0 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
14f00 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
14f10 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
14f20 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
14f30 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
14f40 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
14f50 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
14f60 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
14f70 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
14f80 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
14f90 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
14fa0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
14fb0 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
14fc0 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
14fd0 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
14fe0 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
14ff0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
15000 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.