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

Artifact 9aa82bbc63983a304bc51d4a7c259e759f92c8dc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 39 33  select.c,v 1.193
0200: 20 32 30 30 34 2f 30 36 2f 31 39 20 31 34 3a 34   2004/06/19 14:4
0210: 39 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a 2a  9:12 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0a00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0a10: 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20 69 6e 74  Keyword;.    int
0a20: 20 6e 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20   nChar;.    int 
0a30: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0a40: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0a50: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0a60: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0a70: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0a80: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0a90: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0aa0: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0ab0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ac0: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0ad0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0ae0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0af0: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0b00: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0b10: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0b20: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0b30: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0b40: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d   JT_INNER },.  }
0b50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
0b60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
0b70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
0b80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
0b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
0ba0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
0bb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
0bc0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
0bd0: 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ; j<sizeof(keywo
0be0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0bf0: 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a  ords[0]); j++){.
0c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
0c10: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
0c20: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
0c30: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
0c40: 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a  p->z, keywords[j
0c50: 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e  ].zKeyword, p->n
0c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
0c70: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77  jointype |= keyw
0c80: 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  ords[j].code;.  
0c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0ca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0cb0: 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79  f( j>=sizeof(key
0cc0: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
0cd0: 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20  ywords[0]) ){.  
0ce0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0cf0: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
0d00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0d10: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
0d20: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
0d30: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
0d40: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0d50: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
0d60: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
0d70: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 73 74 61 74  =0.  ){.    stat
0d80: 69 63 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 20 3d  ic Token dummy =
0d90: 20 7b 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 63   { 0, 0 };.    c
0da0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 2c  har *zSp1 = " ",
0db0: 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20   *zSp2 = " ";.  
0dc0: 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 70    if( pB==0 ){ p
0dd0: 42 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 31  B = &dummy; zSp1
0de0: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 69 66 28 20   = 0; }.    if( 
0df0: 70 43 3d 3d 30 20 29 7b 20 70 43 20 3d 20 26 64  pC==0 ){ pC = &d
0e00: 75 6d 6d 79 3b 20 7a 53 70 32 20 3d 20 30 3b 20  ummy; zSp2 = 0; 
0e10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  }.    sqlite3Set
0e20: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
0e30: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
0e40: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
0e50: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 2c 20  d join type: ", 
0e60: 30 2c 0a 20 20 20 20 20 20 20 70 41 2d 3e 7a 2c  0,.       pA->z,
0e70: 20 70 41 2d 3e 6e 2c 20 7a 53 70 31 2c 20 31 2c   pA->n, zSp1, 1,
0e80: 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e 6e 2c 20 7a   pB->z, pB->n, z
0e90: 53 70 32 2c 20 31 2c 20 70 43 2d 3e 7a 2c 20 70  Sp2, 1, pC->z, p
0ea0: 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  C->n, 0);.    pP
0eb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0ec0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0ed0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
0ee0: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
0ef0: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
0f00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0f10: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
0f20: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
0f30: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
0f40: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
0f50: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
0f60: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
0f80: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
0f90: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
0fa0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
0fb0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
0fc0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
0fd0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
0fe0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
0ff0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1000: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1010: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1020: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1050: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1060: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1070: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1080: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1090: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
10a0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
10b0: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
10c0: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
10d0: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
10e0: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
10f0: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
1100: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
1110: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
1120: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
1130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1140: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63  ddWhereTerm(.  c
1150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1180: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1190: 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46  pTab1,      /* F
11a0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
11b0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11c0: 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  b2,      /* Seco
11d0: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  nd table */.  Ex
11e0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
11f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1200: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1210: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1220: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  on */.){.  Token
1230: 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a   dummy;.  Expr *
1240: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1250: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1260: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1270: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 64    Expr *pE;..  d
1280: 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b 0a 20  ummy.z = zCol;. 
1290: 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65   dummy.n = strle
12a0: 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d 6d 79  n(zCol);.  dummy
12b0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45 31 61  .dyn = 0;.  pE1a
12c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
12d0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
12e0: 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71  my);.  pE2a = sq
12f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1300: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1310: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1320: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1330: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1340: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1350: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1360: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1370: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
1380: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
1390: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
13a0: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
13b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13c0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13d0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13f0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1400: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1410: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1420: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1430: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1440: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1450: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1460: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1470: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66  _FromJoin);.  if
1480: 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20  ( *ppExpr ){.   
1490: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
14a0: 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a  e3Expr(TK_AND, *
14b0: 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a  ppExpr, pE, 0);.
14c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
14d0: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d  Expr = pE;.  }.}
14e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1500: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
1510: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
1520: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1530: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1540: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1550: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1560: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1570: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1580: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1590: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
15a0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
15b0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
15c0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
15d0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
15e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
15f0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1600: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1610: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
1620: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
1630: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
1640: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
1650: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
1660: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
1670: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1680: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1690: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
16a0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
16b0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  NG clause..*/.st
16c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
16d0: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  nExpr(Expr *p){.
16e0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
16f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1700: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
1710: 29 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  );.    setJoinEx
1720: 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
1730: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
1740: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
1750: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
1760: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
1770: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
1780: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1790: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
17a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
17b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
17c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
17d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
17e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
17f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
1800: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
1810: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  erms..**.** This
1820: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1830: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1840: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
1850: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1860: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1870: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
1880: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1890: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
18a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72   int i, j;.  pSr
18b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  c = p->pSrc;.  f
18c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
18d0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  nSrc-1; i++){.  
18e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18f0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26  _item *pTerm = &
1900: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
1910: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1920: 74 65 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  tem *pOther = &p
1930: 53 72 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20  Src->a[i+1];..  
1940: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61    if( pTerm->pTa
1950: 62 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  b==0 || pOther->
1960: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
1970: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
1980: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
1990: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
19a0: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
19b0: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
19c0: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
19d0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
19e0: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
19f0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1a00: 66 28 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79  f( pTerm->jointy
1a10: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
1a20: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1a30: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1a40: 70 54 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54  pTerm->pOn || pT
1a50: 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  erm->pUsing ){. 
1a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a80: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
1a90: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
1aa0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
1ab0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
1ac0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
1ad0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1ae0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 65        pTab = pTe
1af0: 72 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  rm->pTab;.      
1b00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1b10: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1b20: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
1b30: 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61  ndex(pOther->pTa
1b40: 62 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  b, pTab->aCol[j]
1b50: 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20  .zName)>=0 ){.  
1b60: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
1b70: 54 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  Term(pTab->aCol[
1b80: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20  j].zName, pTab, 
1b90: 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70  pOther->pTab, &p
1ba0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
1bb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
1bd0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
1be0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
1bf0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
1c00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1c10: 65 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72  erm->pOn && pTer
1c20: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1c30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c40: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1c50: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
1c60: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
1c70: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
1c80: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
1c90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1cb0: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
1cc0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1cd0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
1ce0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
1cf0: 20 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65    ** and AND ope
1d00: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
1d10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1d20: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
1d30: 6e 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e  nExpr(pTerm->pOn
1d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1d50: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
1d60: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
1d70: 20 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20   pTerm->pOn;.   
1d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d90: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
1da0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1db0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65  , p->pWhere, pTe
1dc0: 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20  rm->pOn, 0);.   
1dd0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
1de0: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
1df0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1e00: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
1e10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
1e30: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
1e40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
1e50: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
1e60: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
1e70: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
1e80: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
1e90: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
1ea0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
1eb0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
1ec0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
1ee0: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
1ef0: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
1f00: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
1f10: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
1f20: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
1f30: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
1f40: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
1f50: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1f60: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
1f70: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
1f80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1f90: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
1fa0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b    IdList *pList;
1fb0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1fc0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 53      assert( i<pS
1fd0: 72 63 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20  rc->nSrc-1 );.  
1fe0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72      pList = pTer
1ff0: 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  m->pUsing;.     
2000: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
2010: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
2020: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
2030: 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61  Index(pTerm->pTa
2040: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  b, pList->a[j].z
2050: 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20  Name)<0 ||.     
2060: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
2070: 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c  ex(pOther->pTab,
2080: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
2090: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
20a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20b0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
20c0: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
20d0: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
20e0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
20f0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2100: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 70 4c 69  oth tables", pLi
2110: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  st->a[j].zName);
2120: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2130: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2140: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2150: 65 72 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  erm(pList->a[j].
2160: 7a 4e 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54  zName, pTerm->pT
2170: 61 62 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62  ab, pOther->pTab
2180: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21b0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
21c0: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
21d0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
21e0: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
21f0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2200: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2210: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
2220: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2230: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  n;.  sqlite3Expr
2240: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2250: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2260: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2270: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
2280: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2290: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
22a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
22b0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
22c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
22d0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22f0: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
2300: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
2310: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
2320: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  rior);.  sqliteF
2330: 72 65 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b  ree(p->zSelect);
2340: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
2350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2360: 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2370: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2380: 20 74 68 65 20 70 61 72 73 65 20 73 74 72 75 63   the parse struc
2390: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
23a0: 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72 65  void sqliteAggre
23b0: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61  gateInfoReset(Pa
23c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23d0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73  sqliteFree(pPars
23e0: 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72  e->aAgg);.  pPar
23f0: 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20  se->aAgg = 0;.  
2400: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
2410: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41  ;.  pParse->useA
2420: 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
2430: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2440: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2450: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2460: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2470: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2480: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
2490: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
24a0: 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20  ntoSorter(Parse 
24b0: 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76  *pParse, Vdbe *v
24c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64  , ExprList *pOrd
24d0: 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erBy){.  int i;.
24e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
24f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
2500: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
2510: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2520: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2530: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Expr);.  }.  sql
2540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2550: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2560: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c  pOrderBy->nExpr,
2570: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
2590: 72 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  rtPut, 0, 0);.}.
25a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25b0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
25c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
25d0: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
25e0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
25f0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
2600: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
2610: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
2620: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
2630: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
2640: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
2650: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
2660: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
2670: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
2680: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
2690: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
26a0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
26b0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
26c0: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
26d0: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
26e0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
26f0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e  ic int selectInn
2700: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
2710: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2720: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2730: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2740: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2750: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
2760: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
2770: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2780: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
2790: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
27a0: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
27b0: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
27c0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
27d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
27e0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
27f0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2800: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
2810: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2820: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
2830: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
2840: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2850: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
2860: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
2870: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
2880: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
2890: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
28a0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
28b0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
28c0: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
28d0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
2900: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
2910: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2930: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
2940: 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  e disposal metho
2950: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
2960: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
2970: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
2980: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
2990: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
29a0: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20  Break,          
29b0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
29c0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
29d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
29e0: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2a00: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
2a10: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
2a20: 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  nion */.){.  Vdb
2a30: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2a40: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Vdbe;.  int i;..
2a50: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
2a60: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
2a70: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
2a80: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
2a90: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
2aa0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
2ab0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f  atement, then do
2ac0: 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20   the check.  ** 
2ad0: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72  to see if this r
2ae0: 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74  ow should be out
2af0: 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
2b00: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2b10: 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65     if( p->iOffse
2b20: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t>=0 ){.      in
2b30: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
2b40: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b50: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2b60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2b70: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66  _MemIncr, p->iOf
2b80: 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20  fset, addr+2);. 
2b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ba0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
2bb0: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
2bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2bd0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
2be0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
2c00: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
2c10: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
2c20: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
2c30: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
2c40: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
2c50: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
2c60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
2c70: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c90: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
2ca0: 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20  srcTab, i);.    
2cb0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
2cc0: 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d  Column = pEList-
2cd0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
2ce0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
2cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2d00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2d10: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
2d20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2d30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
2d40: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
2d50: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
2d60: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
2d70: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
2d80: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
2d90: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
2da0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
2db0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
2dc0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
2dd0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
2de0: 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20   distinct>=0 && 
2df0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
2e00: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66  ->nExpr>0 ){.#if
2e10: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
2e20: 54 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65  TINCT.    sqlite
2e30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2e40: 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74  _IsNull, -pEList
2e50: 2d 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65 33  ->nExpr, sqlite3
2e60: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2e70: 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v)+7);.#endif.  
2e80: 20 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65 6c    /* Deliberatel
2e90: 79 20 6c 65 61 76 65 20 74 68 65 20 61 66 66 69  y leave the affi
2ea0: 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66 20  nity string off 
2eb0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ec0: 0a 20 20 20 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52  .    ** OP_MakeR
2ed0: 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ecord */.    sql
2ee0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2ef0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2f00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2a 20  pEList->nExpr * 
2f10: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  -1, 0);.    sqli
2f20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2f30: 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69 73  OP_Distinct, dis
2f40: 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 33 56 64  tinct, sqlite3Vd
2f50: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2f60: 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +3);.    sqlite3
2f70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f80: 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Pop, pEList->nEx
2f90: 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  pr+1, 0);.    sq
2fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2fb0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
2fc0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
2fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2fe0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
2ff0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3000: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3010: 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69  PutStrKey, disti
3020: 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nct, 0);.  }..  
3030: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
3040: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
3050: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
3060: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
3070: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
3080: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
3090: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
30a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
30b0: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
30c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30d0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
30e0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c  rd, nColumn, NUL
30f0: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
3100: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
3110: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
3120: 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41   -1, aff, P3_STA
3130: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
3140: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3150: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
3160: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3180: 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d  PutStrKey, iParm
3190: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
31a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
31b0: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
31c0: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
31d0: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
31e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
31f0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
3200: 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a  e SRT_TempTable:
3210: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3220: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3230: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
3240: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
3250: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
3260: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
3270: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
3280: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
3290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32b0: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
32c0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
32d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
32f0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
3300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3310: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
3320: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
3330: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3340: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3350: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
3360: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
3370: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
3380: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
3390: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
33a0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
33b0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
33c0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
33d0: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
33e0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
33f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3400: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
3410: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
3420: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3430: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3440: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
3450: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
3460: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
3470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
3480: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66  angeP3(v, -1, af
3490: 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  f, P3_STATIC);. 
34a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
34c0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
34d0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
34e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
34f0: 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d  OP_Delete, iParm
3500: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
3510: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3520: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
3530: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
3540: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
3550: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
3560: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
3570: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
3580: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
3590: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
35a0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
35b0: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
35c0: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
35d0: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
35e0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
35f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
3600: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
3610: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
3620: 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a       int addr2;.
3630: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
3640: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
3650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3660: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
3670: 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b  l, -1, addr1+3);
3680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3690: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
36a0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
36b0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
36c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
36d0: 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oto, 0, 0);.    
36e0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
36f0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
3700: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
3710: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
3720: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3730: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
3740: 61 66 66 53 74 72 3b 0a 20 20 20 20 20 20 20 20  affStr;.        
3750: 63 68 61 72 20 61 66 66 20 3d 20 28 69 50 61 72  char aff = (iPar
3760: 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20  m>>16)&0xFF;.   
3770: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
3780: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
3790: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
37a0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 20 20  Expr, aff);.    
37b0: 20 20 20 20 61 66 66 53 74 72 20 3d 20 73 71 6c      affStr = sql
37c0: 69 74 65 33 41 66 66 69 6e 69 74 79 53 74 72 69  ite3AffinityStri
37d0: 6e 67 28 61 66 66 29 3b 0a 20 20 20 20 20 20 20  ng(aff);.       
37e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
37f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3800: 2c 20 31 2c 20 30 2c 20 61 66 66 53 74 72 2c 20  , 1, 0, affStr, 
3810: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3830: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
3840: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
3850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3860: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
3870: 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30  Key, (iParm&0x00
3880: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
3890: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
38a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
38b0: 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65 33  , addr2, sqlite3
38c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
38d0: 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  v));.      break
38e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
38f0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
3900: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
3910: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
3920: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
3930: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
3940: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
3950: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
3960: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
3970: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
3980: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
3990: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
39a0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
39b0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
39c0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
39d0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
39e0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
39f0: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3a00: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3a10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3a30: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
3a40: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
3a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a60: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3a70: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
3a80: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3a90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e     }..    /* Sen
3aa0: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
3ab0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
3ac0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
3ad0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
3ae0: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
3af0: 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Sorter: {.      
3b00: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3b20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3b30: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3b40: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mn, 0);.        
3b50: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3b60: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3b70: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3b80: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
3b90: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
3ba0: 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  lback );.       
3bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3bc0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
3bd0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3bf0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3c00: 2a 20 49 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f  * Invoke a subro
3c10: 75 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20  utine to handle 
3c20: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
3c30: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
3c40: 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  elf.    ** is re
3c50: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f  sponsible for po
3c60: 70 70 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  pping the result
3c70: 73 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61  s off of the sta
3c80: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
3c90: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
3ca0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
3cb0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
3cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3cd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3ce0: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3cf0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  0);.        push
3d00: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
3d10: 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, v, pOrderBy);
3d20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
3d50: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
3d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3d70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3d80: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
3d90: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
3da0: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
3db0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
3dc0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
3dd0: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
3de0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
3df0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
3e00: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
3e10: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
3e20: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
3e30: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
3e40: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
3e50: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
3e60: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
3e70: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
3e80: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
3e90: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
3ea0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
3eb0: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ard );.      sql
3ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ed0: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
3ee0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
3ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
3f00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3f10: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
3f20: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
3f30: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
3f40: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
3f50: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
3f60: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
3f70: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
3f80: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
3f90: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
3fa0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
3fb0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
3fc0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
3fd0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
3fe0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
3ff0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
4000: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
4010: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
4020: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
4030: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
4040: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65  pParse,   /* The
4050: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
4060: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
4070: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
4080: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
4090: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
40a0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
40b0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
40c0: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
40d0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75  olumn,     /* Nu
40e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
40f0: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  of data */.  int
4100: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a   eDest,       /*
4110: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
4120: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
4130: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20  /.  int iParm   
4140: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
4150: 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63   parameter assoc
4160: 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73 74  iated with eDest
4170: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64   */.){.  int end
4180: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  1 = sqlite3VdbeM
4190: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
41a0: 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c 69 74 65  nt end2 = sqlite
41b0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
41c0: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  );.  int addr;. 
41d0: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
41e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
41f0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 43 6f  derBy;.  int nCo
4200: 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a  l, i;.  sqlite *
4210: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4220: 0a 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ..  if( eDest==S
4230: 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75  RT_Sorter ) retu
4240: 72 6e 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  rn;.  pOrderBy =
4250: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
4260: 6e 43 6f 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d  nCol = pOrderBy-
4270: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
4280: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4290: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
42a0: 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f   nCol*(sizeof(Co
42b0: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
42c0: 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72  if( pInfo==0 ) r
42d0: 65 74 75 72 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e  eturn;.  pInfo->
42e0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68  aSortOrder = (ch
42f0: 61 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  ar*)&pInfo->aCol
4300: 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f  l[nCol];.  pInfo
4310: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
4320: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
4330: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ol; i++){.    /*
4340: 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   If a collation 
4350: 73 65 71 75 65 6e 63 65 20 77 61 73 20 73 70 65  sequence was spe
4360: 63 69 66 69 65 64 20 65 78 70 6c 69 63 69 74 79  cified explicity
4370: 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a  , then it.    **
4380: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 4f   is stored in pO
4390: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61  rderBy->a[i].zNa
43a0: 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  me. Otherwise, u
43b0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  se the default. 
43c0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
43d0: 74 79 70 65 20 66 6f 72 20 74 68 65 20 65 78 70  type for the exp
43e0: 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ression..    */.
43f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
4400: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [i] = sqlite3Exp
4410: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
4420: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
4430: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
4440: 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  !pInfo->aColl[i]
4450: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
4460: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e  >aColl[i] = db->
4470: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
4480: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  .    pInfo->aSor
4490: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
44a0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
44b0: 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rder;.  }.  sqli
44c0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
44d0: 5f 53 6f 72 74 2c 20 30 2c 20 30 2c 20 28 63 68  _Sort, 0, 0, (ch
44e0: 61 72 2a 29 70 49 6e 66 6f 2c 20 50 33 5f 4b 45  ar*)pInfo, P3_KE
44f0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
4500: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4510: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4520: 53 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64  SortNext, 0, end
4530: 31 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  1);.  if( p->iOf
4540: 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  fset>=0 ){.    s
4550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4560: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
4570: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 2b  ->iOffset, addr+
4580: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
4590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
45a0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
45b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
45c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
45d0: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ddr);.  }.  if( 
45e0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
45f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4600: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4610: 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 65  cr, p->iLimit, e
4620: 6e 64 32 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  nd2);.  }.  swit
4630: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
4640: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4650: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
4660: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
4670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4680: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4690: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
46a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
46b0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
46c0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
46d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
46e0: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
46f0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4700: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4710: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4730: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4750: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
4760: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  l, -1, sqlite3Vd
4770: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4780: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4790: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
47a0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
47b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
47c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
47d0: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
47e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
47f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4800: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
4810: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22  eRecord, 1, 0, "
4820: 6e 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  n", P3_STATIC);.
4830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4840: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
4850: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
4860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4870: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
4880: 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30  Key, (iParm&0x00
4890: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
48a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
48b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
48c0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
48d0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
48e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
48f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4900: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4920: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4930: 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20  oto, 0, end1);. 
4940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4950: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  }.    case SRT_C
4960: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
4970: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
4980: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
4990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
49a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
49b0: 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74  teger, p->pEList
49c0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
49d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
49e0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
49f0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 0);.      for
4a00: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4a10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
4a20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31  v, OP_Column, -1
4a40: 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  -i, i);.      }.
4a50: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
4a60: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
4a70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4a80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4a90: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
4aa0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n, 0);.      }el
4ab0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4ad0: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
4ae0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
4af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4b00: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32  dOp(v, OP_Pop, 2
4b10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4b20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
4b30: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
4b40: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
4b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b60: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
4b70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4b80: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
4b90: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
4ba0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 32  lveLabel(v, end2
4bb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4bc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4bd0: 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   1, 0);.  sqlite
4be0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
4bf0: 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73 71  l(v, end1);.  sq
4c00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4c10: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4c20: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4c30: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4c40: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
4c50: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
4c60: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
4c70: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
4c80: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
4c90: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
4ca0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
4cb0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
4cc0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 65 63 6c 61  .** If the decla
4cd0: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
4ce0: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
4cf0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
4d00: 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  racted from.** t
4d10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  he original CREA
4d20: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4d30: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
4d40: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
4d50: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ..** .** The dec
4d60: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
4d70: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
4d80: 69 73 20 65 69 74 68 65 72 20 54 45 58 54 2c 20  is either TEXT, 
4d90: 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e 59 2e 0a  NUMERIC or ANY..
4da0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
4db0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
4dc0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
4dd0: 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  EGER..*/.static 
4de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
4df0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
4e00: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
4e10: 54 61 62 4c 69 73 74 2c 20 45 78 70 72 20 2a 70  TabList, Expr *p
4e20: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 63 6f  Expr){.  char co
4e30: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
4e40: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70    int j;.  if( p
4e50: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
4e60: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
4e70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
4e80: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
4e90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
4ea0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
4eb0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
4ec0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
4ed0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
4ee0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
4ef0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
4f00: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
4f10: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
4f20: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
4f30: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
4f40: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
4f50: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
4f60: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
4f70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  ;.    assert( iC
4f80: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
4f90: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
4fa0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 69 66  >nCol) );.    if
4fb0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
4fc0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
4fd0: 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER";.    }else{.
4fe0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
4ff0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5000: 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Type;.      if( 
5010: 21 7a 54 79 70 65 20 29 20 7a 54 79 70 65 20 3d  !zType ) zType =
5020: 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   "";.    }.  }el
5030: 73 65 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  se{.    switch( 
5040: 73 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28  sqlite3ExprType(
5050: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
5060: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
5070: 54 45 58 54 3a 20 20 20 20 20 7a 54 79 70 65 20  TEXT:     zType 
5080: 3d 20 22 54 45 58 54 22 3b 20 20 20 20 62 72 65  = "TEXT";    bre
5090: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
50a0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
50b0: 43 3a 20 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d  C:  zType = "NUM
50c0: 45 52 49 43 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ERIC"; break;.  
50d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
50f0: 79 70 65 20 3d 20 22 41 4e 59 22 3b 20 20 20 20  ype = "ANY";    
5100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5110: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
5120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
5130: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
5140: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
5150: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
5160: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
5170: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
5180: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
5190: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
51a0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
51b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
51c0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
51d0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
51e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
51f0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
5200: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5210: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
5220: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
5230: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
5240: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5250: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5260: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
5270: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
5280: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
5290: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
52a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
52b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
52c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
52d0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
52e0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  , p);.    if( p=
52f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5300: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
5310: 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77  ust make it's ow
5320: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
5330: 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61  lumn-type, in ca
5340: 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  se the .    ** s
5350: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
5360: 65 66 6f 72 65 20 74 68 69 73 20 76 69 72 74 75  efore this virtu
5370: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
5380: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
5390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
53a0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c  ColName(v, i+pEL
53b0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70  ist->nExpr, zTyp
53c0: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29  e, strlen(zType)
53d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
53e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
53f0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
5400: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
5410: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
5420: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
5430: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
5440: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
5450: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
5460: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
5470: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
5480: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5490: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
54a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
54b0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
54c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
54d0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
54e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
54f0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5500: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5510: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5520: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
5530: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
5540: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5550: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
5560: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
5570: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5580: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
5590: 72 74 4e 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20 49  rtNames;..  /* I
55a0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
55b0: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
55c0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
55d0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
55e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
55f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
5600: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
5610: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
5620: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   v==0 || sqlite3
5630: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
5640: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
5650: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
5660: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
5670: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
5680: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
5690: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
56a0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
56b0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
56c0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
56d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
56e0: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
56f0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
5700: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
5710: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
5720: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
5730: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5740: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
5750: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5760: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
5770: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
5780: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
5790: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
57a0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
57b0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
57c0: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  , i, zName, strl
57d0: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  en(zName));.    
57e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
57f0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  }.    if( p->op=
5800: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54  =TK_COLUMN && pT
5810: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
5820: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
5830: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
5840: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
5850: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
5860: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
5870: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
5880: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
5890: 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65  ursor!=p->iTable
58a0: 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61  ; j++){}.      a
58b0: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
58c0: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
58d0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
58e0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
58f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
5900: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
5910: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
5920: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
5930: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5940: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
5950: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5960: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
5970: 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20   "_ROWID_";.    
5980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5990: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
59a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
59b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
59c0: 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26  ( !shortNames &&
59d0: 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70   !fullNames && p
59e0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
59f0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
5a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5a10: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
5a20: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
5a30: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  an.n);.      }el
5a40: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
5a50: 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73   || (!shortNames
5a60: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
5a70: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
5a80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
5a90: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
5aa0: 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20  zTab;. .        
5ab0: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
5ac0: 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[j].zAlias;.  
5ad0: 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61        if( fullNa
5ae0: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
5af0: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
5b00: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
5b10: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
5b20: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
5b30: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
5b40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5b50: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
5b60: 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  Name, P3_DYNAMIC
5b70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5b80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5b90: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5ba0: 20 69 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20   i, zCol, 0);.  
5bb0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
5bc0: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
5bd0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
5be0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5bf0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5c00: 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  i, p->span.z, p-
5c10: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
5c20: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
5c30: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
5c40: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
5c50: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
5c60: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
5c70: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
5c80: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
5c90: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
5ca0: 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20   sprintf(zName, 
5cb0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
5cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5cd0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5ce0: 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   i, zName, 0);. 
5cf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
5d00: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
5d10: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
5d20: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
5d30: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
5d40: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
5d50: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
5d60: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
5d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5d80: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
5d90: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
5da0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
5db0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
5dc0: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
5dd0: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
5de0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5df0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
5e00: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
5e10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5e20: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
5e30: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
5e50: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
5e60: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
5e70: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5e80: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
5e90: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
5ea0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
5eb0: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
5ec0: 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  ist(Parse*, Sele
5ed0: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
5ee0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
5ef0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
5f00: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
5f10: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
5f20: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
5f30: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
5f40: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
5f50: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
5f60: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
5f70: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
5f80: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
5f90: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
5fa0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
5fb0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
5fc0: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
5fd0: 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69 6c  aCol;..  if( fil
5fe0: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
5ff0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
6000: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6010: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
6020: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
6030: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
6040: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
6050: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6060: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
6070: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
6080: 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29  StrDup(zTabName)
6090: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
60a0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
60b0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
60c0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
60d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
60e0: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
60f0: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
6100: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6110: 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  zeof(pTab->aCol[
6120: 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  0])*pTab->nCol )
6130: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6140: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
6150: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 3b 0a 20  .    Expr *pR;. 
6160: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
6170: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
6180: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6190: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
61a0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
61b0: 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e        aCol[i].zN
61c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
61d0: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  up(pEList->a[i].
61e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
61f0: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
6200: 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  DOT .           
6210: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
6220: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
6230: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
6240: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
6250: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
6260: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
6270: 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ing(&aCol[i].zNa
6280: 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c  me, pR->token.z,
6290: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29   pR->token.n, 0)
62a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e  ;.      for(j=cn
62b0: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
62c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
62d0: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
62e0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69  j].zName, aCol[i
62f0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6300: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
6310: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
6320: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20  Buf[30];.       
6330: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
6340: 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20  "_%d",++cnt);.  
6350: 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c          n = strl
6360: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  en(zBuf);.      
6370: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
6380: 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a  tring(&aCol[i].z
6390: 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e  Name, pR->token.
63a0: 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  z, pR->token.n, 
63b0: 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20 20 20  zBuf,n,0);.     
63c0: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
63d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
63e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
63f0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
6400: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6410: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
6420: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
6430: 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e  .zName, p->span.
6440: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29  z, p->span.n, 0)
6450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6460: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
6470: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
6480: 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  zBuf, "column%d"
6490: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54  , i+1);.      pT
64a0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
64b0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
64c0: 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  (zBuf);.    }.. 
64d0: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
64e0: 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79  eStrDup(columnTy
64f0: 70 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  pe(pParse, pSele
6500: 63 74 2d 3e 70 53 72 63 20 2c 70 29 29 3b 0a 20  ct->pSrc ,p));. 
6510: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
6520: 2e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a  .zType = zType;.
6530: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
6540: 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ].affinity = SQL
6550: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
6560: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 29  .    if( zType )
6570: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  {.      pTab->aC
6580: 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d  ol[i].affinity =
6590: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
65a0: 54 79 70 65 28 7a 54 79 70 65 2c 20 73 74 72 6c  Type(zType, strl
65b0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 20 20  en(zType));.    
65c0: 7d 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  }.    pTab->aCol
65d0: 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  [i].pColl = sqli
65e0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
65f0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
6600: 66 28 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( !pTab->aCol[i
6610: 5d 2e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ].pColl ){.     
6620: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70   pTab->aCol[i].p
6630: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
6640: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
6650: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
6660: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
6670: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
6680: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65  .** For the give
6690: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
66a0: 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69  nt, do three thi
66b0: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs..**.**    (1
66c0: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
66d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
66e0: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
66f0: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
6700: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
6710: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
6720: 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  es that should b
6730: 65 20 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20  e scanned.  For 
6740: 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20  views,.**       
6750: 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
6760: 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
6770: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
6780: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6790: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
67a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
67b0: 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
67c0: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
67d0: 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
67e0: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
67f0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
6800: 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
6810: 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
6820: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
6830: 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
6840: 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
6850: 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
6860: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
6870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
6880: 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
6890: 20 20 28 32 29 20 20 41 64 64 20 74 65 72 6d 73    (2)  Add terms
68a0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
68b0: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
68c0: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
68d0: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
68e0: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
68f0: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
6900: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
6910: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53  .**.**    (3)  S
6920: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
6930: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
6940: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
6950: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
6960: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
6970: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
6980: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
6990: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
69a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
69b0: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
69c0: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
69d0: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
69e0: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
69f0: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
6a00: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
6a10: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
6a20: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
6a30: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
6a40: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
6a50: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
6a60: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
6a70: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
6a80: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
6a90: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
6aa0: 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  mnList(Parse *pP
6ab0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
6ac0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
6ad0: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
6ae0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
6af0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
6b00: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20  Table *pTab;..  
6b10: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
6b20: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
6b30: 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  1;.  pTabList = 
6b40: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
6b50: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
6b60: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
6b70: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
6b80: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
6b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
6ba0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
6bb0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62  +){.    if( pTab
6bc0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
6bd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
6be0: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
6bf0: 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65   before!  No nee
6c00: 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f  d to continue */
6c10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6c20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6c30: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
6c40: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
6c50: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
6c60: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
6c70: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
6c80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6c90: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6ca0: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
6cb0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6cc0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29  a[i].zAlias==0 )
6cd0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
6ce0: 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20  FakeName[60];.  
6cf0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46        sprintf(zF
6d00: 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  akeName, "sqlite
6d10: 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a  _subquery_%p_",.
6d20: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
6d30: 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  *)pTabList->a[i]
6d40: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
6d50: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
6d60: 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d 3e 61  ing(&pTabList->a
6d70: 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b  [i].zAlias, zFak
6d80: 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  eName, 0);.     
6d90: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73   }.      pTabLis
6da0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70  t->a[i].pTab = p
6db0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
6dc0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
6dd0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
6de0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6df0: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6e20: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6e30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
6e40: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
6e50: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
6e70: 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20  The isTransient 
6e80: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
6e90: 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74  hat the Table st
6ea0: 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e  ructure has been
6eb0: 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
6ec0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
6ed0: 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64  and may be freed
6ee0: 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49   at any time.  I
6ef0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20  n other words,. 
6f00: 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20       ** pTab is 
6f10: 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
6f20: 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  a persistent tab
6f30: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
6f40: 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20  t defines.      
6f50: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
6f60: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
6f70: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
6f80: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
6f90: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
6fa0: 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
6fb0: 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
6fc0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6fd0: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6fe0: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6ff0: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
7000: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
7010: 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e  Parse,pTabList->
7020: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c  a[i].zName,pTabL
7030: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62  ist->a[i].zDatab
7040: 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
7050: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
7060: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7070: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7080: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
7090: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
70a0: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
70b0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
70c0: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
70d0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
70e0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
70f0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
7100: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
7110: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
7130: 2a 20 49 66 20 70 54 61 62 4c 69 73 74 2d 3e 61  * If pTabList->a
7140: 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 69  [i].pSelect!=0 i
7150: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
7160: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
7170: 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
7180: 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
7190: 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
71a0: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
71b0: 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
71c0: 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
71d0: 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
71e0: 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
71f0: 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
7200: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
7210: 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
7220: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
7230: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
7240: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
7250: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
7260: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
7270: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7280: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
7290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
72b0: 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
72c0: 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
72d0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
72e0: 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
72f0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
7300: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
7310: 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20  se, p) ) return 
7320: 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65  1;..  /* For eve
7330: 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
7340: 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
7350: 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
7360: 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
7370: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
7380: 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
7390: 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
73a0: 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
73b0: 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
73c0: 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
73d0: 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
73e0: 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
73f0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
7400: 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
7410: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
7420: 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
7430: 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
7440: 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
7450: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
7460: 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
7470: 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
7480: 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
7490: 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
74a0: 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
74b0: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
74c0: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
74d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
74e0: 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
74f0: 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
7500: 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
7510: 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
7520: 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
7530: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
7540: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
7550: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
7560: 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
7570: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
7580: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
7590: 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
75a0: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
75b0: 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
75c0: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
75d0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20  op==TK_ALL.     
75e0: 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74      && pE->pLeft
75f0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
7600: 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b  p==TK_ID ) break
7610: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a  ;.  }.  rc = 0;.
7620: 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
7630: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
7640: 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
7650: 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
7660: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
7670: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
7680: 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
7690: 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
76a0: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
76b0: 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
76c0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
76d0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
76e0: 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
76f0: 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
7700: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
7710: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7720: 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
7730: 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
7740: 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
7750: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
7760: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
7770: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
7780: 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
7790: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
77a0: 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
77b0: 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
77c0: 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
77d0: 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
77e0: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
77f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
7800: 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
7810: 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
7820: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
7830: 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
7840: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
7850: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7860: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b  tAppend(pNew, a[
7870: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
7880: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
7890: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
78a0: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
78b0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
78c0: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
78d0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
78e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
78f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
7900: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
7910: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
7920: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
7930: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
7940: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
7950: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
7960: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
7970: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
7980: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
7990: 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b     Token *pName;
79a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
79b0: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
79c0: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
79d0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
79e0: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
79f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
7a00: 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e  e = &pE->pLeft->
7a10: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  token;.        }
7a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7a30: 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  pName = 0;.     
7a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
7a50: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
7a60: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
7a70: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
7a80: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7a90: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
7aa0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
7ab0: 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ame = pTabList->
7ac0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[i].zAlias;.   
7ad0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
7ae0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
7af0: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
7b00: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
7b10: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
7b20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7b30: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
7b40: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
7b50: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
7b60: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
7b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7b80: 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a  trNICmp(pName->z
7b90: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d  , zTabName, pNam
7ba0: 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20  e->n)!=0 ||.    
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61               zTa
7bc0: 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21  bName[pName->n]!
7bd0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
7be0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7bf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c00: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
7c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
7c20: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
7c30: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
7c40: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7c50: 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  , *pLeft, *pRigh
7c60: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
7c70: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
7c80: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
7c90: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
7ca0: 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c  f( i>0 && (pTabL
7cb0: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e  ist->a[i-1].join
7cc0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
7cd0: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
7ce0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
7cf0: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
7d00: 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d  [i-1].pTab, zNam
7d10: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
7d20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
7d30: 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
7d40: 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
7d50: 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
7d60: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
7d70: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
7d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7d90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7da0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7db0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
7dc0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
7dd0: 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  dex(pTabList->a[
7de0: 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  i-1].pUsing, zNa
7df0: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7e00: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7e10: 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
7e20: 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
7e30: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
7e50: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
7e60: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
7e70: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7e80: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7e90: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7ea0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
7eb0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
7ec0: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
7ed0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7ee0: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20  if( pRight==0 ) 
7ef0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7f00: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
7f10: 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  .z = zName;.    
7f20: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
7f30: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
7f40: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
7f50: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7f60: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
7f70: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
7f80: 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74  Name && pTabList
7f90: 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
7fa0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
7fb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
7fc0: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
7fe0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7ff0: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
8000: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
8010: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
8020: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
8040: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  eft->token.z = z
8050: 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  TabName;.       
8060: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
8070: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
8080: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
8090: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
80a0: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
80c0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 28 63 68  te3SetString((ch
80d0: 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61  ar**)&pExpr->spa
80e0: 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22  n.z, zTabName, "
80f0: 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  .", zName, 0);. 
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8110: 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72  pr->span.n = str
8120: 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  len(pExpr->span.
8130: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
8140: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
8150: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
8160: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
8170: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
8180: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
8190: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
81a0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
81b0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
81c0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
81d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
81e0: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8200: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
8210: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
8220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8230: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
8240: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8250: 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29  (pNew, pExpr, 0)
8260: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8280: 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
8290: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
82a0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  pName ){.       
82b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
82c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
82d0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22   such table: %T"
82e0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
82f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8310: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8320: 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
8330: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
8340: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
8350: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
8360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8380: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
8390: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
83a0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
83b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
83c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63  This routine rec
83d0: 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73  ursively unlinks
83e0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
83f0: 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65  .a[].pTab pointe
8400: 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63  rs.** in a selec
8410: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  t structure.  It
8420: 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70   just sets the p
8430: 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e  ointers to NULL.
8440: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
8450: 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69  e is recursive i
8460: 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
8470: 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70   if the Select.p
8480: 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a  Src.a[].pSelect.
8490: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ** pointer is no
84a0: 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75  t NULL, this rou
84b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
84c0: 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
84d0: 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  at pointer..**.*
84e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
84f0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
8500: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
8510: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a   that defines a.
8520: 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72  ** VIEW in order
8530: 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e   to undo any bin
8540: 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e  dings to tables.
8550: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
8560: 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ary.** because t
8570: 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68  hose tables migh
8580: 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61  t be DROPed by a
8590: 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20   subsequent SQL 
85a0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74  command..** If t
85b0: 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20  he bindings are 
85c0: 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65  not removed, the
85d0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
85e0: 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  c->a[].pTab fiel
85f0: 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66  d.** will be lef
8600: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
8610: 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c  deallocated Tabl
8620: 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65  e structure afte
8630: 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e  r the.** DROP an
8640: 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c  d a coredump wil
8650: 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74  l occur the next
8660: 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20 69   time the VIEW i
8670: 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  s used..*/.void 
8680: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
8690: 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ind(Select *p){.
86a0: 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
86b0: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
86c0: 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  rc;.  Table *pTa
86d0: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
86e0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
86f0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
8700: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28   i++){.    if( (
8710: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69  pTab = pSrc->a[i
8720: 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20  ].pTab)!=0 ){.  
8730: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
8740: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
8750: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
8760: 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29  teTable(0, pTab)
8770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8780: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  pSrc->a[i].pTab 
8790: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
87a0: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
87b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
87c0: 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64  ite3SelectUnbind
87d0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c  (pSrc->a[i].pSel
87e0: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
87f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8800: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
8810: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
8820: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
8830: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8840: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
8850: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
8860: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
8870: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
8880: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
8890: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
88a0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
88b0: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
88c0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
88d0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
88e0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
88f0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
8900: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
8910: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
8920: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
8930: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
8940: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
8950: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
8960: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
8970: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
8980: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
8990: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
89a0: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
89b0: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
89c0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
89d0: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
89e0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
89f0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
8a00: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
8a10: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
8a20: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
8a30: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
8a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8a50: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
8a60: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
8a70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8a80: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
8a90: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
8aa0: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
8ab0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
8ac0: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
8ad0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
8ae0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
8af0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
8b00: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
8b10: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
8b20: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
8b30: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
8b40: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
8b50: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
8b60: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
8b70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
8b80: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
8b90: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
8ba0: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
8bb0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
8bc0: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
8bd0: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
8be0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
8bf0: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
8c00: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
8c10: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
8c20: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
8c30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
8c40: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
8c50: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
8c60: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
8c70: 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  }.  if( fillInCo
8c80: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
8c90: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
8ca0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
8cb0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
8cc0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
8cd0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
8ce0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65  lumn(pParse, pSe
8cf0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  lect->pPrior, pO
8d00: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
8d10: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
8d20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8d30: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8d40: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
8d50: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8d60: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
8d70: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
8d80: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
8d90: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
8da0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  l = -1;.    if( 
8db0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8dc0: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
8dd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
8de0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
8df0: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
8e00: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
8e10: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
8e20: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
8e30: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8e40: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
8e50: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
8e60: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
8e70: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
8e80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
8e90: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
8ea0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
8eb0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
8ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8ed0: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
8ee0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8ef0: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
8f00: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
8f10: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
8f20: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
8f30: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
8f40: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
8f50: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
8f60: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
8f70: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
8f80: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
8f90: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
8fa0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8fb0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
8fc0: 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74    zLabel = sqlit
8fd0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
8fe0: 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pE->token);.   
8ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61       assert( zLa
9000: 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  bel!=0 );.      
9010: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9020: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
9030: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
9040: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
9050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9060: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62   sqliteFree(zLab
9070: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
9080: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
9090: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
90a0: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
90b0: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
90c0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
90d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
90e0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
90f0: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
9100: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
9110: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
9120: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
9130: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
9140: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
9150: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
9160: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
9170: 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70  ol<0 && mustComp
9180: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  lete ){.      sq
9190: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
91a0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
91b0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
91c0: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
91d0: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
91e0: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
91f0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
9200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
9220: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rr;  .}../*.** G
9230: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
9240: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
9250: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
9260: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9270: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9280: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9290: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
92a0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
92b0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
92c0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
92d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
92e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
92f0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
9300: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
9310: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
9330: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
9340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
9350: 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 2a 2a  ;.}..#if 0  /***
9360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9370: 6e 65 65 64 73 20 64 65 6c 65 74 69 6e 67 20 2a  needs deleting *
9380: 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ****/.static voi
9390: 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66  d multiSelectAff
93a0: 69 6e 69 74 79 28 53 65 6c 65 63 74 20 2a 70 2c  inity(Select *p,
93b0: 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
93c0: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21 70  int i;..  if( !p
93d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 75 6c   ) return;.  mul
93e0: 74 69 53 65 6c 65 63 74 41 66 66 69 6e 69 74 79  tiSelectAffinity
93f0: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 7a 41 66 66  (p->pPrior, zAff
9400: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
9410: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
9420: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
9430: 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c 30 27 20 29   zAff[i]=='\0' )
9440: 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69 5d 20  {.      zAff[i] 
9450: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
9460: 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
9470: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
9480: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
9490: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
94a0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
94b0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
94c0: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
94d0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d  d on the.** nLim
94e0: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66  it and nOffset f
94f0: 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61  ields.  nLimit a
9500: 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd nOffset hold 
9510: 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  the integers.** 
9520: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
9530: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
9540: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
9550: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
9560: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
9570: 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20  .  Or that hold 
9580: 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73  -1 and 0 if thos
9590: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
95a0: 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69  mitted..** iLimi
95b0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
95c0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
95d0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
95e0: 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75  mbers for.** cou
95f0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
9600: 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
9610: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
9620: 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c  there is no.** l
9630: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
9640: 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20  et, then iLimit 
9650: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9660: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
9670: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
9680: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
9690: 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  if iLimit and iO
96a0: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
96b0: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
96c0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
96d0: 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66   nLimit and nOff
96e0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
96f0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
9700: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
9710: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
9720: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
9730: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
9740: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
9750: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
9760: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
9770: 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69  ** Only if nLimi
9780: 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e  t>=0 or nOffset>
9790: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
97a0: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
97b0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
97c0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
97d0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
97e0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
97f0: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
9800: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
9810: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
9820: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
9830: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
9840: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
9850: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
9860: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
9870: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
9880: 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20  ect *p){.  /* . 
9890: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61   ** If the compa
98a0: 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d  rison is p->nLim
98b0: 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54  it>0 then "LIMIT
98c0: 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61   0" shows.  ** a
98d0: 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20  ll rows.  It is 
98e0: 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c  the same as no l
98f0: 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d  imit. If the com
9900: 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a  parision is.  **
9910: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68   p->nLimit>=0 th
9920: 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f  en "LIMIT 0" sho
9930: 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c  w no rows at all
9940: 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31  ..  ** "LIMIT -1
9950: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
9960: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
9970: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
9980: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
9990: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
99a0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
99b0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
99c0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
99d0: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
99e0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
99f0: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
9a00: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69   */.  if( p->nLi
9a10: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit>=0 ){.    in
9a20: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
9a30: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
9a40: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
9a50: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9a60: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
9a70: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
9a80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9a90: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c  _Integer, -p->nL
9aa0: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
9ab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9ac0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
9ad0: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
9ae0: 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  iLimit = iMem;. 
9af0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66   }.  if( p->nOff
9b00: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  set>0 ){.    int
9b10: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
9b20: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65  nMem++;.    Vdbe
9b30: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
9b40: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
9b50: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
9b60: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
9b70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9b80: 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66  Integer, -p->nOf
9b90: 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  fset, 0);.    sq
9ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9bb0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
9bc0: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
9bd0: 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a  iOffset = iMem;.
9be0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9bf0: 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74 72  erate VDBE instr
9c00: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c  uctions that wil
9c10: 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65  l open a transie
9c20: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a  nt table that.**
9c30: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
9c40: 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f  r an index or to
9c50: 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73   store keyed res
9c60: 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ults for a compo
9c70: 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20  und.** select.  
9c80: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
9c90: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
9ca0: 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64   table that need
9cb0: 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  s a.** KeyInfo s
9cc0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e  tructure.  The n
9cd0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9ce0: 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   in the KeyInfo 
9cf0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
9d00: 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20 73   by the result s
9d10: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9d20: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
9d30: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9d40: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69  t..**.** Specifi
9d50: 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74  cally, this rout
9d60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
9d70: 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74   open an index t
9d80: 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54  able for.** DIST
9d90: 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54  INCT, UNION, INT
9da0: 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45 50  ERSECT and EXCEP
9db0: 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  T select stateme
9dc0: 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a  nts (but not .**
9dd0: 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a   UNION ALL)..**.
9de0: 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  ** Make the new 
9df0: 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61 74  table a KeyAsDat
9e00: 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41 73  a table if keyAs
9e10: 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Data is true..**
9e20: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
9e30: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 61 64  turned is the ad
9e40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
9e50: 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63  OpenTemp instruc
9e60: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9e70: 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65  int openTempInde
9e80: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
9e90: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
9ea0: 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73 44  iTab, int keyAsD
9eb0: 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  ata){.  KeyInfo 
9ec0: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
9ed0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69   nColumn;.  sqli
9ee0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
9ef0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
9f00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
9f10: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 61  ->pVdbe;.  int a
9f20: 64 64 72 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c  ddr;..  if( fill
9f30: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
9f40: 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
9f50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
9f60: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69  Column = p->pELi
9f70: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65  st->nExpr;.  pKe
9f80: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
9f90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b  lloc( sizeof(*pK
9fa0: 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a  eyInfo)+nColumn*
9fb0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9fc0: 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   );.  if( pKeyIn
9fd0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fo==0 ) return 0
9fe0: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  ;.  pKeyInfo->en
9ff0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
a000: 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d  enc;.  pKeyInfo-
a010: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d  >nField = nColum
a020: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
a030: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
a040: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
a050: 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[i] = sqlite3E
a060: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
a070: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
a080: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
a090: 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  f( !pKeyInfo->aC
a0a0: 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
a0b0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
a0c0: 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  i] = db->pDfltCo
a0d0: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ll;.    }.  }.  
a0e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
a0f0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
a100: 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20 0a  Temp, iTab, 0, .
a110: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
a120: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
a130: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66  O_HANDOFF);.  if
a140: 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a 20  ( keyAsData ){. 
a150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a160: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
a170: 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20  ata, iTab, 1);. 
a180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
a190: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
a1a0: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54  multiSelectOpenT
a1b0: 65 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20 2a  empAddr(Select *
a1c0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 49 64 4c  p, int addr, IdL
a1d0: 69 73 74 20 2a 2a 70 70 4f 70 65 6e 54 65 6d 70  ist **ppOpenTemp
a1e0: 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70 70 4f  ){.  if( !p->ppO
a1f0: 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 2a  penTemp ){.    *
a200: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c  ppOpenTemp = sql
a210: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
a220: 28 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70  (0, 0);.    p->p
a230: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 70 4f 70  pOpenTemp = ppOp
a240: 65 6e 54 65 6d 70 3b 0a 20 20 7d 65 6c 73 65 7b  enTemp;.  }else{
a250: 0a 20 20 20 20 2a 70 2d 3e 70 70 4f 70 65 6e 54  .    *p->ppOpenT
a260: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  emp = sqlite3IdL
a270: 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70 70  istAppend(*p->pp
a280: 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20  OpenTemp, 0);.  
a290: 7d 0a 20 20 69 66 28 20 21 28 2a 70 2d 3e 70 70  }.  if( !(*p->pp
a2a0: 4f 70 65 6e 54 65 6d 70 29 20 29 7b 0a 20 20 20  OpenTemp) ){.   
a2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a2c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 28 2a 70 2d  OMEM;.  }.  (*p-
a2d0: 3e 70 70 4f 70 65 6e 54 65 6d 70 29 2d 3e 61 5b  >ppOpenTemp)->a[
a2e0: 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29  (*p->ppOpenTemp)
a2f0: 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61  ->nId-1].idx = a
a300: 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ddr;.  return SQ
a310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
a320: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
a330: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
a340: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a350: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
a360: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
a370: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
a380: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
a390: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
a3a0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
a3b0: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
a3c0: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  l);.  }.  if( !p
a3d0: 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 20  Ret ){.    pRet 
a3e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a3f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
a400: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
a410: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
a420: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
a430: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a440: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
a450: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
a460: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
a470: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
a480: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
a490: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
a4a0: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  e queries..**.**
a4b0: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
a4c0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
a4d0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
a4e0: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
a4f0: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
a500: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
a510: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
a520: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
a530: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
a540: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
a550: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
a560: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
a570: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
a580: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
a590: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
a5a0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
a5b0: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
a5c0: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
a5d0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
a5e0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
a5f0: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
a600: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
a610: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
a620: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
a630: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
a640: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
a650: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
a660: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
a670: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
a680: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
a690: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
a6a0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
a6b0: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
a6c0: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
a6d0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
a6e0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
a6f0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
a700: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
a710: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
a720: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
a730: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
a740: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
a750: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
a760: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
a770: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
a780: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
a790: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
a7a0: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
a7b0: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
a7c0: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
a7d0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
a7e0: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
a7f0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
a800: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
a810: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
a820: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
a830: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
a840: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
a850: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
a860: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
a870: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
a880: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
a890: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a8a0: 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  e, .  Select *p,
a8b0: 20 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 0a   .  int eDest, .
a8c0: 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 0a 20 20    int iParm, .  
a8d0: 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
a8e0: 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
a8f0: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
a900: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
a910: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
a920: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f   = SQLITE_OK;  /
a930: 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
a940: 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
a950: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
a960: 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f  rior;     /* Ano
a970: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
a980: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
a990: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
a9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a9b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
a9c0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
a9d0: 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 54 65 6d  IdList *pOpenTem
a9e0: 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  p = 0;..  /* Mak
a9f0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
aa00: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
aa10: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
aa20: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
aa30: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
aa40: 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  t SELECT in the 
aa50: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
aa60: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
aa70: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IMIT..  */.  if(
aa80: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
aa90: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  or==0 ){.    rc 
aaa0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
aab0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
aac0: 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70    }.  pPrior = p
aad0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20  ->pPrior;.  if( 
aae0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
aaf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ab00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
ab10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ab20: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
ab30: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
ab40: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
ab50: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
ab60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    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 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
ab90: 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30  Prior->nLimit>=0
aba0: 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66   || pPrior->nOff
abb0: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
abc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
abd0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
abe0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
abf0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
ac00: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
ac10: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
ac20: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
ac30: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
ac40: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
ac50: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
ac60: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
ac70: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
ac80: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
ac90: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
aca0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
acb0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
acc0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
acd0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
ace0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
acf0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
ad00: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
ad10: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
ad20: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
ad30: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
ad40: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
ad50: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ad60: 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
ad70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ad80: 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
ad90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
ada0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
adb0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
adc0: 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  iParm, p->pEList
add0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 65 44  ->nExpr);.    eD
ade0: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
adf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
ae00: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
ae10: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
ae20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ae30: 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
ae40: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
ae50: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
ae60: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
ae70: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
ae80: 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74    pPrior->nLimit
ae90: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
aea0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f        pPrior->nO
aeb0: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
aec0: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  et;.        pPri
aed0: 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d  or->ppOpenTemp =
aee0: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a   p->ppOpenTemp;.
aef0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
af00: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
af10: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
af20: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
af30: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
af40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
af50: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
af60: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
af70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
af80: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
af90: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
afa0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
afb0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
afc0: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
afd0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  fset;.        p-
afe0: 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >nLimit = -1;.  
aff0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b000: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
b010: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b020: 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
b030: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
b040: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
b050: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
b060: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
b070: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
b080: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b090: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
b0a0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
b0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
b0c0: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
b0d0: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
b0e0: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
b0f0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
b100: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b110: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
b120: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
b130: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
b140: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
b150: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
b160: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
b170: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
b180: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20      int op = 0; 
b190: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
b1a0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
b1b0: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
b1c0: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
b1d0: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
b1e0: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
b1f0: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
b200: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
b210: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
b220: 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53  t, nOffset; /* S
b230: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
b240: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
b250: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
b260: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
b270: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
b280: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
b290: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
b2a0: 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  T */.      int a
b2b0: 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f  ddr;..      prio
b2c0: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
b2d0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
b2e0: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
b2f0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
b300: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
b310: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c  erBy==0 && p->nL
b320: 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66  imit<0 && p->nOf
b330: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
b340: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
b350: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
b360: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
b370: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
b380: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
b390: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
b3a0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
b3b0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
b3c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
b3d0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
b3e0: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
b3f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b400: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
b410: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
b420: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
b430: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b440: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
b450: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
b460: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
b470: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
b480: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
b490: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
b4a0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
b4b0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
b4c0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
b4d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
b4e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b4f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b500: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
b510: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b520: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
b530: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
b540: 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  f( p->op!=TK_ALL
b550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
b560: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
b570: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
b580: 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29 3b  dr, &pOpenTemp);
b590: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
b5a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
b5c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b5d0: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  d;.          }. 
b5e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b5f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b600: 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e  KeyAsData, union
b610: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
b620: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
b630: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
b640: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b650: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
b660: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
b670: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
b680: 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  /.      pPrior->
b690: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e  ppOpenTemp = p->
b6a0: 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20 20  ppOpenTemp;.    
b6b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
b6c0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
b6d0: 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  ior, priorOp, un
b6e0: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
b6f0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
b700: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
b710: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
b720: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
b730: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
b740: 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  K_ALL ){.       
b750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b760: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
b770: 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c  lumns, unionTab,
b780: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d   pPrior->pEList-
b790: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
b7a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
b7b0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
b7c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
b7d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
b7e0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
b7f0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
b800: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
b810: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
b820: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
b830: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
b840: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
b850: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
b860: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
b870: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
b880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b890: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
b8a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64   = 0;.      pOrd
b8b0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
b8c0: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  By;.      p->pOr
b8d0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
b8e0: 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69   nLimit = p->nLi
b8f0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  mit;.      p->nL
b900: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
b910: 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f   nOffset = p->nO
b920: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
b930: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
b940: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b950: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
b960: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30   op, unionTab, 0
b970: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
b980: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
b990: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
b9a0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
b9b0: 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  erBy;.      p->n
b9c0: 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a  Limit = nLimit;.
b9d0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b9e0: 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20   = nOffset;.    
b9f0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ba00: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
ba10: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
ba20: 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
ba30: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
ba40: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
ba50: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
ba60: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
ba70: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
ba80: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
ba90: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
baa0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
bab0: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
bac0: 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20  Tab!=iParm ){.  
bad0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
bae0: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
baf0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bb00: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
bb10: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
bb20: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
bb30: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
bb40: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
bb50: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  Parse, 0, p->pEL
bb60: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
bb70: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
bb80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
bb90: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
bba0: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
bbb0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
bbc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bbd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bbe0: 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
bbf0: 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
bc00: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
bc10: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
bc20: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69  e, p);.        i
bc30: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
bc40: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
bc50: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
bc60: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
bc70: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
bc80: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
bc90: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
bca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bcc0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
bcd0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
bd00: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
bd10: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
bd20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bd30: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
bd40: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bd50: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
bd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
bd80: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
bd90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bda0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  p(v, OP_Next, un
bdb0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
bdc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bdd0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
bde0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
bdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
be00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
be10: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
be20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
be30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
be40: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
be50: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
be60: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
be70: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
be80: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
be90: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f    int nLimit, nO
bea0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
beb0: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a   addr;..      /*
bec0: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
bed0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
bee0: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
bef0: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
bf00: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
bf10: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
bf20: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
bf30: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
bf40: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
bf50: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
bf60: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
bf70: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
bf80: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
bf90: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
bfa0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
bfb0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
bfc0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
bfd0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
bfe0: 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42  rse,p,p->pOrderB
bff0: 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20  y,tab1,1) ){.   
c000: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
c010: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c020: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c030: 20 20 7d 0a 0a 20 20 20 20 20 20 61 64 64 72 20    }..      addr 
c040: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c050: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
c060: 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  p, tab1, 0);.   
c070: 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
c080: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
c090: 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54  p, addr, &pOpenT
c0a0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  emp);.      if( 
c0b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c0c0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c0d0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c0f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c100: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
c110: 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab1, 1);.      
c120: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c130: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
c140: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
c150: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
c160: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c170: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
c180: 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  /.      pPrior->
c190: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e  ppOpenTemp = p->
c1a0: 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20 20  ppOpenTemp;.    
c1b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c1c0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
c1d0: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
c1e0: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab1, 0, 0, 0, a
c1f0: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
c200: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
c210: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c220: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
c230: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
c240: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
c250: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
c260: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
c270: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
c280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c290: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
c2a0: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
c2b0: 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
c2c0: 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c  tOpenTempAddr(p,
c2d0: 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d   addr, &pOpenTem
c2e0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
c2f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c300: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c310: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c320: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c330: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c340: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
c350: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  b2, 1);.      p-
c360: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
c370: 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e     nLimit = p->n
c380: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
c390: 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  nLimit = -1;.   
c3a0: 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e     nOffset = p->
c3b0: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  nOffset;.      p
c3c0: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
c3d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c3e0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c3f0: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
c400: 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
c410: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
c420: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
c430: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e     p->nLimit = n
c440: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
c450: 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65  nOffset = nOffse
c460: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
c470: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c480: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c490: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c4a0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
c4b0: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
c4c0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
c4d0: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
c4e0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
c4f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c500: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c510: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
c520: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
c530: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
c540: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
c550: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
c560: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
c570: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
c580: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c590: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
c5a0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
c5b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
c5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
c5e0: 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
c5f0: 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  k);.      comput
c600: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
c610: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
c620: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
c630: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c640: 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c  P_FullKey, tab1,
c650: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c660: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c670: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
c680: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
c690: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
c6a0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
c6b0: 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
c6c0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c6d0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
c700: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
c730: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
c740: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
c750: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
c760: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c770: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
c790: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
c7a0: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
c7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c7c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
c7d0: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
c7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c7f0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
c800: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
c810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c820: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
c830: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
c840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c850: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
c860: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
c870: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c880: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c890: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
c8a0: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
c8b0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
c8c0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
c8d0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
c8e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c8f0: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
c900: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
c910: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
c920: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
c930: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
c940: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
c950: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
c960: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
c970: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c980: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c990: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4f    }..  if( p->pO
c9a0: 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65 6e  rderBy || (pOpen
c9b0: 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65 6d  Temp && pOpenTem
c9c0: 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20 20  p->nId>0) ){.   
c9d0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
c9e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
c9f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4b 65 79    int i;.    Key
ca00: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
ca10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
ca20: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
ca30: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  nCol*sizeof(Coll
ca40: 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  Seq*));.    if( 
ca50: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
ca60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
ca70: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
ca80: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ca90: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
caa0: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50  eyInfo->enc = pP
cab0: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
cac0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
cad0: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
cae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
caf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4b  ; i++){.      pK
cb00: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
cb10: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
cb20: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
cb30: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   i);.      if( !
cb40: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
cb50: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i] ){.        pK
cb60: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
cb70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
cb80: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
cb90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
cba0: 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70 20  (i=0; pOpenTemp 
cbb0: 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e  && i<pOpenTemp->
cbc0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nId; i++){.     
cbd0: 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28 69   int p3type = (i
cbe0: 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ==0?P3_KEYINFO_H
cbf0: 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e 46  ANDOFF:P3_KEYINF
cc00: 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  O);.      int ad
cc10: 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d 3e  dr = pOpenTemp->
cc20: 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20  a[i].idx;.      
cc30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cc40: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
cc50: 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70  ar *)pKeyInfo, p
cc60: 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  3type);.    }.. 
cc70: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
cc80: 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
cc90: 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65 72  i=0; i<p->pOrder
cca0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
ccb0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
ccc0: 45 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65 72  Expr = p->pOrder
ccd0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
cce0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
ccf0: 61 6d 65 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  ame = p->pOrderB
cd00: 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  y->a[i].zName;. 
cd10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cd20: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
cd30: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43  UMN && pExpr->iC
cd40: 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20  olumn<nCol );.  
cd50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cd60: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
cd70: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
cd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
cd90: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
cda0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
cdb0: 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  q(pParse, zName,
cdc0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   -1);.        }e
cdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
cde0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b  Expr->pColl = pK
cdf0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45  eyInfo->aColl[pE
ce00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20  xpr->iColumn];. 
ce10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ce20: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
ce30: 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
ce40: 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
ce50: 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
ce60: 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Parm);.    }..  
ce70: 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d 70    if( !pOpenTemp
ce80: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
ce90: 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55 4e  s happens for UN
cea0: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
ceb0: 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73 71  R BY */.      sq
cec0: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66  liteFree(pKeyInf
ced0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d  o);.    }.  }..m
cee0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
cef0: 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d 70  .  if( pOpenTemp
cf00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
cf10: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65  dListDelete(pOpe
cf20: 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70 2d  nTemp);.  }.  p-
cf30: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b  >ppOpenTemp = 0;
cf40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cf50: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
cf60: 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
cf70: 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
cf80: 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
cf90: 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
cfa0: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
cfb0: 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
cfc0: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
cfd0: 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
cfe0: 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
cff0: 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
d000: 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
d010: 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
d020: 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
d030: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
d040: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
d050: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
d060: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
d070: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
d080: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
d090: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
d0a0: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
d0b0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
d0c0: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
d0d0: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
d0e0: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
d0f0: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
d100: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
d110: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
d120: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
d130: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
d140: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
d150: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
d160: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
d170: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
d180: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
d190: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
d1a0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
d1b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
d1c0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
d1d0: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
d1e0: 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
d1f0: 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
d200: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
d210: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
d220: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
d230: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
d240: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
d250: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
d260: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
d270: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
d280: 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
d290: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
d2a0: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
d2b0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
d2c0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
d2d0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
d2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d2f0: 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
d300: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
d310: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
d320: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
d330: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
d340: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
d350: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
d360: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
d370: 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
d380: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
d390: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d3a0: 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
d3b0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
d3c0: 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
d3d0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
d3e0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
d3f0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
d400: 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
d410: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
d420: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
d430: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
d440: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
d450: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
d460: 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a  (pNew->pRight);.
d470: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d480: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
d490: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
d4a0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
d4b0: 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70  rListDup(pNew->p
d4c0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
d4d0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
d4e0: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
d4f0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
d500: 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
d510: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
d520: 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
d530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
d540: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
d550: 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
d560: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
d570: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45  te3TokenCopy(&pE
d580: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
d590: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->span);.    }. 
d5a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
d5b0: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  tExpr(pExpr->pLe
d5c0: 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
d5d0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
d5e0: 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  pr(pExpr->pRight
d5f0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
d600: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
d610: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
d620: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
d630: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
d640: 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72   void .substExpr
d650: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
d660: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
d670: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
d680: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
d690: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
d6a0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
d6b0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
d6c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
d6d0: 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
d6e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
d6f0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
d700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d710: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
d720: 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
d730: 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
d740: 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
d750: 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
d760: 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
d770: 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
d780: 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
d790: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
d7a0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
d7b0: 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
d7c0: 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
d7d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
d7e0: 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
d7f0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
d800: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
d810: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
d820: 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
d830: 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
d840: 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
d850: 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
d860: 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
d870: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
d880: 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
d890: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
d8a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
d8b0: 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
d8c0: 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
d8d0: 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
d8e0: 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
d8f0: 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
d900: 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
d910: 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
d920: 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
d930: 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
d940: 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
d950: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
d960: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
d970: 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
d980: 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
d990: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
d9a0: 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
d9b0: 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
d9c0: 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
d9d0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
d9e0: 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
d9f0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
da00: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
da10: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
da20: 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
da30: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
da40: 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
da50: 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
da60: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
da70: 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
da80: 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
da90: 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
daa0: 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
dab0: 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
dac0: 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
dad0: 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
dae0: 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
daf0: 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
db00: 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
db10: 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
db20: 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
db30: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
db40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
db50: 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
db60: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
db70: 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
db80: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
db90: 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
dba0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
dbb0: 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
dbc0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
dbd0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
dbe0: 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
dbf0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
dc00: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
dc10: 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
dc20: 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  join, or.**     
dc30: 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20     the subquery 
dc40: 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
dc50: 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23  join.  (Ticket #
dc60: 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  306).**.**   (4)
dc70: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
dc80: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
dc90: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
dca0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
dcb0: 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
dcc0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
dcd0: 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
dce0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
dcf0: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
dd00: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
dd10: 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
dd20: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
dd30: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
dd40: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
dd50: 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
dd60: 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
dd70: 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
dd80: 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
dd90: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
dda0: 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
ddb0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
ddc0: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
ddd0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
dde0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
ddf0: 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
de00: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
de10: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
de20: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
de30: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
de40: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
de50: 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
de60: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
de70: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
de80: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
de90: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
dea0: 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
deb0: 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
dec0: 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
ded0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
dee0: 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
def0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
df00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
df10: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
df20: 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74   not the right t
df30: 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  erm of a LEFT OU
df40: 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a  TER JOIN or the.
df50: 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
df60: 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
df70: 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20  clause.  (added 
df80: 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a  by ticket #350).
df90: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
dfa0: 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
dfb0: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
dfc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
dfd0: 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
dfe0: 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
dff0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
e000: 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
e010: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
e020: 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
e030: 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
e040: 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
e050: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
e060: 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
e070: 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
e080: 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
e090: 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
e0a0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
e0b0: 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
e0c0: 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
e0d0: 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
e0e0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
e0f0: 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
e100: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
e110: 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
e120: 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
e130: 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
e140: 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
e150: 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
e160: 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
e170: 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
e180: 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
e190: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
e1a0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
e1b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
e1c0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
e1d0: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
e1e0: 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
e1f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
e200: 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
e210: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
e220: 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
e230: 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
e240: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
e250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
e260: 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
e270: 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
e280: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
e290: 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
e2a0: 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
e2b0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
e2c0: 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
e2d0: 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53  ctions */.){.  S
e2e0: 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
e2f0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
e300: 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
e310: 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ry" */.  SrcList
e320: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
e330: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
e340: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
e350: 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
e360: 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
e370: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
e380: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
e390: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e3a0: 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
e3b0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e3c0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
e3d0: 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
e3e0: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
e3f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
e400: 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
e410: 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
e420: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
e430: 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20   *pWhere;..  /* 
e440: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e450: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
e460: 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
e470: 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
e480: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
e490: 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
e4a0: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
e4b0: 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
e4c0: 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
e4d0: 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
e4e0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  b = pSrc->a[iFro
e4f0: 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m].pSelect;.  as
e500: 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
e510: 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
e520: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
e530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
e540: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
e550: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
e560: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62  return 0;.  pSub
e570: 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
e580: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
e590: 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75  Src );.  if( pSu
e5a0: 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
e5b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
e5c0: 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
e5d0: 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  t || pSub->nLimi
e5e0: 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d  t>=0) &&  (pSrc-
e5f0: 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
e600: 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
e610: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
e620: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
e630: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  p->nLimit>=0) &&
e640: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
e650: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e660: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
e670: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
e680: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
e690: 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
e6a0: 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
e6b0: 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
e6c0: 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
e6d0: 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
e6e0: 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
e6f0: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
e700: 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
e710: 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
e720: 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
e730: 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
e740: 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
e750: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
e760: 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
e770: 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
e780: 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
e790: 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
e7a0: 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
e7b0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
e7c0: 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
e7d0: 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
e7e0: 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
e7f0: 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
e800: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
e810: 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
e820: 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
e830: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
e840: 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
e850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e860: 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
e870: 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
e880: 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
e890: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
e8a0: 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
e8b0: 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
e8c0: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
e8d0: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
e8e0: 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
e8f0: 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
e900: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
e910: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
e920: 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
e930: 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
e940: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
e950: 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
e960: 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
e970: 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
e980: 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
e990: 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
e9a0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
e9b0: 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
e9c0: 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
e9d0: 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
e9e0: 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
e9f0: 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
ea00: 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
ea10: 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
ea20: 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
ea30: 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
ea40: 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
ea50: 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
ea60: 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
ea70: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
ea80: 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
ea90: 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
eaa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
eab0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
eac0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
ead0: 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
eae0: 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
eaf0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
eb00: 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
eb10: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
eb20: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
eb30: 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
eb40: 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
eb50: 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
eb60: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
eb70: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
eb80: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
eb90: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
eba0: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
ebb0: 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
ebc0: 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
ebd0: 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
ebe0: 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
ebf0: 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
ec00: 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
ec10: 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
ec20: 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
ec30: 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
ec40: 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
ec50: 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
ec60: 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
ec70: 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
ec80: 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
ec90: 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
eca0: 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
ecb0: 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
ecc0: 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
ecd0: 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
ece0: 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
ecf0: 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
ed00: 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72  .  iParent = pSr
ed10: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72  c->a[iFrom].iCur
ed20: 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  sor;.  {.    int
ed30: 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
ed40: 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
ed50: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72  t jointype = pSr
ed60: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
ed70: 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70  type;..    if( p
ed80: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
ed90: 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46  ab && pSrc->a[iF
eda0: 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61  rom].pTab->isTra
edb0: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
edc0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
edd0: 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46  le(0, pSrc->a[iF
ede0: 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  rom].pTab);.    
edf0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
ee00: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
ee10: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
ee20: 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d  sqliteFree(pSrc-
ee30: 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29  >a[iFrom].zName)
ee40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ee50: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
ee60: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
ee70: 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
ee80: 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
ee90: 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
eea0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
eeb0: 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
eec0: 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
eed0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
eee0: 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  (pSrc, 0, 0);.  
eef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
ef00: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
ef10: 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
ef20: 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
ef30: 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
ef40: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
ef50: 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
ef60: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
ef70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ef80: 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
ef90: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
efa0: 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
efb0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
efc0: 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
efd0: 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
efe0: 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
eff0: 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
f000: 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31  [iFrom+nSubSrc-1
f010: 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
f020: 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
f030: 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
f040: 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
f050: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
f060: 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
f070: 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
f080: 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
f090: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
f0a0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
f0b0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f0c0: 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
f0d0: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
f0e0: 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
f0f0: 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
f100: 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
f130: 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
f140: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
f150: 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
f160: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f170: 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
f180: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f190: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
f1a0: 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
f1b0: 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
f1c0: 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
f1d0: 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
f1e0: 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
f1f0: 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
f200: 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
f210: 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
f220: 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
f230: 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
f240: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
f250: 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
f260: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
f270: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e  );.  pList = p->
f280: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
f290: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
f2a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
f2b0: 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66  r *pExpr;.    if
f2c0: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
f2d0: 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72  ame==0 && (pExpr
f2e0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
f2f0: 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30  Expr)->span.z!=0
f300: 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
f310: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
f320: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70  liteStrNDup(pExp
f330: 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
f340: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
f350: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
f360: 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
f370: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
f380: 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
f390: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
f3a0: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
f3b0: 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
f3c0: 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
f3d0: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72  .  if( pSub->pOr
f3e0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73  derBy ){.    ass
f3f0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
f400: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  ==0 );.    p->pO
f410: 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
f420: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75  OrderBy;.    pSu
f430: 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
f440: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
f450: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f460: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
f470: 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
f480: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
f490: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
f4a0: 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
f4b0: 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
f4c0: 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  3ExprDup(pSub->p
f4d0: 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
f4e0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
f4f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
f500: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
f510: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
f520: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
f530: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
f540: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
f550: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
f560: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
f570: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
f580: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
f590: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 48 61     if( pSub->pHa
f5a0: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 45 78  ving ){.      Ex
f5b0: 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 73 71  pr *pHaving = sq
f5c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
f5d0: 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  b->pHaving);.   
f5e0: 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
f5f0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
f600: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
f610: 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  3Expr(TK_AND, p-
f620: 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76 69 6e  >pHaving, pHavin
f630: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g, 0);.      }el
f640: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  se{.        p->p
f650: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
f660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f670: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f680: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
f690: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
f6a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
f6b0: 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  up(pSub->pGroupB
f6c0: 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  y);.  }else if( 
f6d0: 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a  p->pWhere==0 ){.
f6e0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
f6f0: 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b  pWhere;.  }else{
f700: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f710: 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
f720: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
f730: 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65  ;.    if( pWhere
f740: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68   ){.      p->pWh
f750: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
f760: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
f770: 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ere, pWhere, 0);
f780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f790: 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
f7a0: 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
f7b0: 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
f7c0: 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
f7d0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
f7e0: 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
f7f0: 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
f800: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
f810: 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
f820: 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  nct;..  /* Trans
f830: 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20 65 78  fer the limit ex
f840: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
f850: 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 74 68  e subquery to th
f860: 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
f870: 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ry..  */.  if( p
f880: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29  Sub->nLimit>=0 )
f890: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69  {.    if( p->nLi
f8a0: 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  mit<0 ){.      p
f8b0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
f8c0: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c  >nLimit;.    }el
f8d0: 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  se if( p->nLimit
f8e0: 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53  +p->nOffset > pS
f8f0: 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d  ub->nLimit+pSub-
f900: 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >nOffset ){.    
f910: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53    p->nLimit = pS
f920: 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75  ub->nLimit + pSu
f930: 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e  b->nOffset - p->
f940: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20  nOffset;.    }. 
f950: 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20   }.  p->nOffset 
f960: 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  += pSub->nOffset
f970: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  ;..  /* Finially
f980: 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
f990: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
f9a0: 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
f9b0: 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
f9c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
f9d0: 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b  ectDelete(pSub);
f9e0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
f9f0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
fa00: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
fa10: 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  nt passed in as 
fa20: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
fa30: 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
fa40: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
fa50: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49   max() query.  I
fa60: 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73  f it is and this
fa70: 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a   query can be.**
fa80: 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
fa90: 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74   a single seek t
faa0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
fab0: 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64  or end of an ind
fac0: 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65  ex,.** then gene
fad0: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f  rate the code fo
fae0: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e  r this SELECT an
faf0: 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  d return 1.  If 
fb00: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a  this is not a .*
fb10: 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  * simple min() o
fb20: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74  r max() query, t
fb30: 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a  hen return 0;.**
fb40: 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e  .** A simply min
fb50: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
fb60: 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  y looks like thi
fb70: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
fb80: 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74  CT min(a) FROM t
fb90: 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45  able;.**    SELE
fba0: 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74  CT max(a) FROM t
fbb0: 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able;.**.** The 
fbc0: 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f  query may have o
fbd0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
fbe0: 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61  le in its FROM a
fbf0: 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a  rgument.  There.
fc00: 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f  ** can be no GRO
fc10: 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20  UP BY or HAVING 
fc20: 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
fc30: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  .  The result se
fc40: 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65  t must.** be the
fc50: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
fc60: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  of a single colu
fc70: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  mn of the table.
fc80: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20    The column.** 
fc90: 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  in the min() or 
fca0: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  max() function m
fcb0: 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a  ust be indexed..
fcc0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  **.** The parame
fcd0: 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75  ters to this rou
fce0: 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d  tine are the sam
fcf0: 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33  e as for sqlite3
fd00: 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65  Select()..** See
fd10: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
fd20: 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74  ent on that rout
fd30: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
fd40: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
fd50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69  */.static int si
fd60: 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
fd70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fd80: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44  elect *p, int eD
fd90: 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b  est, int iParm){
fda0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
fdb0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61    int iCol;.  Ta
fdc0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
fdd0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
fde0: 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  base;.  Vdbe *v;
fdf0: 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20  .  int seekOp;. 
fe00: 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70   int cont;.  Exp
fe10: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a  rList *pEList, *
fe20: 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20  pList, eList;.  
fe30: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
fe40: 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a  item eListItem;.
fe50: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
fe60: 0a 20 20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .  ..  /* Check 
fe70: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71  to see if this q
fe80: 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
fe90: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
fea0: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20  query.  Return. 
feb0: 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69   ** zero if it i
fec0: 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  s  not..  */.  i
fed0: 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c  f( p->pGroupBy |
fee0: 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20  | p->pHaving || 
fef0: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
ff00: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
ff10: 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53  ->pSrc;.  if( pS
ff20: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
ff30: 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
ff40: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
ff50: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
ff60: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
ff70: 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
ff80: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
ff90: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
ffa0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
ffb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c  ) return 0;.  pL
ffc0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
ffd0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  st;.  if( pList=
ffe0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78  =0 || pList->nEx
fff0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
10000 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
10010 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
10020 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
10030 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
10040 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
10050 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
10060 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
10070 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
10080 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45  lite3StrNICmp(pE
10090 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
100a0 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
100b0 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
100c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
100d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
100e0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
100f0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
10100 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
10110 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
10120 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  .  iCol = pExpr-
10130 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62  >iColumn;.  pTab
10140 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
10150 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ab;..  /* If we 
10160 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
10170 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
10180 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
10190 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
101a0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
101b0 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
101c0 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
101d0 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
101e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
101f0 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
10200 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
10210 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
10220 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
10230 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
10240 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
10250 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
10260 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
10270 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
10280 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
10290 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
102a0 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
102b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
102c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
102d0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
102e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
102f0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
10300 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
10310 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
10320 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
10330 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
10340 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
10350 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10360 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78  0]==iCol && pIdx
10370 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
10380 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61  0]==pColl ) brea
10390 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
103a0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
103b0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
103c0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
103d0 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
103e0 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
103f0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
10400 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
10410 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
10420 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
10430 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
10440 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
10450 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
10460 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
10470 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
10480 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
10490 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
104a0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
104b0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
104c0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
104d0 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
104e0 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
104f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10500 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
10510 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
10520 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
10530 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
10540 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10550 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
10560 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10570 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10580 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
10590 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
105a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
105b0 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
105c0 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
105d0 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
105e0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
105f0 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
10600 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
10610 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
10620 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
10630 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
10640 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
10650 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
10660 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
10670 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
10680 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
10690 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
106a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
106b0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
106c0 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44  pParse, pTab->iD
106d0 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  b);.  base = pSr
106e0 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
106f0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
10700 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
10710 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d   p);.  if( pSrc-
10720 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
10730 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10740 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10750 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44  nteger, pTab->iD
10760 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
10770 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10780 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65  P_OpenRead, base
10790 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
107a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
107b0 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
107c0 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20 70  Columns, base, p
107d0 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  Tab->nCol);.  }.
107e0 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33    cont = sqlite3
107f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10800 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
10810 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10820 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
10830 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
10840 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10850 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10860 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e  _Integer, pIdx->
10870 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
10880 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10890 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65  P_OpenRead, base
108a0 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a  +1, pIdx->tnum,.
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d     (char*)&pIdx-
108d0 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
108e0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
108f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
10900 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30  eekOp, base+1, 0
10910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10920 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
10930 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20  xRecno, base+1, 
10940 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
10950 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10960 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29  lose, base+1, 0)
10970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10980 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
10990 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
109a0 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
109b0 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
109c0 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
109d0 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
109e0 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
109f0 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
10a00 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
10a10 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
10a20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
10a30 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
10a40 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
10a50 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
10a60 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
10a70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10a80 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
10a90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10aa0 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
10ab0 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
10ac0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  1;.}../*.** Gene
10ad0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
10ae0 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
10af0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
10b00 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
10b10 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
10b20 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
10b30 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
10b40 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
10b50 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
10b60 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
10b70 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
10b80 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
10b90 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10bc0 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
10bd0 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
10be0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
10bf0 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
10c00 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
10c10 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
10c20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
10c30 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
10c40 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
10c50 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
10c60 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
10c70 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c   as keys of tabl
10c80 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
10c90 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
10ca0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
10cb0 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
10cc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
10cd0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
10ce0 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
10cf0 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
10d00 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
10d10 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
10d20 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
10d30 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
10d40 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
10d50 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
10d60 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
10d70 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
10d80 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
10d90 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
10da0 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
10db0 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
10dc0 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
10dd0 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
10de0 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
10df0 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
10e00 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
10e10 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
10e20 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
10e30 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
10e40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10e50 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
10e60 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
10e70 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
10e80 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
10e90 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
10ea0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
10eb0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
10ec0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
10ed0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
10ee0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
10ef0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
10f00 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
10f10 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
10f20 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
10f30 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
10f40 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
10f50 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
10f60 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
10f70 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
10f80 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
10f90 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
10fa0 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
10fb0 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
10fc0 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
10fd0 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
10fe0 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
10ff0 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
11000 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
11010 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
11020 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
11030 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
11040 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
11050 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
11060 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
11070 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
11080 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
11090 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
110a0 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
110b0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
110c0 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
110d0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
110e0 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
110f0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
11100 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
11110 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
11120 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
11130 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
11160 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
11170 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
111c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
111d0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
111e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
111f0 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
11200 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11210 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
11220 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
11230 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
11240 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
11250 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
11260 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
11270 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11280 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
11290 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
112a0 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
112b0 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
112c0 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
112d0 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
112e0 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
112f0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
11300 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
11310 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
11320 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
11330 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
11340 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
11350 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
11360 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
11370 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
11380 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
11390 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
113a0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
113b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
113c0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
113d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
113e0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
113f0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
11400 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
11410 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
11420 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
11430 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
11440 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
11450 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
11460 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
11470 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72    /* A parameter
11480 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65   used by the eDe
11490 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  st disposal meth
114a0 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  od */.  Select *
114b0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
114c0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
114d0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
114e0 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
114f0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
11500 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
11510 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
11520 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
11530 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
11540 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f  rentAgg,       /
11550 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
11560 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
11570 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
11580 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
11590 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
115a0 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
115b0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
115c0 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
115d0 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
115e0 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
115f0 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20  *v;.  int isAgg 
11600 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
11610 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
11620 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
11630 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
11640 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
11650 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
11660 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
11670 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
11680 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
11690 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
116a0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
116b0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
116d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
116e0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
116f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
11700 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
11710 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
11720 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
11730 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
11740 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
11750 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
11760 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
11770 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
11780 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
11790 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
117a0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
117b0 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
117c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
117d0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
117e0 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
117f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
11800 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
11810 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
11820 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
11830 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
11840 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
11850 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
11860 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
11870 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  nction */..  if(
11880 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
11890 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  failed || pParse
118a0 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29  ->nErr || p==0 )
118b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
118c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
118d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
118e0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
118f0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
11900 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
11910 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
11920 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
11930 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
11940 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
11950 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
11960 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
11970 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
11980 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66  eDest, iParm, af
11990 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  f);.  }..  /* Ma
119a0 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
119b0 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
119c0 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
119d0 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
119e0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
119f0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
11a00 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  e;.  pOrderBy = 
11a10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
11a20 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
11a30 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
11a40 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
11a50 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
11a60 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
11a70 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56 44 42 45  /* Allocate VDBE
11a80 20 63 75 72 73 6f 72 73 20 66 6f 72 20 65 61 63   cursors for eac
11a90 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
11aa0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
11ab0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
11ac0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
11ad0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
11ae0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
11af0 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
11b00 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
11b10 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
11b20 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
11b30 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
11b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
11b50 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
11b60 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
11b70 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
11b80 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64 20  d;..  /* Expand 
11b90 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20 69 6e  any "*" terms in
11ba0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
11bb0 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 20 74    (For example t
11bc0 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20 22  he "*" in.  ** "
11bd0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
11be0 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e 43 6f  ")  The fillInCo
11bf0 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74 69  lumnlist() routi
11c00 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f 6d  ne also does som
11c10 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f 75  e.  ** other hou
11c20 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65 65 20  sekeeping - see 
11c30 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
11c40 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  nt for details..
11c50 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49    */.  if( fillI
11c60 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72  nColumnList(pPar
11c70 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f  se, p) ){.    go
11c80 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11c90 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d   }.  pWhere = p-
11ca0 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69 73  >pWhere;.  pELis
11cb0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
11cc0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
11cd0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11ce0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
11cf0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
11d00 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
11d10 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
11d20 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
11d30 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
11d40 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54   if( (eDest==SRT
11d50 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
11d60 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73  RT_Set) && pELis
11d70 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20  t->nExpr>1 ){.  
11d80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11d90 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
11da0 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
11db0 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
11dc0 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
11dd0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
11de0 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
11df0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11e00 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  end;.  }..  /* O
11e10 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
11e20 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
11e30 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
11e40 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
11e50 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  {.    case SRT_U
11e60 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53  nion:.    case S
11e70 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63  RT_Except:.    c
11e80 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a  ase SRT_Discard:
11e90 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
11ea0 74 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  t:.      pOrderB
11eb0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
11ec0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
11ed0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11ee0 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
11ef0 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64  point, we should
11f00 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20   have allocated 
11f10 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20  all the cursors 
11f20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65  that we.  ** nee
11f30 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71  d to handle subq
11f40 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72  uerys and tempor
11f50 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20  ary tables.  .  
11f60 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20  **.  ** Resolve 
11f70 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
11f80 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74   and do a semant
11f90 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c  ics check on all
11fa0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
11fb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
11fc0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
11fd0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
11fe0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11ff0 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
12000 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69  TabList, 0, pELi
12010 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
12020 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
12030 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12040 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12050 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
12060 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
12070 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20  xpr, 1, &isAgg) 
12080 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
12090 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
120a0 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
120b0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
120c0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
120d0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
120e0 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65  st, pEList, pWhe
120f0 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  re) ){.      got
12100 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12110 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
12120 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
12130 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rse, pWhere, 0, 
12140 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
12150 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12160 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
12170 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
12180 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
12190 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
121a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
121b0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
121c0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
121d0 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
121e0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
121f0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
12200 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
12210 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
12220 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
12230 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
12240 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12250 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
12260 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
12270 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76  eck(pParse, pHav
12280 69 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20  ing, 1, &isAgg) 
12290 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
122a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
122b0 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72    }.  if( pOrder
122c0 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
122d0 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
122e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
122f0 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
12300 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
12310 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
12320 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  r;.      if( sql
12330 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12340 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20  r(pE, &iCol) && 
12350 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
12360 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
12370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12380 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
12390 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
123a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
123b0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
123c0 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
123d0 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
123e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
123f0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
12400 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
12410 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
12420 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
12430 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12450 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
12460 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
12470 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
12480 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12490 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
124a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
124b0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
124c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
124d0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
124e0 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d  ger(pE, &iCol)==
124f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
12500 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12510 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12520 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
12530 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
12540 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
12550 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
12560 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12570 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
12580 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
12590 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
125a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
125b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
125c0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
125d0 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
125e0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25   column number %
125f0 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  d out of range -
12600 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
12610 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
12620 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43  en 1 and %d", iC
12630 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
12640 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  r);.          go
12650 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12670 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12680 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
12690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
126a0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
126b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
126c0 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  l;.      Expr *p
126d0 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
126e0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
126f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
12700 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
12710 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
12720 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
12730 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
12740 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
12750 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
12760 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
12770 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
12780 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  e3ExprDup(pEList
12790 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
127a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
127b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
127c0 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
127d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
127e0 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
127f0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
12800 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
12810 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12820 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
12830 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
12840 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
12850 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
12860 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
12870 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
12880 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
12890 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
128a0 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
128b0 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iCol)==0 ){.    
128c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
128d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
128e0 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50            "GROUP
128f0 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
12900 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
12910 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
12920 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
12930 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12940 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
12950 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
12960 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
12970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
12980 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
12990 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f              "GRO
129a0 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d  UP BY column num
129b0 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61  ber %d out of ra
129c0 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
129d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
129e0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
129f0 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  ", iCol, pEList-
12a00 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
12a10 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12a20 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
12a30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12a40 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
12a50 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
12a60 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
12a70 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12a80 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
12a90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
12aa0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
12ab0 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
12ac0 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
12ad0 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
12ae0 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
12af0 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
12b00 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
12b10 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
12b20 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
12b30 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
12b40 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
12b50 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
12b60 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
12b70 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
12b80 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 31 20 20  t);.  }..#if 1  
12b90 2f 2a 20 49 20 64 6f 20 6e 6f 74 20 74 68 69 6e  /* I do not thin
12ba0 6b 20 77 65 20 6e 65 65 64 20 74 68 65 20 66 6f  k we need the fo
12bb0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61 6e 79  llowing code any
12bc0 20 6d 6f 72 65 2e 2e 2e 2e 20 2a 2f 0a 20 20 2f   more.... */.  /
12bd0 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
12be0 74 69 6f 6e 20 69 73 20 53 52 54 5f 55 6e 69 6f  tion is SRT_Unio
12bf0 6e 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  n, then set the 
12c00 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
12c10 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 72 65  s in.  ** the re
12c20 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20  cords that will 
12c30 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
12c40 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
12c50 61 62 6c 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  able. The caller
12c60 0a 20 20 2a 2a 20 63 6f 75 6c 64 6e 27 74 20 64  .  ** couldn't d
12c70 6f 20 74 68 69 73 2c 20 69 6e 20 63 61 73 65 20  o this, in case 
12c80 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
12c90 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
12ca0 6f 72 6d 20 0a 20 20 2a 2a 20 22 53 45 4c 45 43  orm .  ** "SELEC
12cb0 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 2e 22 2e 20  T * FROM ....". 
12cc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6e 65  .  **.  ** We ne
12cd0 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
12ce0 66 6f 72 65 20 77 65 20 73 74 61 72 74 20 69 6e  fore we start in
12cf0 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20  serting records 
12d00 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 74  into the .  ** t
12d10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
12d20 77 68 69 63 68 20 68 61 73 20 68 61 64 20 4f 50  which has had OP
12d30 5f 4b 65 79 41 73 44 61 74 61 20 65 78 65 63 75  _KeyAsData execu
12d40 74 65 64 20 6f 6e 20 69 74 29 2c 20 62 65 63 61  ted on it), beca
12d50 75 73 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 72  use.  ** it is r
12d60 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 6b  equired by the k
12d70 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey comparison fu
12d80 6e 63 74 69 6f 6e 2e 20 53 6f 20 64 6f 20 69 74  nction. So do it
12d90 20 6e 6f 77 2c 20 65 76 65 6e 0a 20 20 2a 2a 20   now, even.  ** 
12da0 74 68 6f 75 67 68 20 74 68 69 73 20 6d 65 61 6e  though this mean
12db0 73 20 74 68 61 74 20 4f 50 5f 53 65 74 4e 75 6d  s that OP_SetNum
12dc0 43 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 65  Columns may be e
12dd0 78 65 63 75 74 65 64 20 6f 6e 20 74 68 65 20 73  xecuted on the s
12de0 61 6d 65 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  ame.  ** cursor 
12df0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a  more than once..
12e00 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
12e10 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a 20  ==SRT_Union ){. 
12e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e30 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
12e40 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
12e50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
12e60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
12e70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
12e80 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
12e90 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
12ea0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  lause.  */.  for
12eb0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
12ec0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
12ed0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
12ee0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
12ef0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
12f00 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
12f10 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ..    if( pTabLi
12f20 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
12f30 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12f40 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
12f50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20  ->a[i].zName!=0 
12f60 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41  ){.      zSavedA
12f70 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
12f80 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
12f90 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
12fa0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
12fb0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
12fc0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
12fd0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
12fe0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
12ff0 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
13000 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
13010 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
13020 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
13030 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
13040 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
13050 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
13060 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
13070 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c  a[i].iCursor, p,
13080 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
13090 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
130a0 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
130b0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
130c0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
130d0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
130e0 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
130f0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
13100 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
13110 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
13120 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20  t!=SRT_Union && 
13130 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70  eDest!=SRT_Excep
13140 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  t && eDest!=SRT_
13150 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20  Discard ){.     
13160 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
13170 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
13180 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
13190 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
131a0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
131b0 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
131c0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
131d0 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nct;.  }..  /* C
131e0 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65  heck for the spe
131f0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d  cial case of a m
13200 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
13210 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66  nction by itself
13220 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  .  ** in the res
13230 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ult set..  */.  
13240 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  if( simpleMinMax
13250 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
13260 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29   eDest, iParm) )
13270 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
13280 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13290 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  d;.  }..  /* Che
132a0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
132b0 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
132c0 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61  that can be "fla
132d0 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73  ttened" into its
132e0 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66   parent..  ** If
132f0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
13300 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20   possiblity, do 
13310 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  so and return im
13320 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a  mediately.  .  *
13330 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
13340 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
13350 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
13360 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
13370 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
13380 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
13390 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
133a0 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
133b0 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72  ntAgg = 1;.    r
133c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
133d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
133e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
133f0 73 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20  se, resolve any 
13400 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
13410 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74  ces.  ** names t
13420 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 65 78  hat have been ex
13430 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
13440 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
13450 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66  OrderBy ){.    f
13460 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
13470 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
13480 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
13490 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  rBy->a[i].zName 
134a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
134b0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  rBy->a[i].pExpr-
134c0 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20 20 20 20 20  >pColl = .      
134d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
134e0 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
134f0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
13500 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  ].zName, -1);.  
13510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13520 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13530 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
13540 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
13560 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
13570 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
13580 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
13590 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   p);..  /* If th
135a0 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
135b0 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
135c0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
135d0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
135e0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
135f0 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
13600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13610 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
13620 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
13630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13640 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
13650 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
13660 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
13670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e  .  }..  /* Do an
13680 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67   analysis of agg
13690 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f  regate expressio
136a0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ns..  */.  sqlit
136b0 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65  eAggregateInfoRe
136c0 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69  set(pParse);.  i
136d0 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f  f( isAgg || pGro
136e0 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65  upBy ){.    asse
136f0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  rt( pParse->nAgg
13700 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67  ==0 );.    isAgg
13710 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 1;.    for(i=
13720 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
13730 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
13740 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
13750 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
13760 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
13770 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
13780 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
13790 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
137a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
137b0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
137c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
137d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
137e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
137f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
13800 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
13810 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
13820 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
13830 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
13840 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
13850 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13860 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
13870 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  && sqlite3ExprAn
13880 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
13890 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29  pParse, pHaving)
138a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
138b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
138c0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
138d0 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
138e0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
138f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13900 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13910 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
13920 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f  gates(pParse, pO
13930 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13940 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
13950 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13980 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67   /* Reset the ag
13990 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20  gregator.  */.  
139a0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
139b0 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
139c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
139d0 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
139e0 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
139f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
13a00 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
13a10 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
13a20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66  *pFunc;.      if
13a30 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73  ( (pFunc = pPars
13a40 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63  e->aAgg[i].pFunc
13a50 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78  )!=0 && pFunc->x
13a60 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
13a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13a80 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 49  beOp3(v, OP_AggI
13a90 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61 72  nit, 0, i, (char
13aa0 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  *)pFunc, P3_FUNC
13ab0 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DEF);.      }.  
13ac0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
13ad0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
13ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13af0 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
13b00 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
13b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13b20 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
13b30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
13b40 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
13b50 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
13b60 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  + pGroupBy->nExp
13b70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  r*sizeof(CollSeq
13b80 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  *);.      KeyInf
13b90 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e  o *pKey = (KeyIn
13ba0 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo *)sqliteMallo
13bb0 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  c(sz);.      if(
13bc0 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20   0==pKey ){.    
13bd0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13be0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
13bf0 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70     pKey->enc = p
13c00 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
13c10 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65        pKey->nFie
13c20 6c 64 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  ld = pGroupBy->n
13c30 45 78 70 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Expr;.      for(
13c40 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
13c50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13c60 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
13c70 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[i] = sqlite3Ex
13c80 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13c90 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
13ca0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
13cb0 20 69 66 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c   if( !pKey->aCol
13cc0 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
13cd0 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
13ce0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
13cf0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
13d00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13d20 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
13d30 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f  char *)pKey, P3_
13d40 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
13d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13d60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
13d70 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
13d80 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
13d90 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
13da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13db0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
13dc0 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
13dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13de0 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
13df0 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d  , iParm, 1);.  }
13e00 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65  ..  /* Open a te
13e10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
13e20 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
13e30 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
13e40 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
13e50 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   ){.    distinct
13e60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13e70 2b 3b 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49  +;.    openTempI
13e80 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
13e90 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  distinct, 0);.  
13ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
13eb0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
13ec0 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
13ed0 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f  tabase scan.  */
13ee0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
13ef0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
13f00 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
13f10 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20  pWhere, 0, .    
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
13f40 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79   ? 0 : &pOrderBy
13f50 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  );.  if( pWInfo=
13f60 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
13f70 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  _end;..  /* Use 
13f80 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
13f90 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72  er loop if we ar
13fa0 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69  e not dealing wi
13fb0 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74  th.  ** aggregat
13fc0 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  es.  */.  if( !i
13fd0 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
13fe0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
13ff0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
14000 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
14010 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
14020 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
14030 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
14040 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
14050 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
14060 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
14070 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
14080 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14090 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c  * If we are deal
140a0 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61  ing with aggrega
140b0 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  tes, then do the
140c0 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61   special aggrega
140d0 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  te.  ** processi
140e0 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73  ng.  .  */.  els
140f0 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a  e{.    AggExpr *
14100 70 41 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47  pAgg;.    if( pG
14110 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
14120 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20  int lbl1;.      
14130 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
14140 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
14150 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14160 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
14170 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
14180 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
14190 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66  .      /* No aff
141a0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73 20  inity string is 
141b0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
141c0 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b  following OP_Mak
141d0 65 52 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a  eRecord .      *
141e0 2a 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20  * because we do 
141f0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61  not need to do a
14200 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64  ny coercion of d
14210 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20  atatypes. */.   
14220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14230 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
14240 63 6f 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e  cord, pGroupBy->
14250 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
14260 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56   lbl1 = sqlite3V
14270 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14290 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
142a0 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
142b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
142c0 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41   pAgg=pParse->aA
142d0 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  gg; i<pParse->nA
142e0 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29  gg; i++, pAgg++)
142f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  {.        if( pA
14300 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
14310 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
14320 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
14330 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70  arse, pAgg->pExp
14340 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
14350 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14360 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29  OP_AggSet, 0, i)
14370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14380 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14390 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29  veLabel(v, lbl1)
143a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
143b0 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
143c0 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
143d0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
143e0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  g++){.      Expr
143f0 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20   *pE;.      int 
14400 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e  nExpr;.      Fun
14410 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
14420 20 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41    if( !pAgg->isA
14430 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
14440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67       assert( pAg
14450 67 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  g->pFunc!=0 );. 
14460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67       assert( pAg
14470 67 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21  g->pFunc->xStep!
14480 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66  =0 );.      pDef
14490 20 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a   = pAgg->pFunc;.
144a0 20 20 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d        pE = pAgg-
144b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
144c0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
144d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
144e0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
144f0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45  TION );.      nE
14500 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
14510 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
14520 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29  arse, pE->pList)
14530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14540 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
14550 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
14560 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
14570 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
14580 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14590 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
145a0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
145b0 20 66 6f 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c   for(j=0; !pColl
145c0 20 26 26 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b   && j<nExpr; j++
145d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
145e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
145f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14600 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  pE->pList->a[j].
14610 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
14620 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  }.        if( !p
14630 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70  Coll ) pColl = p
14640 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
14650 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 71  Coll;.        sq
14660 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
14670 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
14680 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
14690 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
146b0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
146c0 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78  _AggFunc, 0, nEx
146d0 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  pr, (char*)pDef,
146e0 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
146f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e    }.  }..  /* En
14700 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
14710 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20  can loop..  */. 
14720 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
14730 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20  (pWInfo);..  /* 
14740 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73  If we are proces
14750 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c  sing aggregates,
14760 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20   we need to set 
14770 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70  up a second loop
14780 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f  .  ** over all o
14790 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
147a0 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65  values and proce
147b0 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  ss them..  */.  
147c0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
147d0 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71   int endagg = sq
147e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
147f0 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73  el(v);.    int s
14800 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61  tartagg;.    sta
14810 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56  rtagg = sqlite3V
14820 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
14830 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67  ggNext, 0, endag
14840 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  g);.    pParse->
14850 75 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  useAgg = 1;.    
14860 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
14870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14880 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
14890 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67  pHaving, startag
148a0 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g, 1);.    }.   
148b0 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
148c0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
148d0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
148e0 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
148f0 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
14910 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e  rm, startagg, en
14920 64 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20 20  dagg, aff) ){.  
14930 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
14940 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
14950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14960 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
14970 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71  tartagg);.    sq
14980 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14990 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29  Label(v, endagg)
149a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
149b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
149c0 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  p, 0, 0);.    pP
149d0 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30  arse->useAgg = 0
149e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
149f0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
14a00 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
14a10 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
14a20 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
14a30 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
14a40 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
14a50 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
14a60 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14a70 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
14a80 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
14a90 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
14aa0 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
14ab0 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  m);.  }..  /* If
14ac0 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71   this was a subq
14ad0 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f  uery, we have no
14ae0 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20  w converted the 
14af0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a  subquery into a.
14b00 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
14b10 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65  able.  So delete
14b20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74   the subquery st
14b30 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
14b40 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20   parent.  ** to 
14b50 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62  prevent this sub
14b60 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67  query from being
14b70 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
14b80 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68   and to force th
14b90 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  e.  ** the use o
14ba0 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
14bb0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
14bc0 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
14bd0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
14be0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
14bf0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
14c00 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
14c10 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
14c20 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
14c30 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14c40 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20  tDelete(p);.    
14c50 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
14c60 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
14c70 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ect = 0;.  }..  
14c80 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
14c90 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
14ca0 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
14cb0 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
14cc0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
14cd0 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
14ce0 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
14cf0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
14d00 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
14d10 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
14d20 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
14d30 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
14d40 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
14d50 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
14d60 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  ect_end:.  sqlit
14d70 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65  eAggregateInfoRe
14d80 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72  set(pParse);.  r
14d90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.