/ Hex Artifact Content
Login

Artifact 7d77a8bed7eeac23216d42fc1be006fb4352fcdc:


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 37 34  select.c,v 1.174
0200: 20 32 30 30 34 2f 30 35 2f 32 31 20 30 33 3a 30   2004/05/21 03:0
0210: 31 3a 35 39 20 64 72 68 20 45 78 70 20 24 0a 2a  1:59 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 2a 0a 2a  the sorter..**.*
2490: 2a 20 46 49 58 20 4d 45 3a 20 20 43 68 61 6e 67  * FIX ME:  Chang
24a0: 65 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 69  e this so that i
24b0: 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f 4d 61  t uses the OP_Ma
24c0: 6b 65 4b 65 79 20 6f 70 63 6f 64 65 0a 2a 2a 20  keKey opcode.** 
24d0: 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 53 6f  instead of OP_So
24e0: 72 74 4d 61 6b 65 4b 65 79 2e 20 20 44 65 6c 65  rtMakeKey.  Dele
24f0: 74 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 4d 61  te the OP_SortMa
2500: 6b 65 4b 65 79 20 6f 70 63 6f 64 65 2e 0a 2a 2a  keKey opcode..**
2510: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 73 20 73 68 6f   All columns sho
2520: 75 6c 64 20 68 61 76 65 20 61 66 66 69 6e 69 74  uld have affinit
2530: 79 20 4e 4f 4e 45 2e 20 20 48 61 6e 64 6c 65 20  y NONE.  Handle 
2540: 41 53 43 20 76 65 72 73 75 73 0a 2a 2a 20 44 45  ASC versus.** DE
2550: 53 43 20 73 6f 72 74 20 6f 72 64 65 72 20 62 79  SC sort order by
2560: 20 64 65 66 69 6e 69 6e 67 20 61 20 6c 69 73 74   defining a list
2570: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   of comparison f
2580: 75 6e 63 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 62  unctions to.** b
2590: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  e used by the OP
25a0: 5f 53 6f 72 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f  _Sort opcode..*/
25b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
25c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73  hOntoSorter(Pars
25d0: 65 20 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20  e *pParse, Vdbe 
25e0: 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *v, ExprList *pO
25f0: 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69  rderBy){.  int i
2600: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2610: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
2620: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
2630: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2640: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2650: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73  .pExpr);.  }.  s
2660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2670: 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
2680: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2690: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
26a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
26b0: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
26c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
26d0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
26e0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
26f0: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
2700: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
2710: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
2720: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
2730: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
2740: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
2750: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
2760: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
2770: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2780: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
2790: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
27a0: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
27b0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
27c0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
27d0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
27e0: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
27f0: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
2800: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
2810: 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65  c int selectInne
2820: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
2830: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2840: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2850: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2860: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2870: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
2880: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
2890: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
28a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
28b0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
28c0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
28d0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
28e0: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2900: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
2910: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2920: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
2930: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2940: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2950: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
2960: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2970: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
2980: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
2990: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
29a0: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
29b0: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
29c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
29d0: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
29e0: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
29f0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
2a20: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
2a30: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
2a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2a50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2a60: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
2a70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
2a80: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
2a90: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
2aa0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
2ab0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
2ac0: 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20  reak,           
2ad0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2ae0: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
2af0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
2b00: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
2b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66             /* af
2b20: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66  finity string if
2b30: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
2b40: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ion */.){.  Vdbe
2b50: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2b60: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  dbe;.  int i;.. 
2b70: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2b80: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2b90: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2ba0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2bb0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2bc0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2bd0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2be0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2bf0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2c00: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2c10: 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
2c20: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2c30: 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
2c40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
2c50: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2c60: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2c70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2c90: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66  MemIncr, p->iOff
2ca0: 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  set, addr+2);.  
2cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
2cd0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
2ce0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2cf0: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
2d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
2d20: 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  cr, p->iLimit, i
2d30: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
2d40: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
2d50: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
2d60: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ns..  */.  if( n
2d70: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
2d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
2d90: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2db0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2dc0: 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d  rcTab, i);.    }
2dd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
2de0: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
2df0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
2e00: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
2e10: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2e20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2e30: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
2e40: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2e50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2e60: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
2e70: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
2e80: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
2e90: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
2ea0: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
2eb0: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
2ec0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
2ed0: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
2ee0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
2ef0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
2f00: 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70  distinct>=0 && p
2f10: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
2f20: 3e 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66 20  >nExpr>0 ){.#if 
2f30: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
2f40: 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 33  INCT.    sqlite3
2f50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f60: 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d  IsNull, -pEList-
2f70: 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65 33 56  >nExpr, sqlite3V
2f80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f90: 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  )+7);.#endif.   
2fa0: 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65 6c 79   /* Deliberately
2fb0: 20 6c 65 61 76 65 20 74 68 65 20 61 66 66 69 6e   leave the affin
2fc0: 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66 20 6f  ity string off o
2fd0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2fe0: 4f 50 5f 4d 61 6b 65 4b 65 79 20 2a 2f 0a 20 20  OP_MakeKey */.  
2ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3000: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
3010: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
3020: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3040: 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e  Distinct, distin
3050: 63 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ct, sqlite3VdbeC
3060: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
3070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
3090: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  , pEList->nExpr+
30a0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
30b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
30c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
30d0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
30e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
30f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3120: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3130: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74   0);.  }..  swit
3140: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
3150: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
3160: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
3170: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
3180: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
3190: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
31a0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
31b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
31c0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ion: {.      sql
31d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
31e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
31f0: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3200: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
3210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3220: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
3230: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
3240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3260: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3280: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3290: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
32c0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
32d0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
32e0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
32f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
3300: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
3310: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
3320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3330: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3340: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3350: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3360: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3370: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3380: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3390: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
33a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
33b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
33c0: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
33d0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
33e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33f0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
3400: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3410: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3420: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50  OP_PutIntKey, iP
3430: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
3440: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3450: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
3460: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
3470: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
3480: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
3490: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
34a0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
34b0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
34c0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
34d0: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
34e0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
34f0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
3500: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
3510: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
3520: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
3530: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3550: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3560: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3570: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71  TINCT);.      sq
3580: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3590: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
35a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
35b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35c0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
35d0: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
35e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
3600: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b  lete, iParm, 0);
3610: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3620: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77    }..    /* If w
3630: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
3640: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
3650: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
3660: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
3670: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
3680: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
3690: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
36a0: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
36b0: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
36c0: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
36d0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
36e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
36f0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
3700: 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
3710: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
3720: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
3730: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
3740: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
3750: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
3760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3770: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
3780: 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20  , addr1+3);.    
3790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37a0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
37b0: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32   0);.      addr2
37c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
37d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
37e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
37f0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3800: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
3810: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
3820: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
3830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
3840: 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66 53 74  har const *affSt
3850: 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  r;.        char 
3860: 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36  aff = (iParm>>16
3870: 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  )&0xFF;.        
3880: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
3890: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
38a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
38b0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 61   aff);.        a
38c0: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
38d0: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66  ffinityString(af
38e0: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
38f0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
3900: 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 2c 20  _MakeKey, 1, 0, 
3910: 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54 49  affStr, P3_STATI
3920: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
3930: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3940: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
3950: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3960: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3970: 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50 61  _PutStrKey, (iPa
3980: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
3990: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
39a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
39b0: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c 20  ngeP2(v, addr2, 
39c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
39d0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
39e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
39f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
3a00: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
3a10: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
3a20: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
3a30: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
3a40: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
3a50: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
3a60: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
3a70: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
3a80: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
3a90: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
3aa0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
3ab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
3ac0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
3ad0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
3ae0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
3af0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
3b00: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
3b10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3b30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
3b40: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
3b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3b60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
3b70: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
3b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3b90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3ba0: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
3bb0: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
3bc0: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  k function..    
3bd0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3be0: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
3bf0: 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20 7b  se SRT_Sorter: {
3c00: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3c10: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
3c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3c30: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3c40: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3c50: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
3c60: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
3c70: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
3c80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3c90: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
3ca0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b 0a  SRT_Callback );.
3cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3cd0: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
3ce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3d00: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
3d10: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
3d20: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
3d30: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
3d40: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
3d50: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
3d60: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
3d70: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
3d80: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
3d90: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3da0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
3db0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3dc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3dd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3de0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3df0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3e00: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3e10: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3e20: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3e30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3e50: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
3e60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
3e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3e80: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ..    /* Discard
3e90: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
3ea0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
3eb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ec0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
3ed0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
3ee0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
3ef0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
3f00: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
3f10: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
3f20: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
3f30: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
3f40: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
3f50: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
3f60: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
3f70: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
3f80: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
3f90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
3fa0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
3fb0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3fe0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4010: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4020: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4030: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4040: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
4050: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
4060: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
4070: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
4080: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
4090: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
40a0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
40b0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
40c0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
40d0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
40e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
40f0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4100: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4110: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4120: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4130: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4150: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
4160: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
4170: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4180: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4190: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
41a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
41b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
41c0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
41d0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
41e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
41f0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4200: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
4210: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4220: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4230: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4240: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4250: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4260: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4270: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4280: 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69 74  int end1 = sqlit
4290: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
42a0: 76 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d  v);.  int end2 =
42b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
42c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
42d0: 61 64 64 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  addr;.  KeyInfo 
42e0: 2a 70 49 6e 66 6f 3b 0a 20 20 45 78 70 72 4c 69  *pInfo;.  ExprLi
42f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20  st *pOrderBy;.  
4300: 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73  int nCol, i;.  s
4310: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
4320: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65  se->db;..  if( e
4330: 44 65 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72  Dest==SRT_Sorter
4340: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72   ) return;.  pOr
4350: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
4360: 72 42 79 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f  rBy;.  nCol = pO
4370: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
4380: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d   pInfo = sqliteM
4390: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
43a0: 49 6e 66 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69  Info) + nCol*(si
43b0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
43c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
43d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43e0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
43f0: 72 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 66  r = (char*)&pInf
4400: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a  o->aColl[nCol];.
4410: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
4420: 3d 20 6e 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  = nCol;.  for(i=
4430: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
4440: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  .    pInfo->aCol
4450: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
4460: 43 6f 6c 6c 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Coll;.    pInfo-
4470: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
4480: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
4490: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  sortOrder;.  }. 
44a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
44b0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30  v, OP_Sort, 0, 0
44c0: 2c 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20  , (char*)pInfo, 
44d0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
44e0: 46 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  FF);.  addr = sq
44f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4500: 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30  , OP_SortNext, 0
4510: 2c 20 65 6e 64 31 29 3b 0a 20 20 69 66 28 20 70  , end1);.  if( p
4520: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a  ->iOffset>=0 ){.
4530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4540: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4550: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
4560: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c  addr+4);.    sql
4570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4580: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
4590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
45a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
45b0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20   0, addr);.  }. 
45c0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d   if( p->iLimit>=
45d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
45e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45f0: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d  MemIncr, p->iLim
4600: 69 74 2c 20 65 6e 64 32 29 3b 0a 20 20 7d 0a 20  it, end2);.  }. 
4610: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
4620: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
4630: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
4640: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
4650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4660: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
4670: 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29  Recno, iParm, 0)
4680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
46a0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
46b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
46c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
46d0: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
46e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
46f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  }.    case SRT_S
4700: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
4710: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4720: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4730: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4740: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69  otNull, -1, sqli
4750: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4760: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
4770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4780: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
47a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
47b0: 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Goto, 0, sqlite3
47c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
47d0: 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  v)+3);.      sql
47e0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
47f0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 2c  P_MakeKey, 1, 0,
4800: 20 22 6e 22 2c 20 50 33 5f 53 54 41 54 49 43 29   "n", P3_STATIC)
4810: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4820: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4830: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
4840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4850: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
4860: 72 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30  rKey, (iParm&0x0
4870: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
4880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4890: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
48a0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
48b0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
48c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
48d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
48e0: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
48f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4910: 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Goto, 0, end1);.
4920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4930: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4940: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
4950: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
4960: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e: {.      int i
4970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4980: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4990: 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73  nteger, p->pELis
49a0: 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->nExpr, 0);.  
49b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
49c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
49d0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   1, 0);.      fo
49e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
49f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a10: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d  (v, OP_Column, -
4a20: 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  1-i, i);.      }
4a30: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
4a40: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
4a50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4a70: 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75  _Callback, nColu
4a80: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  mn, 0);.      }e
4a90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4aa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4ab0: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
4ac0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
4ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4af0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  2, 0);.      bre
4b00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4b10: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
4b20: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
4b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4b40: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4b50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4b60: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a  Goto, 0, addr);.
4b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
4b80: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
4b90: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
4ba0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4bb0: 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
4bc0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4bd0: 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73  el(v, end1);.  s
4be0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4bf0: 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c  v, OP_SortReset,
4c00: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
4c10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
4c20: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
4c30: 65 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74  e VDBE the datat
4c40: 79 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  ypes of.** colum
4c50: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
4c60: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
4c70: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65   routine only ge
4c80: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20  nerates code if 
4c90: 74 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77  the "PRAGMA show
4ca0: 5f 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a  _datatypes=on".*
4cb0: 2a 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75  * has been execu
4cc0: 74 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79  ted.  The dataty
4cd0: 70 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  pes are reported
4ce0: 20 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f   out in the azCo
4cf0: 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74  l.** parameter t
4d00: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
4d10: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
4d20: 72 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e  rst N azCol[] en
4d30: 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65  tries.** are the
4d40: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
4d50: 6c 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73  lumns, and the s
4d60: 65 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20  econd N entries 
4d70: 61 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  are the.** datat
4d80: 79 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  ypes for the col
4d90: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  umns..**.** The 
4da0: 22 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61  "datatype" for a
4db0: 20 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20   result that is 
4dc0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79  a column of a ty
4dd0: 70 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74  pe is the.** dat
4de0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
4df0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4e00: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
4e10: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54   statement..** T
4e20: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
4e30: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
4e40: 20 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20   either TEXT or 
4e50: 4e 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a  NUMERIC.  The.**
4e60: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20   datatype for a 
4e70: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
4e80: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
4e90: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
4ea0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
4eb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4ec0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
4ed0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
4ee0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
4ef0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
4f00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
4f10: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
4f20: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
4f30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
4f40: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4f50: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4f60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
4f70: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
4f80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4f90: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
4fa0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
4fb0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
4fc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  = 0;.    if( p==
4fd0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
4fe0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
4ff0: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
5000: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
5010: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
5020: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
5030: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
5040: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
5050: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
5060: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
5070: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
5080: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
5090: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
50a0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
50b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
50c0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
50d0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
50e0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
50f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5100: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
5110: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5120: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
5130: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
5140: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
5150: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c  EGER";.      }el
5160: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70  se{.        zTyp
5170: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
5180: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
5190: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
51a0: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
51b0: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 29 20  ite3ExprType(p) 
51c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
51d0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
51e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
51f0: 58 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  XT";    break;. 
5200: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
5210: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20  TE_AFF_NUMERIC: 
5220: 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d 45 52 49   zType = "NUMERI
5230: 43 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C"; break;.     
5240: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
5260: 70 65 20 3d 20 22 41 4e 59 22 3b 20 20 20 20 20  pe = "ANY";     
5270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5280: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5290: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
52a0: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b 20 70 45  lumnName, i + pE
52b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20  List->nExpr, 0, 
52c0: 7a 54 79 70 65 2c 20 30 29 3b 0a 20 20 7d 0a 7d  zType, 0);.  }.}
52d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
52e0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
52f0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
5300: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
5310: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
5320: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
5330: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
5340: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
5350: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
5360: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
5370: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
5380: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
5390: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
53a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
53b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
53c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
53d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
53e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
53f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5400: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5410: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5420: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5430: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5440: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5450: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
5460: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
5470: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
5480: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
5490: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
54a0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
54b0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
54c0: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   v==0 || sqlite3
54d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
54e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
54f0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
5500: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
5510: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
5520: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
5530: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
5540: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
5550: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
5560: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
5570: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
5580: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5590: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
55a0: 20 69 6e 74 20 70 32 20 3d 20 69 3d 3d 70 45 4c   int p2 = i==pEL
55b0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20  ist->nExpr-1;.  
55c0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
55d0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
55e0: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
55f0: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
5600: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
5610: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
5620: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
5630: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
5640: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
5650: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
5660: 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  i, p2, zName, 0)
5670: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
5680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5690: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
56a0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
56b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
56c0: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
56d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
56e0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
56f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
5700: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5710: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
5720: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
5730: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
5740: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
5750: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
5760: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
5770: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
5780: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
5790: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
57a0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
57b0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
57c0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
57d0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
57e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
57f0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
5800: 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22  zCol = "_ROWID_"
5810: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5820: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
5830: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5840: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
5850: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
5860: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
5870: 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26  s && p->span.z &
5880: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
5890: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
58a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
58b0: 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op3(v,OP_ColumnN
58c0: 61 6d 65 2c 20 69 2c 20 70 32 2c 20 70 2d 3e 73  ame, i, p2, p->s
58d0: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
58e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
58f0: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
5900: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ace(v, addr);.  
5910: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
5920: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f  llNames || (!sho
5930: 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c  rtNames && pTabL
5940: 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a  ist->nSrc>1) ){.
5950: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
5960: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
5970: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20   char *zTab;. . 
5980: 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54         zTab = pT
5990: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c  abList->a[j].zAl
59a0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
59b0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54   fullNames || zT
59c0: 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70  ab==0 ) zTab = p
59d0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
59e0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
59f0: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61  ring(&zName, zTa
5a00: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29  b, ".", zCol, 0)
5a10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5a20: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
5a30: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32  olumnName, i, p2
5a40: 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41  , zName, P3_DYNA
5a50: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
5a60: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5a70: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
5a80: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70  ColumnName, i, p
5a90: 32 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  2, zCol, 0);.   
5aa0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
5ab0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
5ac0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
5ad0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
5ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
5af0: 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  v,OP_ColumnName,
5b00: 20 69 2c 20 70 32 2c 20 70 2d 3e 73 70 61 6e 2e   i, p2, p->span.
5b10: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
5b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b30: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
5b40: 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73   addr);.    }els
5b50: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
5b60: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
5b70: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
5b80: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
5b90: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
5ba0: 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22  sprintf(zName, "
5bb0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
5bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5bd0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  beOp3(v, OP_Colu
5be0: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a  mnName, i, p2, z
5bf0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
5c00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d    }.}../*.** Nam
5c10: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
5c20: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
5c30: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
5c40: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
5c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
5c60: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
5c70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
5c80: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
5c90: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
5ca0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
5cb0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
5cc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
5cd0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
5ce0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
5cf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
5d00: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
5d10: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
5d20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
5d30: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
5d40: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
5d50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
5d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
5d70: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
5d80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
5d90: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61  lInColumnList(Pa
5da0: 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  rse*, Select*);.
5db0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
5dc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
5dd0: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
5de0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
5df0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
5e00: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
5e10: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
5e20: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
5e30: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
5e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
5e50: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53  har *zTabName, S
5e60: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
5e70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
5e80: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
5e90: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
5ea0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 0a    Column *aCol;.
5eb0: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
5ec0: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
5ed0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
5ee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5ef0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
5f00: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
5f10: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
5f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5f30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
5f40: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
5f50: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
5f60: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
5f70: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
5f80: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
5f90: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
5fa0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
5fb0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
5fc0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
5fd0: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
5fe0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  Malloc( sizeof(p
5ff0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
6000: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f  ab->nCol );.  fo
6010: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
6020: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  Col; i++){.    E
6030: 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20  xpr *p, *pR;.   
6040: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
6050: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
6060: 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d   aCol[i].zName =
6070: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 45   sqliteStrDup(pE
6080: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6090: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
60a0: 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   (p=pEList->a[i]
60b0: 2e 70 45 78 70 72 29 2d 3e 6f 70 3d 3d 54 4b 5f  .pExpr)->op==TK_
60c0: 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  DOT .           
60d0: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
60e0: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
60f0: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
6100: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
6110: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
6120: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
6130: 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ing(&aCol[i].zNa
6140: 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c  me, pR->token.z,
6150: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29   pR->token.n, 0)
6160: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e  ;.      for(j=cn
6170: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
6180: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6190: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
61a0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69  j].zName, aCol[i
61b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
61c0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
61d0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
61e0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20  Buf[30];.       
61f0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
6200: 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20  "_%d",++cnt);.  
6210: 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c          n = strl
6220: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  en(zBuf);.      
6230: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
6240: 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a  tring(&aCol[i].z
6250: 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e  Name, pR->token.
6260: 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  z, pR->token.n, 
6270: 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20 20 20  zBuf,n,0);.     
6280: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
6290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
62a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
62b0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
62c0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
62d0: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
62e0: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
62f0: 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e  .zName, p->span.
6300: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29  z, p->span.n, 0)
6310: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6320: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
6330: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
6340: 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  zBuf, "column%d"
6350: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54  , i+1);.      pT
6360: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
6370: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6380: 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  (zBuf);.    }.  
6390: 20 20 0a 20 20 20 20 2f 2a 20 41 66 66 69 6e 69    .    /* Affini
63a0: 74 79 20 69 73 20 61 6c 77 61 79 73 20 4e 4f 4e  ty is always NON
63b0: 45 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 6e  E, as there is n
63c0: 6f 20 74 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a  o type name. */.
63d0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
63e0: 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ].affinity = SQL
63f0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6400: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
6410: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
6420: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  Tab;.}../*.** Fo
6430: 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
6440: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f  CT statement, do
6450: 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a   three things..*
6460: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c  *.**    (1)  Fil
6470: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
6480: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
6490: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
64a0: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
64b0: 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20 73     defines the s
64c0: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
64d0: 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e  t should be scan
64e0: 6e 65 64 2e 20 20 46 6f 72 20 76 69 65 77 73 2c  ned.  For views,
64f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
6500: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
6510: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
6520: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
6530: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
6540: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
6550: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
6560: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
6570: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
6580: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
6590: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
65a0: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
65b0: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
65c0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
65d0: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
65e0: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
65f0: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
6600: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
6610: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
6620: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
6630: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  w..**.**    (2) 
6640: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
6650: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6660: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
6670: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6680: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
6690: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
66a0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
66b0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
66c0: 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74 68      (3)  Scan th
66d0: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
66e0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
66f0: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
6700: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
6710: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
6720: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
6730: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
6740: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
6750: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
6760: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
6770: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6780: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
6790: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
67a0: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
67b0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
67c0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
67d0: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
67e0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
67f0: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
6800: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
6810: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
6820: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6840: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
6850: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6860: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6870: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
6880: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6890: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
68a0: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
68b0: 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d  *pTab;..  if( p=
68c0: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
68d0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
68e0: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
68f0: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
6900: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c  >pEList;..  /* L
6910: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
6920: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6930: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  list..  */.  for
6940: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
6950: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
6960: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6970: 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20  a[i].pTab ){.   
6980: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
6990: 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
69a0: 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e!  No need to c
69b0: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20  ontinue */.     
69c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
69d0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
69e0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
69f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
6a00: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
6a10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
6a20: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
6a30: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
6a40: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21  t->a[i].pSelect!
6a50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
6a60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6a70: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
6a80: 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61      char zFakeNa
6a90: 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20  me[60];.        
6aa0: 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d  sprintf(zFakeNam
6ab0: 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  e, "sqlite_subqu
6ac0: 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20  ery_%p_",.      
6ad0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62       (void*)pTab
6ae0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6af0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
6b00: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
6b10: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
6b20: 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c  lias, zFakeName,
6b30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
6b40: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6b50: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
6b60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6b70: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
6b80: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
6b90: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
6ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73           pTabLis
6bd0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  t->a[i].pSelect)
6be0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
6bf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
6c00: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
6c10: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
6c20: 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69  Transient flag i
6c30: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
6c40: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
6c50: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
6c60: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
6c70: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
6c80: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
6c90: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
6ca0: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
6cb0: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
6cc0: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
6cd0: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
6ce0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
6cf0: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
6d00: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
6d10: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
6d20: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
6d30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6d40: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
6d50: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
6d60: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
6d70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
6d80: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6d90: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
6da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
6db0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
6dc0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6dd0: 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61  Name,pTabList->a
6de0: 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
6df0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6e00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
6e10: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6e20: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
6e30: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
6e40: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
6e50: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
6e60: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
6e70: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
6e80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
6e90: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
6ea0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
6eb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
6ec0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
6ed0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
6ee0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6ef0: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
6f00: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
6f10: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
6f20: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
6f30: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
6f40: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
6f50: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
6f60: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
6f70: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
6f80: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
6f90: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
6fa0: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
6fb0: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
6fc0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6fd0: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
6fe0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d  t->a[i].pSelect=
6ff0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7000: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7010: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7020: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
7030: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7040: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7050: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
7060: 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
7070: 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
7080: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
7090: 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
70a0: 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73  if( sqliteProces
70b0: 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
70c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
70d0: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
70e0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
70f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
7100: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
7110: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
7120: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
7130: 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
7140: 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
7150: 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
7160: 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
7170: 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
7180: 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
7190: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
71a0: 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
71b0: 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
71c0: 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
71d0: 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
71e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
71f0: 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
7200: 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
7210: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
7220: 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
7230: 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
7240: 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
7250: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
7260: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
7270: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
7280: 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
7290: 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
72a0: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
72b0: 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
72c0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
72d0: 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
72e0: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
72f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
7300: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
7310: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
7320: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
7330: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
7340: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
7350: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
7360: 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
7370: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
7380: 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
7390: 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
73a0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
73b0: 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
73c0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20    rc = 0;.  if( 
73d0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
73e0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
73f0: 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
7400: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
7410: 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
7420: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
7430: 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
7440: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
7450: 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
7460: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
7470: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
7480: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7490: 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
74a0: 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
74b0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
74c0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
74d0: 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
74e0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
74f0: 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b  w = 0;.    for(k
7500: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
7510: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
7520: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
7530: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
7540: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
7550: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
7560: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
7570: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
7580: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
7590: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
75a0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
75b0: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
75c0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
75d0: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
75e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
75f0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
7600: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7610: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
7620: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
7630: 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
7640: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
7650: 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
7660: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
7670: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
7680: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
7690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
76a0: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
76b0: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
76c0: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
76d0: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
76e0: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
76f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
7700: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
7710: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
7720: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
7730: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b  s */.        Tok
7740: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20  en *pName;      
7750: 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
7760: 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
7770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
7780: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
7790: 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  E->pLeft ){.    
77a0: 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70        pName = &p
77b0: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  E->pLeft->token;
77c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
77d0: 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20            pName 
77e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
77f0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
7800: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
7810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7820: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7830: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7840: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Tab;.          c
7850: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
7860: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
7870: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
7880: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
7890: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
78a0: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
78b0: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
78c0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
78d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
78e0: 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a   if( pName && (z
78f0: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
7900: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20  abName[0]==0 || 
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7920: 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d    sqlite3StrNICm
7930: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62  p(pName->z, zTab
7940: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21  Name, pName->n)!
7950: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  =0 ||.          
7960: 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b         zTabName[
7970: 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b  pName->n]!=0) ){
7980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
7990: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
79a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
79b0: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
79c0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
79d0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
79e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
79f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65  xpr *pExpr, *pLe
7a00: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
7a10: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
7a20: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
7a30: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
7a40: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
7a50: 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   && (pTabList->a
7a60: 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  [i-1].jointype &
7a70: 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
7a80: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
7a90: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
7aa0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7ab0: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
7ac0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7ad0: 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
7ae0: 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
7af0: 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
7b00: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
7b10: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e       ** table on
7b20: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
7b40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
7b50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7b60: 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69 74  if( i>0 && sqlit
7b70: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54  e3IdListIndex(pT
7b80: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70  abList->a[i-1].p
7b90: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
7ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7bb0: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
7bc0: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
7bd0: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
7be0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
7bf0: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
7c00: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
7c10: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7c20: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
7c30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7c50: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
7c60: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
7c70: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
7c80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
7c90: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7cb0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  ght->token.z = z
7cc0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7cd0: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7ce0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
7cf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
7d00: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  Right->token.dyn
7d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7d20: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
7d30: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
7d40: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
7d50: 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
7d60: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
7d70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
7d80: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
7d90: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
7da0: 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
7db0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7dc0: 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
7dd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7de0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
7df0: 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d  oken.z = zTabNam
7e00: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
7e10: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20   pLeft->token.n 
7e20: 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d  = strlen(zTabNam
7e30: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
7e40: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64    pLeft->token.d
7e50: 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
7e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
7e70: 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a 29 26  String((char**)&
7e80: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a  pExpr->span.z, z
7e90: 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e  TabName, ".", zN
7ea0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
7eb0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
7ec0: 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45  an.n = strlen(pE
7ed0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  xpr->span.z);.  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7ef0: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
7f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f10: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
7f20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
7f30: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
7f40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7f50: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
7f60: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7f70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
7f90: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
7fa0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
7fb0: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
7fc0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
7fd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
7fe0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
7ff0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
8000: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
8010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8020: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
8030: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
8040: 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20        if( pName 
8050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
8060: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8070: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
8080: 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d  table: %T", pNam
8090: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
80a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
80b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
80c0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
80d0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
80e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
80f0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
8100: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8110: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8120: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8130: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
8140: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
8150: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8170: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
8180: 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53  ly unlinks the S
8190: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
81a0: 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  Tab pointers.** 
81b0: 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75  in a select stru
81c0: 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20  cture.  It just 
81d0: 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  sets the pointer
81e0: 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  s to NULL.  This
81f0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72  .** routine is r
8200: 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20  ecursive in the 
8210: 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68  sense that if th
8220: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
8230: 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69  ].pSelect.** poi
8240: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
8250: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
8260: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
8270: 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69  vely on that poi
8280: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
8290: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
82a0: 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74  ed on the Select
82b0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
82c0: 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45  defines a.** VIE
82d0: 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e  W in order to un
82e0: 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20  do any bindings 
82f0: 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73  to tables.  This
8300: 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a   is necessary.**
8310: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
8320: 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44  ables might be D
8330: 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65  ROPed by a subse
8340: 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e  quent SQL comman
8350: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e  d..** If the bin
8360: 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65  dings are not re
8370: 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20  moved, then the 
8380: 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d  Select.pSrc->a[]
8390: 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77  .pTab field.** w
83a0: 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
83b0: 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f  ting to a deallo
83c0: 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75  cated Table stru
83d0: 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a  cture after the.
83e0: 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f  ** DROP and a co
83f0: 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75  redump will occu
8400: 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  r the next time 
8410: 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64  the VIEW is used
8420: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8430: 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65  3SelectUnbind(Se
8440: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
8450: 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  i;.  SrcList *pS
8460: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
8470: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
8480: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
8490: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
84a0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
84b0: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d  .    if( (pTab =
84c0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
84d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
84e0: 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ( pTab->isTransi
84f0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ent ){.        s
8500: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
8510: 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  e(0, pTab);.    
8520: 20 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e    }.      pSrc->
8530: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20  a[i].pTab = 0;. 
8540: 20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61       if( pSrc->a
8550: 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20  [i].pSelect ){. 
8560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
8570: 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d  lectUnbind(pSrc-
8580: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
8590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
85a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
85b0: 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74  routine associat
85c0: 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e  es entries in an
85d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
85e0: 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a  sion list with.*
85f0: 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72  * columns in a r
8600: 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68  esult.  For each
8610: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
8620: 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65  sion, the opcode
8630: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
8640: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61  evel node is cha
8650: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
8660: 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d  N and the iColum
8670: 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  n value of.** th
8680: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
8690: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
86a0: 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  th column number
86b0: 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a   and the iTable.
86c0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
86d0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
86e0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54  s filled with iT
86f0: 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  able parameter..
8700: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
8710: 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20  re prior SELECT 
8720: 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72  clauses, they ar
8730: 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73  e processed firs
8740: 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69  t.  A match.** i
8750: 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c  n an earlier SEL
8760: 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64  ECT takes preced
8770: 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65  ence over a late
8780: 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  r SELECT..**.** 
8790: 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64  Any entry that d
87a0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73  oes not match is
87b0: 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65   flagged as an e
87c0: 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  rror.  The numbe
87d0: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69  r.** of errors i
87e0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
87f0: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
8800: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
8810: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
8830: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
8840: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
8850: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
8860: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
8870: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
8880: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
8890: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
88a0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
88b0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
88c0: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
88d0: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
88e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
88f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8900: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
8910: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
8920: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
8930: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
8940: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
8950: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
8960: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
8970: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
8980: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8990: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
89a0: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
89b0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
89c0: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
89d0: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
89e0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
89f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
8a00: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8a10: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
8a20: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
8a30: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
8a40: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
8a50: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
8a60: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
8a70: 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f  {.    if( matchO
8a80: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
8a90: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
8aa0: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
8ab0: 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
8ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8ad0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
8ae0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
8af0: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
8b00: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8b10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8b20: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
8b30: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
8b40: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
8b50: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
8b60: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
8b70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8b80: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
8b90: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
8ba0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
8bb0: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
8bc0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
8bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8be0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
8bf0: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
8c00: 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20   BY position %d 
8c10: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
8c20: 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20  n 1 and %d",.   
8c30: 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c         iCol, pEL
8c40: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
8c50: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
8c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d    }.      if( !m
8c80: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f  ustComplete ) co
8c90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43  ntinue;.      iC
8ca0: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
8cb0: 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20  for(j=0; iCol<0 
8cc0: 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  && j<pEList->nEx
8cd0: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
8ce0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  if( pEList->a[j]
8cf0: 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f  .zName && (pE->o
8d00: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e  p==TK_ID || pE->
8d10: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29  op==TK_STRING) )
8d20: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
8d30: 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a  zName, *zLabel;.
8d40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8d50: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
8d60: 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  me;.        asse
8d70: 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20  rt( pE->token.z 
8d80: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65  );.        zLabe
8d90: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
8da0: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
8db0: 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  E->token.n);.   
8dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
8dd0: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
8de0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8df0: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
8e00: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
8e10: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
8e20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8e30: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8e40: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
8e50: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
8e60: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
8e70: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
8e80: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
8e90: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
8ea0: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
8eb0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
8ec0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
8ed0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
8ee0: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
8ef0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
8f00: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
8f10: 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  le;.      pOrder
8f20: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
8f30: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
8f40: 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43   iCol<0 && mustC
8f50: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
8f60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8f70: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
8f80: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
8f90: 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e  number %d does n
8fa0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73  ot match any res
8fb0: 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31  ult column", i+1
8fc0: 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  );.      nErr++;
8fd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8fe0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8ff0: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
9000: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
9010: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
9020: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
9030: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
9040: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
9050: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9060: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
9070: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
9080: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
9090: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
90a0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
90b0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
90c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
90d0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
90e0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
90f0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
9100: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
9110: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
9120: 6e 20 76 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f  n v;.}..#if 0  /
9130: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
9140: 6e 65 20 6e 65 65 64 73 20 64 65 6c 65 74 69 6e  ne needs deletin
9150: 67 20 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  g *****/.static 
9160: 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74  void multiSelect
9170: 41 66 66 69 6e 69 74 79 28 53 65 6c 65 63 74 20  Affinity(Select 
9180: 2a 70 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b  *p, char *zAff){
9190: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
91a0: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
91b0: 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66 69 6e  multiSelectAffin
91c0: 69 74 79 28 70 2d 3e 70 50 72 69 6f 72 2c 20 7a  ity(p->pPrior, z
91d0: 41 66 66 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Aff);..  for(i=0
91e0: 3b 20 69 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ; i<p->pEList->n
91f0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9200: 69 66 28 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c 30  if( zAff[i]=='\0
9210: 27 20 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b  ' ){.      zAff[
9220: 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
9230: 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
9240: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
9250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9260: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  dif../*.** Compu
9270: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
9280: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
9290: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
92a0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e  ased on the.** n
92b0: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
92c0: 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69  t fields.  nLimi
92d0: 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f  t and nOffset ho
92e0: 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a  ld the integers.
92f0: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
9300: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
9310: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
9320: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
9330: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
9340: 72 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f  rds.  Or that ho
9350: 6c 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74  ld -1 and 0 if t
9360: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
9370: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c  e omitted..** iL
9380: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
9390: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
93a0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
93b0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20   numbers for.** 
93c0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
93d0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   compute the lim
93e0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
93f0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a  If there is no.*
9400: 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  * limit and/or o
9410: 66 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d  ffset, then iLim
9420: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
9430: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
9440: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9450: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
9460: 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64  es if iLimit and
9470: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
9480: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
9490: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
94a0: 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e   by nLimit and n
94b0: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
94c0: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
94d0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
94e0: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
94f0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
9500: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
9510: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
9520: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
9530: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
9540: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c  e..** Only if nL
9550: 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73  imit>=0 or nOffs
9560: 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  et>0 do the limi
9570: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
9580: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
9590: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
95a0: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
95b0: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
95c0: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
95d0: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
95e0: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
95f0: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
9600: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
9610: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
9620: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
9630: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
9640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9650: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a  Select *p){.  /*
9660: 20 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f   .  ** If the co
9670: 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e  mparison is p->n
9680: 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49  Limit>0 then "LI
9690: 4d 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a  MIT 0" shows.  *
96a0: 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20  * all rows.  It 
96b0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e  is the same as n
96c0: 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20  o limit. If the 
96d0: 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20  comparision is. 
96e0: 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   ** p->nLimit>=0
96f0: 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20   then "LIMIT 0" 
9700: 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20  show no rows at 
9710: 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54  all..  ** "LIMIT
9720: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
9730: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
9740: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
9750: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
9760: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
9770: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
9780: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
9790: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
97a0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
97b0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
97c0: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
97d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
97e0: 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
97f0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
9800: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9810: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9820: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9830: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
9840: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
9850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9860: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d   OP_Integer, -p-
9870: 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20  >nLimit, 0);.   
9880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9890: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
98a0: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
98b0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d  p->iLimit = iMem
98c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e  ;.  }.  if( p->n
98d0: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
98e0: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
98f0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56  e->nMem++;.    V
9900: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9910: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9920: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
9930: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
9940: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9950: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e  OP_Integer, -p->
9960: 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20  nOffset, 0);.   
9970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9980: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
9990: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
99a0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65  p->iOffset = iMe
99b0: 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m;.  }.}../*.** 
99c0: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e  Generate VDBE in
99d0: 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
99e0: 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e  will open a tran
99f0: 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  sient table that
9a00: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .** will be used
9a10: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72   for an index or
9a20: 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20   to store keyed 
9a30: 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f  results for a co
9a40: 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  mpound.** select
9a50: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
9a60: 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  s, open a transi
9a70: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e  ent table that n
9a80: 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66  eeds a.** KeyInf
9a90: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
9aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9ab0: 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e  mns in the KeyIn
9ac0: 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  fo is determined
9ad0: 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c  .** by the resul
9ae0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
9af0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
9b00: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
9b10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65  ment..**.** Make
9b20: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
9b30: 20 4b 65 79 41 73 44 61 74 61 20 74 61 62 6c 65   KeyAsData table
9b40: 20 69 66 20 6b 65 79 41 73 44 61 74 61 20 69 73   if keyAsData is
9b50: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
9b60: 20 76 6f 69 64 20 6f 70 65 6e 54 65 6d 70 49 6e   void openTempIn
9b70: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
9b80: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
9b90: 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41  t iTab, int keyA
9ba0: 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66  sData){.  KeyInf
9bb0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
9bc0: 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71  nt nColumn;.  sq
9bd0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
9be0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
9bf0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9c00: 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66  se->pVdbe;..  if
9c10: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
9c20: 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  st(pParse, p) ){
9c30: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9c40: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  .  nColumn = p->
9c50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
9c60: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
9c70: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
9c80: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
9c90: 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  umn*sizeof(CollS
9ca0: 65 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b  eq*) );.  if( pK
9cb0: 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  eyInfo==0 ) retu
9cc0: 72 6e 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  rn;.  pKeyInfo->
9cd0: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e  nField = nColumn
9ce0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9cf0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
9d00: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
9d10: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
9d20: 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Coll;.  }.  sqli
9d30: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
9d40: 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54 61 62 2c  _OpenTemp, iTab,
9d50: 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
9d60: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
9d70: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20  HANDOFF);.  if( 
9d80: 6b 65 79 41 73 44 61 74 61 20 29 7b 0a 20 20 20  keyAsData ){.   
9d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9da0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
9db0: 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20 20 7d  a, iTab, 1);.  }
9dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9dd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9de0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
9df0: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
9e00: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
9e10: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
9e20: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
9e30: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
9e40: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
9e50: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
9e60: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
9e70: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
9e80: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
9e90: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
9ea0: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
9eb0: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
9ec0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
9ed0: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
9ee0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
9ef0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
9f00: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
9f10: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
9f20: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
9f30: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
9f40: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
9f50: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
9f60: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
9f70: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
9f80: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
9f90: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
9fa0: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
9fb0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
9fc0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
9fd0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
9fe0: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
9ff0: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
a000: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
a010: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
a020: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
a030: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
a040: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
a050: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
a060: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
a070: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
a080: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
a0a0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
a0b0: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
a0c0: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
a0d0: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
a0e0: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
a0f0: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
a100: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
a110: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a120: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
a130: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
a140: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
a150: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
a160: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
a170: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
a180: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
a190: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
a1a0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
a1b0: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
a1c0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
a1d0: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
a1e0: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
a1f0: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
a200: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
a210: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
a220: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
a230: 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65  *pParse, .  Sele
a240: 63 74 20 2a 70 2c 20 0a 20 20 69 6e 74 20 65 44  ct *p, .  int eD
a250: 65 73 74 2c 20 0a 20 20 69 6e 74 20 69 50 61 72  est, .  int iPar
a260: 6d 2c 20 0a 20 20 63 68 61 72 20 2a 61 66 66 20  m, .  char *aff 
a270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
a280: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
a290: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
a2a0: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
a2b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a2c0: 4f 4b 3b 20 20 2f 2a 20 53 75 63 63 65 73 73 20  OK;  /* Success 
a2d0: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
a2e0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
a2f0: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
a300: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
a310: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
a320: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
a330: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
a340: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
a350: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
a360: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 53   */.  char *affS
a370: 74 72 20 3d 20 30 3b 0a 0a 23 69 66 20 30 20 2f  tr = 0;..#if 0 /
a380: 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 20 20  * NOT USED */.  
a390: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
a3a0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 72 63 20  int len;.    rc 
a3b0: 3d 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  = fillInColumnLi
a3c0: 73 74 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  st(pParse, p);. 
a3d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a3e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
a3f0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
a400: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  end;.    }.    l
a410: 65 6e 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  en = p->pEList->
a420: 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 61 66 66  nExpr+1;.    aff
a430: 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71  Str = (char *)sq
a440: 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 2d 3e 70 45  liteMalloc(p->pE
a450: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  List->nExpr+1);.
a460: 20 20 20 20 69 66 28 20 21 61 66 66 53 74 72 20      if( !affStr 
a470: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
a480: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
a490: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
a4a0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
a4b0: 20 20 20 6d 65 6d 73 65 74 28 61 66 66 53 74 72     memset(affStr
a4c0: 2c 20 28 69 6e 74 29 53 51 4c 49 54 45 5f 41 46  , (int)SQLITE_AF
a4d0: 46 5f 4e 55 4d 45 52 49 43 2c 20 6c 65 6e 2d 31  F_NUMERIC, len-1
a4e0: 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 61 66 66  );.    aff = aff
a4f0: 53 74 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Str;.  }.#endif.
a500: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a510: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
a520: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
a530: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
a540: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
a550: 2a 20 74 68 65 20 6c 61 73 74 20 53 45 4c 45 43  * the last SELEC
a560: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
a570: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
a580: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
a590: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
a5a0: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
a5b0: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
a5c0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
a5d0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
a5e0: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
a5f0: 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  r;.  if( pPrior-
a600: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
a610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a620: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
a630: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
a640: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
a650: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
a660: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
a670: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
a680: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
a690: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
a6a0: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
a6b0: 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72  nLimit>=0 || pPr
a6c0: 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29  ior->nOffset>0 )
a6d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
a6e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
a6f0: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
a700: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
a710: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
a720: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
a730: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
a740: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
a750: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
a760: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
a770: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
a780: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
a790: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
a7a0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
a7b0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
a7c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a7d0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
a7e0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
a7f0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
a800: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
a810: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
a820: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
a830: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
a840: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
a850: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
a860: 6c 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  le ){.    assert
a870: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
a880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a890: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
a8a0: 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
a8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a8c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
a8d0: 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
a8e0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
a8f0: 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53  );.    eDest = S
a900: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
a910: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
a920: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
a930: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
a940: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
a950: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
a960: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a970: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
a980: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
a990: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  ){.        pPrio
a9a0: 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e  r->nLimit = p->n
a9b0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
a9c0: 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d  Prior->nOffset =
a9d0: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
a9e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a9f0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
aa00: 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69  pPrior, eDest, i
aa10: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61  Parm, 0, 0, 0, a
aa20: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
aa30: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
aa40: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
aa50: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
aa60: 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
aa70: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
aa80: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
aa90: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
aaa0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
aab0: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
aac0: 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c  t;.        p->nL
aad0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
aae0: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
aaf0: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
ab00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
ab10: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
ab20: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
ab30: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
ab40: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
ab50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
ab60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
ab70: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ab80: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
ab90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
abb0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
abc0: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
abd0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
abe0: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
abf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
ac00: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
ac10: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
ac20: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
ac30: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
ac40: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
ac50: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
ac60: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
ac70: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
ac80: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
ac90: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
aca0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
acb0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
acc0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
acd0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ace0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
acf0: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
ad00: 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20      int nLimit, 
ad10: 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  nOffset; /* Save
ad20: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
ad30: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
ad40: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78  fset */.      Ex
ad50: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ad60: 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20  ;  /* The ORDER 
ad70: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
ad80: 65 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a  e right SELECT *
ad90: 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  /..      priorOp
ada0: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
adb0: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
adc0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
add0: 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72  if( eDest==prior
ade0: 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  Op && p->pOrderB
adf0: 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69  y==0 && p->nLimi
ae00: 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65  t<0 && p->nOffse
ae10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
ae20: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
ae30: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
ae40: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
ae50: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
ae60: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
ae70: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ae80: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
ae90: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
aea0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
aeb0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
aec0: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
aed0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
aee0: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
aef0: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
af00: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
af10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
af20: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
af30: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
af40: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
af50: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63  .        && matc
af60: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
af70: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
af80: 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61  OrderBy, unionTa
af90: 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b, 1) ){.       
afa0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
afb0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
afc0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
afd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
afe0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  ( p->op!=TK_ALL 
aff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 65  ){.          ope
b000: 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61 72 73  nTempIndex(pPars
b010: 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  e, p, unionTab, 
b020: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
b030: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
b040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b050: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e   OP_OpenTemp, un
b060: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
b070: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
b080: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
b090: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
b0a0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
b0b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
b0c0: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
b0d0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
b0e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
b0f0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72  arse, pPrior, pr
b100: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  iorOp, unionTab,
b110: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
b120: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
b130: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
b140: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b160: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   p->op==TK_ALL )
b170: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b190: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
b1a0: 75 6e 69 6f 6e 54 61 62 2c 20 70 50 72 69 6f 72  unionTab, pPrior
b1b0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
b1c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b1d0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
b1e0: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
b1f0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
b200: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
b210: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
b220: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
b230: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
b240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b250: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
b260: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
b270: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
b280: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
b290: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
b2a0: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
b2b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2c0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
b2d0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
b2e0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
b2f0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
b300: 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74   0;.      nLimit
b310: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
b320: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b330: 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65  -1;.      nOffse
b340: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
b350: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b360: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
b370: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
b380: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
b390: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
b3a0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
b3b0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
b3c0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
b3d0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
b3e0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
b3f0: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
b400: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
b410: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
b420: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
b430: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b440: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
b450: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
b460: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
b470: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
b480: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
b490: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
b4a0: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
b4b0: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
b4c0: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
b4d0: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
b4e0: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50   || unionTab!=iP
b4f0: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
b500: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
b510: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
b520: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
b530: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
b540: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
b550: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
b560: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
b570: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
b580: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
b590: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
b5a0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
b5b0: 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d  rse, p->pSrc, p-
b5c0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
b5d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
b5e0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
b5f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
b600: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
b610: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
b620: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
b630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b640: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
b650: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
b660: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
b670: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
b680: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
b690: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
b6a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b6b0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  dr(v);.        r
b6c0: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
b6d0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
b6e0: 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
b6f0: 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
b700: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
b730: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
b740: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
b770: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b780: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
b790: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
b7a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b7b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
b7c0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b7d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
b7e0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
b7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b800: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
b810: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
b820: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
b830: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b840: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
b850: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b860: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b870: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
b880: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b890: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
b8a0: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
b8b0: 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
b8c0: 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  e, p, v, p->pELi
b8d0: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
b8e0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
b8f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b910: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
b920: 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  SECT: {.      in
b930: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
b940: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
b950: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
b960: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c       int nLimit,
b970: 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   nOffset;..     
b980: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
b990: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
b9a0: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
b9b0: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
b9c0: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
b9d0: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
b9e0: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
b9f0: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
ba00: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
ba10: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
ba20: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
ba30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
ba40: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
ba50: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
ba60: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
ba70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
ba80: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
ba90: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
baa0: 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64  pParse,p,p->pOrd
bab0: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
bac0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
bad0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
bae0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
baf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 70 65       }.      ope
bb00: 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61 72 73  nTempIndex(pPars
bb10: 65 2c 20 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a  e, p, tab1, 1);.
bb20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
bb30: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
bb40: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
bb50: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
bb60: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
bb70: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
bb80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
bb90: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
bba0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
bbb0: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
bbc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
bbd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
bbe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
bbf0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
bc00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
bc10: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
bc20: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
bc30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
bc40: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
bc50: 20 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64       openTempInd
bc60: 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  ex(pParse, p, ta
bc70: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  b2, 1);.      p-
bc80: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
bc90: 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e     nLimit = p->n
bca0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
bcb0: 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  nLimit = -1;.   
bcc0: 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e     nOffset = p->
bcd0: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  nOffset;.      p
bce0: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
bcf0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bd00: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
bd10: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
bd20: 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
bd30: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
bd40: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
bd50: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e     p->nLimit = n
bd60: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
bd70: 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65  nOffset = nOffse
bd80: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
bd90: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bda0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bdb0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bdc0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
bdd0: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
bde0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
bdf0: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
be00: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
be10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
be20: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
be30: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
be40: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
be50: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
be60: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
be70: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
be80: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
be90: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
bea0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ypes(pParse, p->
beb0: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
bec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bed0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
bee0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
bef0: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
bf00: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
bf10: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
bf20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bf30: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
bf40: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
bf50: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
bf60: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
bf70: 20 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72   p);.      iStar
bf80: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
bf90: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b  ddOp(v, OP_FullK
bfa0: 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ey, tab1, 0);.  
bfb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bfc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
bfd0: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
bfe0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
bff0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
c000: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
c010: 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c  st, tab1, p->pEL
c020: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
c050: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
c060: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
c090: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
c0a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c0b0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
c0c0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c0d0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c0f0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c100: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
c110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c120: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
c130: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
c140: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c150: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
c160: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
c170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c180: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
c190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c1b0: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
c1c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
c1d0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
c1e0: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
c1f0: 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
c200: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c210: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
c220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c230: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
c240: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
c250: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
c260: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
c270: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c280: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
c290: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
c2a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c2b0: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
c2c0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
c2d0: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
c2e0: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
c2f0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
c300: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
c310: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
c320: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c330: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
c340: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c350: 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
c360: 65 63 74 5f 65 6e 64 3a 0a 23 69 66 20 30 20 20  ect_end:.#if 0  
c370: 2f 2a 2a 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2a  /*** NOT USED **
c380: 2a 2a 2f 0a 20 20 69 66 28 20 61 66 66 53 74 72  **/.  if( affStr
c390: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   ){.    if( rc!=
c3a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c3b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 66     sqliteFree(af
c3c0: 66 53 74 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fStr);.    }else
c3d0: 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c  {.      multiSel
c3e0: 65 63 74 41 66 66 69 6e 69 74 79 28 70 2c 20 61  ectAffinity(p, a
c3f0: 66 66 53 74 72 29 3b 0a 20 20 20 20 20 20 73 71  ffStr);.      sq
c400: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c410: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 61  OP_Noop, 0, 0, a
c420: 66 66 53 74 72 2c 20 50 33 5f 44 59 4e 41 4d 49  ffStr, P3_DYNAMI
c430: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
c440: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
c460: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
c470: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
c480: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
c490: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
c4a0: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
c4b0: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
c4c0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
c4d0: 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
c4e0: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
c4f0: 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
c500: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
c510: 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
c520: 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
c530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c540: 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
c550: 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
c560: 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
c570: 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
c580: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
c590: 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
c5a0: 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
c5b0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
c5c0: 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
c5d0: 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
c5e0: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
c5f0: 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
c600: 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
c610: 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
c620: 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
c630: 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
c640: 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
c650: 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
c660: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
c670: 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
c680: 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
c690: 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
c6a0: 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
c6b0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
c6c0: 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
c6d0: 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45  (ExprList*,int,E
c6e0: 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46  xprList*);  /* F
c6f0: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
c700: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
c710: 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
c720: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
c730: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
c740: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c750: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
c760: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
c770: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
c780: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
c790: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
c7a0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
c7b0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
c7c0: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
c7d0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
c7e0: 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
c7f0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
c800: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
c810: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
c820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
c830: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
c840: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
c850: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
c860: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
c870: 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
c880: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
c890: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
c8a0: 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
c8b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
c8c0: 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
c8d0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
c8e0: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
c8f0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
c900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c910: 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
c920: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
c930: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
c940: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
c950: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
c960: 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68  rDup(pNew->pRigh
c970: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
c980: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
c990: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
c9a0: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
c9b0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  3ExprListDup(pNe
c9c0: 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  w->pList);.     
c9d0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
c9e0: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20   pNew->iTable;. 
c9f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
ca00: 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c  umn = pNew->iCol
ca10: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72  umn;.      pExpr
ca20: 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69  ->iAgg = pNew->i
ca30: 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Agg;.      sqlit
ca40: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
ca50: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
ca60: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
ca70: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
ca80: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  (&pExpr->span, &
ca90: 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
caa0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
cab0: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
cac0: 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
cad0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
cae0: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52  stExpr(pExpr->pR
caf0: 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
cb00: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
cb10: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
cb20: 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
cb30: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
cb40: 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74  atic void .subst
cb50: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
cb60: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54  t *pList, int iT
cb70: 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  able, ExprList *
cb80: 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  pEList){.  int i
cb90: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
cba0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
cbb0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
cbc0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
cbd0: 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d  substExpr(pList-
cbe0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
cbf0: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
cc00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
cc10: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
cc20: 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
cc30: 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
cc40: 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
cc50: 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
cc60: 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
cc70: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
cc80: 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
cc90: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
cca0: 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
ccb0: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
ccc0: 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
ccd0: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
cce0: 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
ccf0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
cd00: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
cd10: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
cd20: 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
cd30: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
cd40: 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
cd50: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
cd60: 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
cd70: 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
cd80: 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
cd90: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
cda0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
cdb0: 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
cdc0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cdd0: 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
cde0: 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
cdf0: 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
ce00: 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
ce10: 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
ce20: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
ce30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
ce40: 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
ce50: 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
ce60: 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
ce70: 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
ce80: 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
ce90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cea0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
ceb0: 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
cec0: 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
ced0: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
cee0: 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
cef0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
cf00: 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
cf10: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
cf20: 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
cf30: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
cf40: 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
cf50: 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
cf60: 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
cf70: 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
cf80: 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
cf90: 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
cfa0: 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
cfb0: 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
cfc0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
cfd0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
cfe0: 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
cff0: 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
d000: 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
d010: 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
d020: 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
d030: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
d040: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
d050: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
d060: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
d070: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
d080: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
d090: 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
d0a0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
d0b0: 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
d0c0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
d0d0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
d0e0: 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
d0f0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
d100: 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
d110: 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
d120: 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
d130: 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
d140: 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
d150: 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
d160: 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
d170: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
d180: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
d190: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
d1a0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
d1b0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
d1c0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
d1d0: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
d1e0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
d1f0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
d200: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
d210: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
d220: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
d230: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
d240: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
d250: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
d260: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
d270: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
d280: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
d290: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
d2a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
d2b0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
d2c0: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
d2d0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
d2e0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
d2f0: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
d300: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
d310: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
d320: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d330: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
d340: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
d350: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
d360: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
d370: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
d380: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
d390: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
d3a0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
d3b0: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
d3c0: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
d3d0: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
d3e0: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
d3f0: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
d400: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
d410: 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
d420: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
d430: 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
d440: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
d450: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
d460: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
d470: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
d480: 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
d490: 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  50).**.** In thi
d4a0: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
d4b0: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
d4c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
d4d0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
d4e0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
d4f0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
d500: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
d510: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
d520: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
d530: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
d540: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
d550: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
d560: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
d570: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
d580: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
d590: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
d5a0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
d5b0: 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
d5c0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
d5d0: 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
d5e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d5f0: 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
d600: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
d610: 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
d620: 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
d630: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
d640: 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
d650: 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
d660: 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
d670: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
d680: 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
d690: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d6a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
d6b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
d6c0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
d6d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
d6e0: 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
d6f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
d700: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
d710: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
d720: 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
d730: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
d740: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
d750: 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
d760: 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
d770: 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
d780: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
d790: 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
d7a0: 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
d7b0: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
d7c0: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
d7d0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
d7e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
d7f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
d800: 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
d810: 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
d820: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
d830: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
d840: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
d850: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
d860: 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
d870: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
d880: 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
d890: 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
d8a0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
d8b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
d8c0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d8d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
d8e0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
d8f0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
d900: 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
d910: 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
d920: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  e */.  int i;.  
d930: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20  Expr *pWhere;.. 
d940: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
d950: 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
d960: 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
d970: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
d980: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
d990: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
d9a0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
d9b0: 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
d9c0: 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
d9d0: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
d9e0: 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pSub = pSrc->a[
d9f0: 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a  iFrom].pSelect;.
da00: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
da10: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
da20: 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
da30: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
da40: 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
da50: 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
da60: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
da70: 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
da80: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
da90: 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28  pSubSrc );.  if(
daa0: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
dab0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
dac0: 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73  if( (pSub->isDis
dad0: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e  tinct || pSub->n
dae0: 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70  Limit>=0) &&  (p
daf0: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
db00: 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
db10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
db20: 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  ( (p->isDistinct
db30: 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   || p->nLimit>=0
db40: 29 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  ) && subqueryIsA
db50: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  gg ) return 0;. 
db60: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
db70: 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
db80: 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  By ) return 0;..
db90: 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
dba0: 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
dbb0: 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
dbc0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
dbd0: 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
dbe0: 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
dbf0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
dc00: 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
dc10: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
dc20: 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
dc30: 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
dc40: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
dc50: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
dc60: 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
dc70: 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
dc80: 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
dc90: 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
dca0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
dcb0: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
dcc0: 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
dcd0: 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
dce0: 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
dcf0: 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
dd00: 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  /.  if( pSubSrc-
dd10: 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d  >nSrc>1 && iFrom
dd20: 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69  >0 && (pSrc->a[i
dd30: 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  From-1].jointype
dd40: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
dd50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dd60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
dd70: 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
dd80: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
dd90: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
dda0: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
ddb0: 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
ddc0: 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
ddd0: 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
dde0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
ddf0: 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
de00: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
de10: 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
de20: 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
de30: 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
de40: 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
de50: 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
de60: 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
de70: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
de80: 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
de90: 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
dea0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
deb0: 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
dec0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
ded0: 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
dee0: 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
def0: 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
df00: 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
df10: 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
df20: 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
df30: 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
df40: 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69  R JOIN..  */.  i
df50: 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  f( iFrom>0 && (p
df60: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e  Src->a[iFrom-1].
df70: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
df80: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26  TER)!=0 .      &
df90: 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d  & pSub->pWhere!=
dfa0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dfb0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
dfc0: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
dfd0: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
dfe0: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
dff0: 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
e000: 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
e010: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
e020: 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
e030: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20  r query..  */.. 
e040: 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20   /* Move all of 
e050: 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
e060: 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
e070: 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
e080: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
e090: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
e0a0: 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
e0b0: 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
e0c0: 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
e0d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
e0e0: 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
e0f0: 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
e100: 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
e110: 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
e120: 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
e130: 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
e140: 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
e150: 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
e160: 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
e170: 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
e180: 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
e190: 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
e1a0: 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
e1b0: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
e1c0: 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
e1d0: 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
e1e0: 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
e1f0: 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
e200: 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
e210: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
e220: 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20  iCursor;.  {.   
e230: 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70   int nSubSrc = p
e240: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  SubSrc->nSrc;.  
e250: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
e260: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
e270: 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69  jointype;..    i
e280: 66 28 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  f( pSrc->a[iFrom
e290: 5d 2e 70 54 61 62 20 26 26 20 70 53 72 63 2d 3e  ].pTab && pSrc->
e2a0: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69  a[iFrom].pTab->i
e2b0: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
e2c0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
e2d0: 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e  eTable(0, pSrc->
e2e0: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a  a[iFrom].pTab);.
e2f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e300: 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72  Free(pSrc->a[iFr
e310: 6f 6d 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om].zDatabase);.
e320: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e330: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e  Src->a[iFrom].zN
e340: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
e350: 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72  Free(pSrc->a[iFr
e360: 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  om].zAlias);.   
e370: 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
e380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
e390: 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
e3a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
e3b0: 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
e3c0: 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
e3d0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
e3e0: 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29  pend(pSrc, 0, 0)
e3f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e400: 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
e410: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
e420: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
e430: 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
e440: 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
e450: 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
e460: 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
e470: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
e480: 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
e490: 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
e4a0: 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
e4b0: 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
e4c0: 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
e4d0: 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
e4e0: 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
e4f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
e500: 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53  c->a[iFrom+nSubS
e510: 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
e520: 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a   jointype;.  }..
e530: 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
e540: 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
e550: 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
e560: 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
e570: 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
e580: 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
e590: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
e5a0: 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45  ry..  ** .  ** E
e5b0: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
e5c0: 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
e5d0: 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
e5e0: 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
e5f0: 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
e600: 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20  HERE a>b;.  **  
e610: 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
e620: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
e630: 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
e640: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
e650: 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f      /.  **    \_
e660: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e670: 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
e680: 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
e690: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
e6a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f  .  **.  ** We lo
e6b0: 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
e6c0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
e6d0: 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
e6e0: 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
e6f0: 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62  .  ** "a" we sub
e700: 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
e710: 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
e720: 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
e730: 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
e740: 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c   */.  substExprL
e750: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69  ist(p->pEList, i
e760: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e770: 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d  List);.  pList =
e780: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
e790: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
e7a0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e7b0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
e7c0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
e7d0: 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
e7e0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
e7f0: 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
e800: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  z!=0 ){.      pL
e810: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
e820: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
e830: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
e840: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
e850: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
e860: 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73  sAgg ){.    subs
e870: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
e880: 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
e890: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e8a0: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
e8b0: 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
e8c0: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
e8d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
e8e0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
e8f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
e900: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
e910: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
e920: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
e930: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
e940: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
e950: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
e960: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
e970: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
e980: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e990: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
e9a0: 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
e9b0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
e9c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
e9d0: 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65  b->pWhere);.  }e
e9e0: 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20  lse{.    pWhere 
e9f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
ea00: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
ea10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ea20: 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
ea30: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d   p->pHaving = p-
ea40: 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e  >pWhere;.    p->
ea50: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
ea60: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
ea70: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
ea80: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
ea90: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  );.    if( pSub-
eaa0: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
eab0: 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20    Expr *pHaving 
eac0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ead0: 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b  (pSub->pHaving);
eae0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48  .      if( p->pH
eaf0: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
eb00: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
eb10: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
eb20: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48  , p->pHaving, pH
eb30: 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20  aving, 0);.     
eb40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eb50: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  p->pHaving = pHa
eb60: 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ving;.      }.  
eb70: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
eb80: 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
eb90: 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
eba0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
ebb0: 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
ebc0: 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20  oupBy);.  }else 
ebd0: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30  if( p->pWhere==0
ebe0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   ){.    p->pWher
ebf0: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d 65  e = pWhere;.  }e
ec00: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
ec10: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50  pr(p->pWhere, iP
ec20: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
ec30: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  ist);.    if( pW
ec40: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  here ){.      p-
ec50: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
ec60: 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  3Expr(TK_AND, p-
ec70: 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c  >pWhere, pWhere,
ec80: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
ec90: 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
eca0: 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
ecb0: 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
ecc0: 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
ecd0: 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
ece0: 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
ecf0: 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
ed00: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
ed10: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
ed20: 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54  istinct;..  /* T
ed30: 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d 69  ransfer the limi
ed40: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  t expression fro
ed50: 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  m the subquery t
ed60: 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  o the outer.  **
ed70: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   query..  */.  i
ed80: 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  f( pSub->nLimit>
ed90: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
eda0: 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20  >nLimit<0 ){.   
edb0: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
edc0: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  Sub->nLimit;.   
edd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c   }else if( p->nL
ede0: 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20  imit+p->nOffset 
edf0: 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70  > pSub->nLimit+p
ee00: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a  Sub->nOffset ){.
ee10: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
ee20: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b  = pSub->nLimit +
ee30: 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d   pSub->nOffset -
ee40: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
ee50: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66   }.  }.  p->nOff
ee60: 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66  set += pSub->nOf
ee70: 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69  fset;..  /* Fini
ee80: 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
ee90: 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
eea0: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
eeb0: 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
eec0: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
eed0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
eee0: 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
eef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
ef00: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
ef10: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
ef20: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
ef30: 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
ef40: 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
ef50: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
ef60: 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
ef70: 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
ef80: 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
ef90: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
efa0: 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
efb0: 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
efc0: 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
efd0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
efe0: 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
eff0: 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
f000: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
f010: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
f020: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
f030: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
f040: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
f050: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
f060: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
f070: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
f080: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
f090: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
f0a0: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
f0b0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
f0c0: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
f0d0: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
f0e0: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
f0f0: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
f100: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
f110: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
f120: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
f130: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
f140: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
f150: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
f160: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
f170: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
f180: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
f190: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
f1a0: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
f1b0: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
f1c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
f1d0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
f1e0: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
f1f0: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
f200: 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ite3Select()..**
f210: 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
f220: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
f230: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
f240: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
f250: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
f260: 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  t simpleMinMaxQu
f270: 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
f280: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
f290: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
f2a0: 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm){.  Expr *pEx
f2b0: 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
f2c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
f2d0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
f2e0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
f2f0: 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
f300: 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
f310: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
f320: 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74  t, *pList, eList
f330: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
f340: 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
f350: 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  em;.  SrcList *p
f360: 53 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 43 68  Src;.  ..  /* Ch
f370: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
f380: 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69  is query is a si
f390: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
f3a0: 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75  x() query.  Retu
f3b0: 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20  rn.  ** zero if 
f3c0: 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f  it is  not..  */
f3d0: 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
f3e0: 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67  By || p->pHaving
f3f0: 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20   || p->pWhere ) 
f400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
f410: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
f420: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
f430: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
f440: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
f450: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
f460: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
f470: 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  n 0;.  pExpr = p
f480: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
f490: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
f4a0: 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
f4b0: 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
f4c0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
f4d0: 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  >pList;.  if( pL
f4e0: 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ist==0 || pList-
f4f0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
f500: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
f510: 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
f520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f530: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
f540: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
f550: 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
f560: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
f570: 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
f580: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
f590: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
f5a0: 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
f5b0: 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
f5c0: 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
f5d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f5e0: 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
f5f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
f600: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f610: 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
f620: 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
f630: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
f640: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
f650: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
f660: 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
f670: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
f680: 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
f690: 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
f6a0: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
f6b0: 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
f6c0: 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
f6d0: 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
f6e0: 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
f6f0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
f700: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
f710: 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
f720: 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
f730: 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
f740: 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
f750: 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
f760: 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
f770: 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
f780: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
f790: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
f7a0: 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
f7b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
f7c0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f7d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f7e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f7f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f800: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20  Idx->nColumn>=1 
f810: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
f820: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
f830: 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  iCol ) break;.  
f840: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
f850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f860: 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
f870: 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  fy column types 
f880: 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
f890: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
f8a0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
f8b0: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
f8c0: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
f8d0: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
f8e0: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
f8f0: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  .  ** The column
f900: 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65   names have alre
f910: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
f920: 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ed in the callin
f930: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  g function..  */
f940: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
f950: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f960: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
f970: 72 6e 20 30 3b 0a 20 20 69 66 28 20 65 44 65 73  rn 0;.  if( eDes
f980: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
f990: 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
f9a0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
f9b0: 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70  e, p->pSrc, p->p
f9c0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
f9d0: 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
f9e0: 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
f9f0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
fa00: 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
fa10: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
fa20: 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
fa30: 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
fa40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fa50: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
fa60: 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
fa70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fa80: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
fa90: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
faa0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
fab0: 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
fac0: 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
fad0: 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
fae0: 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
faf0: 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
fb00: 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
fb10: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
fb20: 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
fb30: 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
fb40: 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
fb50: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
fb60: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
fb70: 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
fb80: 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
fb90: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
fba0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
fbb0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
fbc0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
fbd0: 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53  Db);.  base = pS
fbe0: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
fbf0: 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
fc00: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
fc10: 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63  , p);.  if( pSrc
fc20: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
fc30: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fc40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fc50: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
fc60: 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
fc70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fc80: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
fc90: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  e, pTab->tnum);.
fca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fcb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
fcc0: 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20  mColumns, base, 
fcd0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d  pTab->nCol);.  }
fce0: 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
fcf0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
fd00: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
fd10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
fd20: 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
fd30: 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
fd40: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
fd50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fd60: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
fd70: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
fd80: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fd90: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
fda0: 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  e+1, pIdx->tnum,
fdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fdc0: 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78      (char*)&pIdx
fdd0: 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  ->keyInfo, P3_KE
fde0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
fdf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fe00: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20  seekOp, base+1, 
fe10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
fe20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
fe30: 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c  dxRecno, base+1,
fe40: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
fe50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fe60: 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30  Close, base+1, 0
fe70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fe80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
fe90: 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
fea0: 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
feb0: 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
fec0: 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
fed0: 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
fee0: 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
fef0: 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
ff00: 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
ff10: 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
ff20: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
ff30: 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
ff40: 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
ff50: 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
ff60: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
ff70: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
ff80: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
ff90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ffa0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
ffb0: 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
ffc0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   1;.}../*.** Gen
ffd0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
ffe0: 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
fff0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
10000 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
10010 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
10020 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
10030 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
10040 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20   value of eDest 
10050 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  and iParm..**.**
10060 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65       eDest Value
10070 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a         Result.**
10080 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
10090 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
100a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100c0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c  .**     SRT_Call
100d0 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74  back    Invoke t
100e0 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  he callback for 
100f0 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
10100 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  result..**.**   
10110 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20    SRT_Mem       
10120 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65    Store first re
10130 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  sult in memory c
10140 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ell iParm.**.** 
10150 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
10160 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
10170 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62  s as keys of tab
10180 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
10190 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
101a0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
101b0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
101c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
101d0 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
101e0 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
101f0 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
10200 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
10210 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  y table iParm..*
10220 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
10230 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
10240 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
10250 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
10260 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10270 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c  above is incompl
10280 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c  ete.  Additional
10290 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76   eDist value hav
102a0 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69  e be added.** si
102b0 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74  nce this comment
102c0 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53   was written.  S
102d0 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
102e0 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
102f0 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c  n for.** a compl
10300 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  ete listing of t
10310 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  he allowed value
10320 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74  s of eDest and t
10330 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a  heir meanings..*
10340 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10350 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
10360 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
10370 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
10380 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
10390 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
103a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
103b0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
103c0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
103d0 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
103e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
103f0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
10400 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
10410 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
10420 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
10430 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
10440 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
10450 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
10460 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
10470 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
10480 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
10490 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
104a0 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
104b0 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
104c0 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
104d0 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
104e0 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
104f0 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
10500 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
10510 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
10520 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
10530 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
10540 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
10550 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
10560 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
10570 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
10580 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
10590 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
105a0 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
105b0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78  hanged..**.** Ex
105c0 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d  ample 1:   The m
105d0 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50  eaning of the pP
105e0 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e  arent parameter.
105f0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
10600 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
10610 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74  (SELECT x, count
10620 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49  (*) FROM t2) JOI
10630 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20  N t3;.**    \   
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71     \_______ subq
10660 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  uery _______/   
10670 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20       /.**     \ 
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c       /.**      \
106c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
106d0 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
106e0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
106f0 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ____/.**.** This
10700 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10710 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ed for the outer
10720 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20   query first.   
10730 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a  For that call,.*
10740 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62  * pParent will b
10750 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20  e NULL.  During 
10760 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  the processing o
10770 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
10780 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  y, this .** rout
10790 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
107a0 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e  cursively to han
107b0 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79  dle the subquery
107c0 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72  .  For the recur
107d0 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50  sive.** call, pP
107e0 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74  arent will point
107f0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
10800 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68  ery.  Because th
10810 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a  e subquery is.**
10820 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
10830 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77  ent in a three-w
10840 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72  ay join, the par
10850 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72  entTab parameter
10860 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74   will.** be 1 (t
10870 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20  he 2nd value of 
10880 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61  a 0-indexed arra
10890 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y.).*/.int sqlit
108a0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
108b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
108c0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
108d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
108e0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
108f0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
10900 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
10910 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
10920 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
10930 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
10940 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
10950 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
10960 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
10970 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
10980 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
10990 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
109a0 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
109b0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
109c0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
109d0 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
109e0 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
109f0 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
10a00 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
10a10 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
10a20 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
10a30 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
10a40 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
10a50 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
10a60 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
10a70 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
10a80 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
10a90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
10aa0 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
10ab0 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
10ac0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
10ad0 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
10ae0 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
10af0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
10b00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
10b10 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
10b20 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
10b30 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
10b40 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
10b50 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
10b60 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
10b70 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
10b80 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
10b90 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
10ba0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
10bb0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
10bc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
10bd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
10be0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10bf0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10c00 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
10c10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
10c20 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
10c30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
10c40 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
10c50 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
10c60 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
10c70 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
10c80 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
10c90 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
10ca0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
10cb0 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
10cc0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
10cd0 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
10ce0 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
10cf0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
10d00 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
10d10 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
10d20 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
10d30 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
10d40 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
10d50 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
10d60 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
10d70 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  unction */..  if
10d80 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
10d90 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  _failed || pPars
10da0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20  e->nErr || p==0 
10db0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
10dc0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10dd0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
10de0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
10df0 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  0) ) return 1;..
10e00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
10e10 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
10e20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
10e30 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
10e40 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
10e50 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
10e60 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
10e70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
10e80 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
10e90 66 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ff);.  }..  /* M
10ea0 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
10eb0 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
10ec0 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
10ed0 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
10ee0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
10ef0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
10f00 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  re;.  pOrderBy =
10f10 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
10f20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
10f30 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
10f40 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
10f50 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
10f60 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
10f70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56 44 42   /* Allocate VDB
10f80 45 20 63 75 72 73 6f 72 73 20 66 6f 72 20 65 61  E cursors for ea
10f90 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
10fa0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
10fb0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
10fc0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
10fd0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
10fe0 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
10ff0 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
11000 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
11010 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
11020 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
11030 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
11040 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
11050 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
11060 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
11070 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
11080 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64  nd;..  /* Expand
11090 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20 69   any "*" terms i
110a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
110b0 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 20  .  (For example 
110c0 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20  the "*" in.  ** 
110d0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
110e0 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e 43  1")  The fillInC
110f0 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74  olumnlist() rout
11100 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f  ine also does so
11110 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f  me.  ** other ho
11120 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65 65  usekeeping - see
11130 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
11140 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ent for details.
11150 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c  .  */.  if( fill
11160 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
11170 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
11180 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11190 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70    }.  pWhere = p
111a0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69  ->pWhere;.  pELi
111b0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
111c0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
111d0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
111e0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
111f0 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
11200 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
11210 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
11220 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
11230 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
11240 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52    if( (eDest==SR
11250 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
11260 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69  SRT_Set) && pELi
11270 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20  st->nExpr>1 ){. 
11280 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11290 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
112a0 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
112b0 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
112c0 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
112d0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
112e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
112f0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
11300 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
11310 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
11320 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
11330 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
11340 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
11350 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
11360 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
11370 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
11380 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
11390 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
113a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
113b0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
113c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
113d0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
113e0 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
113f0 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
11400 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
11410 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
11420 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
11430 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
11440 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
11450 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
11460 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
11470 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
11480 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
11490 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
114a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
114b0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
114c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
114d0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
114e0 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
114f0 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73  abList, 0, pELis
11500 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
11510 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11520 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11530 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11540 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
11550 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11560 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  pr, 1, &isAgg) )
11570 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11580 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11590 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20   }.  if( pWhere 
115a0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
115b0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
115c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
115d0 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72  t, pEList, pWher
115e0 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
115f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11600 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11610 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
11620 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  se, pWhere, 0, 0
11630 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11640 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11650 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76  }.  }.  if( pHav
11660 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ing ){.    if( p
11670 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
11680 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11690 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47  Msg(pParse, "a G
116a0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
116b0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
116c0 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20  e HAVING");.    
116d0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
116e0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
116f0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11700 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11710 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11720 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
11730 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11740 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
11750 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
11760 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
11770 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  ng, 1, &isAgg) )
11780 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11790 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
117a0 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42   }.  if( pOrderB
117b0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
117c0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
117d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
117e0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
117f0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
11800 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
11810 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11820 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11830 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69  (pE, &iCol) && i
11840 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
11850 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
11860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11870 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
11880 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64         pE = pOrd
11890 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
118a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
118b0 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  p(pEList->a[iCol
118c0 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
118d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
118e0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
118f0 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11900 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
11910 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
11920 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11940 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
11950 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
11960 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
11970 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11980 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
11990 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
119a0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
119b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
119c0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
119d0 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
119e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
119f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11a00 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
11a10 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
11a20 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
11a30 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
11a40 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ants");.        
11a50 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11a60 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
11a70 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
11a80 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
11a90 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
11aa0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11ab0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
11ac0 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
11ad0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
11ae0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
11af0 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
11b00 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
11b10 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f  n 1 and %d", iCo
11b20 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
11b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
11b40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11b60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11b70 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
11b80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
11b90 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
11ba0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11bb0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
11bc0 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
11bd0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
11be0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
11bf0 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
11c00 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20  l) && iCol>0 && 
11c10 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
11c20 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
11c30 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
11c40 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
11c50 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
11c60 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
11c70 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
11c80 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
11c90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11ca0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11cb0 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11cc0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
11cd0 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
11ce0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11cf0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11d00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11d10 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
11d20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
11d30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
11d40 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11d50 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
11d60 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11d70 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
11d80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11d90 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
11da0 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
11db0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11dc0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
11dd0 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20           "GROUP 
11de0 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f  BY terms must no
11df0 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72  t be non-integer
11e00 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20   constants");.  
11e10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11e20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
11e30 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c   }else if( iCol<
11e40 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
11e50 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11e70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
11e80 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55             "GROU
11e90 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  P BY column numb
11ea0 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
11eb0 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
11ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62  .             "b
11ed0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
11ee0 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
11ef0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
11f00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11f10 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
11f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
11f30 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
11f40 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
11f50 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
11f60 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11f70 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
11f80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
11f90 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
11fa0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
11fb0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
11fc0 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e  m in a callback.
11fd0 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
11fe0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
11ff0 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
12000 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ng to some other
12010 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
12020 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
12030 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
12040 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
12050 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
12060 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
12070 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 31 20 20 2f  );.  }..#if 1  /
12080 2a 20 49 20 64 6f 20 6e 6f 74 20 74 68 69 6e 6b  * I do not think
12090 20 77 65 20 6e 65 65 64 20 74 68 65 20 66 6f 6c   we need the fol
120a0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61 6e 79 20  lowing code any 
120b0 6d 6f 72 65 2e 2e 2e 2e 20 2a 2f 0a 20 20 2f 2a  more.... */.  /*
120c0 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
120d0 69 6f 6e 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  ion is SRT_Union
120e0 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6e  , then set the n
120f0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
12100 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 72 65 63   in.  ** the rec
12110 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ords that will b
12120 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
12130 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
12140 62 6c 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 0a  ble. The caller.
12150 20 20 2a 2a 20 63 6f 75 6c 64 6e 27 74 20 64 6f    ** couldn't do
12160 20 74 68 69 73 2c 20 69 6e 20 63 61 73 65 20 74   this, in case t
12170 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
12180 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
12190 72 6d 20 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54  rm .  ** "SELECT
121a0 20 2a 20 46 52 4f 4d 20 2e 2e 2e 2e 22 2e 20 0a   * FROM ....". .
121b0 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65    **.  ** We nee
121c0 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
121d0 6f 72 65 20 77 65 20 73 74 61 72 74 20 69 6e 73  ore we start ins
121e0 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69  erting records i
121f0 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 74 65  nto the .  ** te
12200 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
12210 68 69 63 68 20 68 61 73 20 68 61 64 20 4f 50 5f  hich has had OP_
12220 4b 65 79 41 73 44 61 74 61 20 65 78 65 63 75 74  KeyAsData execut
12230 65 64 20 6f 6e 20 69 74 29 2c 20 62 65 63 61 75  ed on it), becau
12240 73 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 72 65  se.  ** it is re
12250 71 75 69 72 65 64 20 62 79 20 74 68 65 20 6b 65  quired by the ke
12260 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  y comparison fun
12270 63 74 69 6f 6e 2e 20 53 6f 20 64 6f 20 69 74 20  ction. So do it 
12280 6e 6f 77 2c 20 65 76 65 6e 0a 20 20 2a 2a 20 74  now, even.  ** t
12290 68 6f 75 67 68 20 74 68 69 73 20 6d 65 61 6e 73  hough this means
122a0 20 74 68 61 74 20 4f 50 5f 53 65 74 4e 75 6d 43   that OP_SetNumC
122b0 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 65 78  olumns may be ex
122c0 65 63 75 74 65 64 20 6f 6e 20 74 68 65 20 73 61  ecuted on the sa
122d0 6d 65 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 6d  me.  ** cursor m
122e0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20  ore than once.. 
122f0 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
12300 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a 20 20  =SRT_Union ){.  
12310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12320 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
12330 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 70  olumns, iParm, p
12340 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
12350 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12360 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
12370 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
12380 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
12390 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ause.  */.  for(
123a0 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
123b0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
123c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
123d0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
123e0 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74      int needRest
123f0 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20  oreContext;..   
12400 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
12410 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
12420 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
12430 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
12440 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  ].zName!=0 ){.  
12450 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f      zSavedAuthCo
12460 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
12470 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
12480 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
12490 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c  hContext = pTabL
124a0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
124b0 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
124c0 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
124d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
124e0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
124f0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
12500 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
12510 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12520 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
12530 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a  SRT_TempTable, .
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12560 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
12570 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
12580 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
12590 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
125a0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
125b0 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
125c0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
125d0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
125e0 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
125f0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
12600 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52     if( eDest!=SR
12610 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74  T_Union && eDest
12620 21 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20  !=SRT_Except && 
12630 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61  eDest!=SRT_Disca
12640 72 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  rd ){.      pOrd
12650 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
12660 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47  By;.    }.    pG
12670 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
12680 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e  upBy;.    pHavin
12690 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
126a0 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
126b0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
126c0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
126d0 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
126e0 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20  case of a min() 
126f0 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
12700 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a  n by itself.  **
12710 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
12720 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  et..  */.  if( s
12730 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
12740 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
12750 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20  t, iParm) ){.   
12760 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74   rc = 0;.    got
12770 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12780 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
12790 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
127a0 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  a subquery that 
127b0 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65  can be "flattene
127c0 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  d" into its pare
127d0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74  nt..  ** If flat
127e0 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73  tening is a poss
127f0 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e  iblity, do so an
12800 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
12810 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  tely.  .  */.  i
12820 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
12830 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
12840 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
12850 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e  y(pParse, pParen
12860 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70  t, parentTab, *p
12870 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67  ParentAgg, isAgg
12880 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41  ) ){.    if( isA
12890 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67  gg ) *pParentAgg
128a0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
128b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
128c0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
128d0 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69    */.  computeLi
128e0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
128f0 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49  rse, p);..  /* I
12900 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
12910 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
12920 62 65 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 62  be using a callb
12930 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
12940 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
12950 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
12960 20 67 6f 69 6e 67 20 74 6f 20 61 20 64 65 73 74   going to a dest
12970 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a 20 20  ination other.  
12980 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c 62 61  ** than a callba
12990 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  ck..  **.  ** We
129a0 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
129b0 20 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d   separately from
129c0 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
129d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
129e0 2a 2a 20 61 62 6f 76 65 20 62 65 63 61 75 73 65  ** above because
129f0 20 69 66 20 74 68 65 20 70 54 61 62 4c 69 73 74   if the pTabList
12a00 20 63 6f 6e 74 61 69 6e 73 20 76 69 65 77 73 20   contains views 
12a10 74 68 65 6e 20 74 68 65 79 20 77 69 6c 6c 20 6e  then they will n
12a20 6f 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ot.  ** have bee
12a30 6e 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 77  n resolved and w
12a40 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
12a50 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  the column types
12a60 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f 77 2e   until.  ** now.
12a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12a80 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
12a90 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
12aa0 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
12ab0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
12ac0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
12ad0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
12ae0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
12af0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
12b00 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
12b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
12b20 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
12b30 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
12b40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12b50 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
12b60 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12b70 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12b80 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
12b90 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
12ba0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
12bb0 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
12bc0 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  f aggregate expr
12bd0 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
12be0 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
12bf0 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
12c00 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c  ;.  if( isAgg ||
12c10 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
12c20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12c30 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20  >nAgg==0 );.    
12c40 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66  isAgg = 1;.    f
12c50 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12c60 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12c70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12c80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
12c90 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
12ca0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12cb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
12cc0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12ce0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
12cf0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12d00 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
12d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12d20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
12d30 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
12d40 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
12d50 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
12d60 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
12d70 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
12da0 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
12db0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
12dc0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
12dd0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
12de0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12df0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
12e00 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
12e10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12e20 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12e30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
12e40 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
12e50 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
12e60 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
12e70 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
12e80 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12e90 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
12ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12eb0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74   }..  /* Reset t
12ec0 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20  he aggregator.  
12ed0 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
12ee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12ef0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
12f00 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65  Reset, 0, pParse
12f10 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72  ->nAgg);.    for
12f20 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
12f30 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
12f40 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
12f50 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75  ;.      if( (pFu
12f60 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  nc = pParse->aAg
12f70 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26  g[i].pFunc)!=0 &
12f80 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69  & pFunc->xFinali
12f90 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
12fa0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
12fb0 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30  v, OP_AggInit, 0
12fc0 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46 75 6e  , i, (char*)pFun
12fd0 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  c, P3_POINTER);.
12fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12ff0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
13000 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13010 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13020 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
13030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13040 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
13050 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20  gFocus, 0, 0);. 
13060 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
13070 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
13080 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
13090 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
130a0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
130b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
130c0 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
130d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
130e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
130f0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
13100 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
13110 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  /* Open a tempor
13120 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65  ary table to use
13130 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
13140 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
13150 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
13160 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
13170 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
13180 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78     openTempIndex
13190 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73 74  (pParse, p, dist
131a0 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  inct, 0);.  }els
131b0 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
131c0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
131d0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
131e0 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
131f0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
13200 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
13210 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
13220 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  re, 0, .        
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30      pGroupBy ? 0
13250 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20   : &pOrderBy);. 
13260 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
13270 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13280 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20  ;..  /* Use the 
13290 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
132a0 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f  oop if we are no
132b0 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20  t dealing with. 
132c0 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20   ** aggregates. 
132d0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
132e0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65   ){.    if( sele
132f0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
13300 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
13310 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
13320 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a  istinct, eDest,.
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66      iParm, pWInf
13350 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
13360 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66  Info->iBreak, af
13370 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74  f) ){.       got
13380 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
13390 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
133a0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
133b0 77 69 74 68 20 61 67 67 72 65 67 61 74 65 73 2c  with aggregates,
133c0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65   then do the spe
133d0 63 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20  cial aggregate. 
133e0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20   ** processing. 
133f0 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20   .  */.  else{. 
13400 20 20 20 41 67 67 45 78 70 72 20 2a 70 41 67 67     AggExpr *pAgg
13410 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  ;.    if( pGroup
13420 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
13430 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  lbl1;.      for(
13440 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
13450 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13470 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
13480 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
13490 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
134a0 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e 69 74     /* No affinit
134b0 79 20 73 74 72 69 6e 67 20 69 73 20 61 74 74 61  y string is atta
134c0 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ched to the foll
134d0 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 4b 65 79  owing OP_MakeKey
134e0 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75   .      ** becau
134f0 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  se we do not nee
13500 64 20 74 6f 20 64 6f 20 61 6e 79 20 63 6f 65 72  d to do any coer
13510 63 69 6f 6e 20 6f 66 20 64 61 74 61 74 79 70 65  cion of datatype
13520 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
13530 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13540 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f  OP_MakeKey, pGro
13550 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
13560 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
13570 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13580 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
13590 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
135a0 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
135b0 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f   lbl1);.      fo
135c0 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72  r(i=0, pAgg=pPar
135d0 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72  se->aAgg; i<pPar
135e0 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70  se->nAgg; i++, p
135f0 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Agg++){.        
13600 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20  if( pAgg->isAgg 
13610 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13630 6f 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67  ode(pParse, pAgg
13640 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
13650 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13660 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c  Op(v, OP_AggSet,
13670 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a   0, i);.      }.
13680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13690 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
136a0 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20   lbl1);.    }.  
136b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d    for(i=0, pAgg=
136c0 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c  pParse->aAgg; i<
136d0 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
136e0 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20  +, pAgg++){.    
136f0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
13700 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20    int nExpr;.   
13710 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
13720 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
13730 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  g->isAgg ) conti
13740 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
13750 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d  t( pAgg->pFunc!=
13760 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
13770 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e  t( pAgg->pFunc->
13780 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20  xStep!=0 );.    
13790 20 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70    pDef = pAgg->p
137a0 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d  Func;.      pE =
137b0 20 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20   pAgg->pExpr;.  
137c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
137d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
137e0 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  t( pE->op==TK_AG
137f0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
13800 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69      nExpr = sqli
13810 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
13820 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
13830 70 4c 69 73 74 2c 20 70 44 65 66 2d 3e 69 6e 63  pList, pDef->inc
13840 6c 75 64 65 54 79 70 65 73 29 3b 0a 20 20 20 20  ludeTypes);.    
13850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13860 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
13870 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
13880 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13890 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20   OP_AggFunc, 0, 
138a0 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44  nExpr, (char*)pD
138b0 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  ef, P3_POINTER);
138c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
138d0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
138e0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a  e scan loop..  *
138f0 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
13900 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
13910 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72 6f  /* If we are pro
13920 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
13930 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  es, we need to s
13940 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c  et up a second l
13950 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c  oop.  ** over al
13960 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  l of the aggrega
13970 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72  te values and pr
13980 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocess them..  */
13990 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
139a0 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d      int endagg =
139b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
139c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
139d0 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20  t startagg;.    
139e0 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74  startagg = sqlit
139f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13a00 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
13a10 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
13a20 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
13a30 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
13a40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13a50 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
13a60 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72  e, pHaving, star
13a70 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  tagg, 1);.    }.
13a80 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
13a90 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
13aa0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
13ab0 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
13ac0 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c  iParm, startagg,
13af0 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b   endagg, aff) ){
13b00 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
13b10 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
13b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13b30 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
13b40 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20  , startagg);.   
13b50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13b60 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61  lveLabel(v, enda
13b70 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gg);.    sqlite3
13b80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13b90 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
13ba0 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
13bb0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
13bc0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
13bd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
13be0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
13bf0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
13c00 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
13c10 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
13c20 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
13c30 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
13c40 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
13c50 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
13c60 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
13c70 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
13c80 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Parm);.  }..  /*
13c90 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73   If this was a s
13ca0 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65  ubquery, we have
13cb0 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74   now converted t
13cc0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
13cd0 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
13ce0 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c  y table.  So del
13cf0 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ete the subquery
13d00 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
13d10 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
13d20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  to prevent this 
13d30 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
13d40 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
13d50 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
13d60 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73   the.  ** the us
13d70 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  e of the tempora
13d80 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ry table..  */. 
13d90 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
13da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
13db0 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ent->pSrc->nSrc>
13dc0 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20  parentTab );.   
13dd0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
13de0 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
13df0 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20  Tab].pSelect==p 
13e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
13e10 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20  lectDelete(p);. 
13e20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
13e30 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
13e40 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  Select = 0;.  }.
13e50 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
13e60 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
13e70 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
13e80 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
13e90 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
13ea0 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
13eb0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
13ec0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
13ed0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
13ee0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
13ef0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
13f00 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
13f10 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
13f20 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
13f30 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71  select_end:.  sq
13f40 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
13f50 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
13f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.