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

Artifact 56f018292ce467c276440916d455671d884e9141:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 32 36  select.c,v 1.226
0200: 20 32 30 30 35 2f 30 31 2f 31 38 20 31 36 3a 30   2005/01/18 16:0
0210: 32 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  2:40 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
0a00: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a10: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a20: 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20     u8 nChar;.   
0a30: 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65   u8 code;.  } ke
0a40: 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20  ywords[] = {.   
0a50: 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c   { "natural", 7,
0a60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20   JT_NATURAL },. 
0a70: 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20     { "left",    
0a80: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
0a90: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69  TER },.    { "ri
0aa0: 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49  ght",   5, JT_RI
0ab0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0ac0: 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20      { "full",   
0ad0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
0ae0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0af0: 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20  .    { "outer", 
0b00: 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c    5, JT_OUTER },
0b10: 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20  .    { "inner", 
0b20: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b30: 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20  .    { "cross", 
0b40: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0b50: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0b60: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0b70: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0b80: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0b90: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0ba0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0bb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0bc0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0bd0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0be0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
0bf0: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
0c00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
0c10: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
0c20: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
0c30: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
0c40: 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  Cmp(p->z, keywor
0c50: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0c60: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0c70: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0c80: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0c90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0cb0: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0cc0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0cd0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0ce0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0cf0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
0d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d10: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
0d20: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
0d30: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
0d40: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
0d50: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
0d60: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
0d70: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
0d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31  const char *zSp1
0d90: 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73   = " ";.    cons
0da0: 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22  t char *zSp2 = "
0db0: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0dc0: 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20  0 ){ zSp1++; }. 
0dd0: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
0de0: 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71  zSp2++; }.    sq
0df0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0e00: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
0e10: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
0e20: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
0e30: 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20    "%T%s%T%s%T", 
0e40: 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53  pA, zSp1, pB, zS
0e50: 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  p2, pC);.    joi
0e60: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
0e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  ;.  }else if( jo
0e80: 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48  intype & JT_RIGH
0e90: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
0ea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0eb0: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
0ec0: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
0ed0: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
0ee0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
0ef0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
0f00: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
0f10: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
0f20: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
0f30: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
0f40: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
0f50: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
0f60: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
0f70: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
0f80: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
0f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
0fa0: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
0fb0: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
0fc0: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
0fd0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0fe0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
0ff0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1000: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1010: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1020: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1030: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1040: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  -1;.}../*.** Set
1050: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1060: 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30  token to a '\000
1070: 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  '-terminated str
1080: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
1090: 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b  oid setToken(Tok
10a0: 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  en *p, const cha
10b0: 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20  r *z){.  p->z = 
10c0: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c  z;.  p->n = strl
10d0: 65 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20  en(z);.  p->dyn 
10e0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
10f0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
1100: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1110: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
1120: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
1130: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1140: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1150: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1160: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1170: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1180: 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73  hereTerm(.  cons
1190: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
11a0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
11c0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11d0: 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73  b1,      /* Firs
11e0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  t table */.  con
11f0: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c  st Table *pTab2,
1200: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
1210: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  table */.  Expr 
1220: 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20 20  **ppExpr        
1230: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
1240: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
1250: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1260: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  */.){.  Token du
1270: 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  mmy;.  Expr *pE1
1280: 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b  a, *pE1b, *pE1c;
1290: 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a  .  Expr *pE2a, *
12a0: 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45  pE2b, *pE2c;.  E
12b0: 78 70 72 20 2a 70 45 3b 0a 0a 20 20 73 65 74 54  xpr *pE;..  setT
12c0: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 43 6f  oken(&dummy, zCo
12d0: 6c 29 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c  l);.  pE1a = sql
12e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12f0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  0, 0, &dummy);. 
1300: 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45   pE2a = sqlite3E
1310: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1320: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 73 65 74 54   &dummy);.  setT
1330: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 70 54 61  oken(&dummy, pTa
1340: 62 31 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 70 45  b1->zName);.  pE
1350: 31 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1b = sqlite3Expr
1360: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1370: 75 6d 6d 79 29 3b 0a 20 20 73 65 74 54 6f 6b 65  ummy);.  setToke
1380: 6e 28 26 64 75 6d 6d 79 2c 20 70 54 61 62 32 2d  n(&dummy, pTab2-
1390: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 70 45 32 62 20  >zName);.  pE2b 
13a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13b0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13c0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13d0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13e0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
13f0: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1400: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1410: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1420: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1430: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1440: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1450: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1460: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a 70  _FromJoin);.  *p
1470: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1480: 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20  xprAnd(*ppExpr, 
1490: 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  pE);.}../*.** Se
14a0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
14b0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
14c0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
14d0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
14e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
14f0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1500: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1510: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1520: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
1530: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1540: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
1550: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
1560: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
1570: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
1580: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
1590: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
15a0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
15b0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
15c0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
15d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
15e0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
15f0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
1600: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
1610: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
1620: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
1630: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1640: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
1650: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
1660: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
1670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1680: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
1690: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
16a0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
16b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
16c0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65 74  omJoin);.    set
16d0: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
16e0: 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  t);.    p = p->p
16f0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1710: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1720: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1730: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1740: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1750: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1760: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1770: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1780: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1790: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
17a0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
17b0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
17c0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
17d0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
17e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
17f0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1800: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
1810: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
1820: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
1830: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
1840: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
1850: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
1860: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
1870: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
1880: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
1890: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
18a0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
18b0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
18c0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
18d0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
18e0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
18f0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
1900: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
1910: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1920: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1930: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
1940: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
1950: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
1960: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1970: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1980: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1990: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
19a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
19b0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
19c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
19d0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
19e0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a00: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
1a10: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a20: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a50: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
1a60: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
1a70: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
1a80: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
1a90: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1aa0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
1ab0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
1ac0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
1ad0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
1ae0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
1af0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
1b00: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
1b10: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
1b20: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
1b30: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
1b40: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
1b50: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
1b60: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
1b70: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
1b80: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
1b90: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
1ba0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
1bb0: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
1bc0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
1bd0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
1be0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
1bf0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
1c00: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
1c10: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
1c20: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
1c30: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
1c40: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
1c50: 69 66 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  if( pLeft->joint
1c60: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1c70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
1c80: 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66  eft->pOn || pLef
1c90: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
1ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1cb0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1cc0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
1cd0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
1ce0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
1cf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
1d00: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
1d10: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1d20: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1d30: 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  LeftTab->nCol; j
1d40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
1d50: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74  r *zName = pLeft
1d60: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1d70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
1d80: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
1d90: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  htTab, zName)>=0
1da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
1db0: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
1dc0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 52 69 67  , pLeftTab, pRig
1dd0: 68 74 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  htTab, &p->pWher
1de0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e00: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1e10: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1e20: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1e30: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1e40: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
1e50: 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70 55 73 69  n && pLeft->pUsi
1e60: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1e70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e80: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
1e90: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1ea0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1eb0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1ec0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
1ed0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ee0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1ef0: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
1f00: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1f10: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
1f20: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
1f30: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1f40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1f50: 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  eft->pOn ){.    
1f60: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c    setJoinExpr(pL
1f70: 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  eft->pOn);.     
1f80: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
1f90: 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
1fa0: 57 68 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f  Where, pLeft->pO
1fb0: 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 2d  n);.      pLeft-
1fc0: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
1fd0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
1fe0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
1ff0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
2000: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
2010: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
2020: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
2030: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
2040: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
2050: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
2060: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
2070: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
2080: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
2090: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
20a0: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
20b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
20c0: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
20d0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
20e0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
20f0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
2100: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
2110: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
2120: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
2130: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
2140: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
2150: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
2160: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2170: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2180: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
2190: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a   pLeft->pUsing;.
21a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
21b0: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
21c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
21d0: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e  *zName = pList->
21e0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
21f0: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2200: 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e  dex(pLeftTab, zN
2210: 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e  ame)<0 || column
2220: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
2230: 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20   zName)<0 ){.   
2240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2260: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
2270: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
2280: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
2290: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
22a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
22b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
22c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
22e0: 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d  ddWhereTerm(zNam
22f0: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 52 69  e, pLeftTab, pRi
2300: 67 68 74 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ghtTab, &p->pWhe
2310: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2320: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2330: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2340: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2350: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2360: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2370: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2380: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2390: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
23a0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
23b0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
23c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23d0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
23e0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
23f0: 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ete(p->pSrc);.  
2400: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2410: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2420: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2430: 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42  elete(p->pGroupB
2440: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
2450: 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69  rDelete(p->pHavi
2460: 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ng);.  sqlite3Ex
2470: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2480: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
2490: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
24a0: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73  (p->pPrior);.  s
24b0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
24c0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
24d0: 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  e aggregate info
24e0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
24f0: 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
2500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2510: 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
2520: 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20  InfoReset(Parse 
2530: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
2540: 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61  teFree(pParse->a
2550: 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Agg);.  pParse->
2560: 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  aAgg = 0;.  pPar
2570: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
2580: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
2590: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
25a0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
25b0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
25c0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
25d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
25e0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
25f0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
2600: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
2610: 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  orter(Parse *pPa
2620: 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78  rse, Vdbe *v, Ex
2630: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2640: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2650: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
2660: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
2670: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2680: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ode(pParse, pOrd
2690: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
26a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
26b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
26c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64  MakeRecord, pOrd
26d0: 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  erBy->nExpr, 0);
26e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
26f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75  dOp(v, OP_SortPu
2700: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
2710: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2720: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2730: 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 0a 2a 2f  SET and LIMIT.*/
2740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
2750: 65 4c 69 6d 69 74 65 72 28 0a 20 20 56 64 62 65  eLimiter(.  Vdbe
2760: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
2770: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
2780: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
2790: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
27a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
27b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
27c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
27d0: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a  iContinue,    /*
27e0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
27f0: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
2800: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ecord */.  int i
2810: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 2f 2a 20  Break,       /* 
2820: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64  Jump here to end
2830: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
2840: 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20  nt nPop         
2850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
2860: 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b  mes to pop stack
2870: 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f   when jumping */
2880: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
2890: 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  fset>=0 ){.    i
28a0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
28b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
28c0: 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  (v) + 2;.    if(
28d0: 20 6e 50 6f 70 3e 30 20 29 20 61 64 64 72 2b 2b   nPop>0 ) addr++
28e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
2900: 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Incr, p->iOffset
2910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
2920: 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20   nPop>0 ){.     
2930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2940: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f  p(v, OP_Pop, nPo
2950: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p, 0);.    }.   
2960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2970: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2980: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
2990: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29a0: 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20   "# skip OFFSET 
29b0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 7d 0a  records"));.  }.
29c0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
29d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
29e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
29f0: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
2a00: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
2a10: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2a20: 2c 20 22 23 20 65 78 69 74 20 77 68 65 6e 20 4c  , "# exit when L
2a30: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
2a40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a50: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2a60: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2a70: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2a80: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2a90: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2aa0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2ab0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2ac0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2ad0: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2ae0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2af0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2b00: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2b10: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2b20: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2b30: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2b40: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2b50: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2b60: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2b70: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2b80: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2ba0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2bb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2be0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c00: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2c10: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2c20: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2c30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2c40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2c50: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2c60: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2c70: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2c80: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2c90: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2ca0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2cb0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2cc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2cd0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2ce0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2cf0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2d00: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2d10: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2d20: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2d30: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2d40: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2d50: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2d60: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2d70: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2d80: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2d90: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2da0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2db0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2dc0: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2dd0: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2de0: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2df0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2e00: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2e10: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2e20: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2e30: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2e40: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2e60: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2e70: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2e80: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
2e90: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
2ea0: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
2eb0: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
2ec0: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
2ed0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2ee0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2ef0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
2f00: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
2f10: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
2f20: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2f30: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
2f40: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2f50: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2f60: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2f70: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2f80: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2f90: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2fa0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2fb0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2fc0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2fd0: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2fe0: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
2ff0: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
3000: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
3010: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
3020: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
3030: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
3040: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
3050: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
3060: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
3070: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3080: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3090: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
30a0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
30b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
30c0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
30d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
30f0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3110: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
3120: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3130: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
3140: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
3150: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3160: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3170: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3180: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3190: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
31a0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
31b0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
31c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
31d0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
31e0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
31f0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3200: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3210: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3220: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3230: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3240: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
3250: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3270: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
3280: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
3290: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
32a0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
32b0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
32c0: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
32d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
32e0: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
32f0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3300: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
3310: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3320: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3330: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
3340: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
3350: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3360: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3370: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3380: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3390: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
33a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33b0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
33c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
33d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
33e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
33f0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3400: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3410: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69  nt((v, "# skip i
3420: 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64  ndistinct record
3430: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3440: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3450: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
3460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3480: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3490: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   0);.    if( pOr
34a0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
34b0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
34c0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69   p, iContinue, i
34d0: 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Break, nColumn);
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
34f0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
3500: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
3510: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
3520: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
3530: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
3540: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
3550: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3560: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3570: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
3580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3590: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
35a0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
35b0: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
35c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
35e0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
35f0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3600: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3610: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
3620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3630: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3640: 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tStrKey, iParm, 
3650: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
3660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3670: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
3680: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
3690: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
36a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
36b0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
36c0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
36d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
36f0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3700: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
3710: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3720: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
3730: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
3740: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
3750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
3760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3770: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
3780: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37a0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
37b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
37c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
37d0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
37e0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
37f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3800: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3810: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
3820: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
3830: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
3840: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
3850: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
3860: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
3870: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
3880: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
3890: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
38a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
38b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
38c0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
38d0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
38e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
38f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3900: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3910: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
3920: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
3930: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3940: 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP3(v, -1, aff,
3950: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
3960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3970: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
3980: 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b  nd, iParm, addr+
3990: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
39a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
39b0: 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  _Delete, iParm, 
39c0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
39d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
39e0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
39f0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
3a00: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
3a10: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
3a20: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
3a30: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
3a40: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
3a50: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
3a60: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
3a70: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
3a80: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
3a90: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
3aa0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
3ab0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
3ac0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
3ad0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
3ae0: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
3af0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
3b00: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
3b10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b20: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3b30: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3b40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3b60: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
3b70: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3b90: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3ba0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3bb0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3bc0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3bd0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3bf0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69 50    char aff = (iP
3c00: 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20  arm>>16)&0xFF;. 
3c10: 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
3c20: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3c30: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
3c40: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
3c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c60: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
3c70: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
3c80: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 1);.        s
3c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3ca0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3cb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3cd0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3ce0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3cf0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d10: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3d20: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3d30: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3d60: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3d70: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3d80: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3d90: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3da0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3db0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3dc0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3dd0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3de0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3df0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3e00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
3e10: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
3e20: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3e30: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3e40: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3e50: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3e60: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3e70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3e90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3ea0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
3eb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
3ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ed0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3ee0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3f00: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3f10: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3f20: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3f30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f40: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3f50: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3f60: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f70: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3f90: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3fa0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3fb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3fc0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fd0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fe0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4000: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4010: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4020: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4030: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
4040: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4050: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4060: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
4070: 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  oke a subroutine
4080: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72   to handle the r
4090: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62  esults.  The sub
40a0: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20  routine itself. 
40b0: 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73     ** is respons
40c0: 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67  ible for popping
40d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66   the results off
40e0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
40f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4100: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
4110: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4120: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4140: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4150: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4160: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4170: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
4180: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
41a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
41b0: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
41c0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
41d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
41e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
41f0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
4200: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4210: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4220: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4230: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4240: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4250: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4260: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4270: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4280: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4290: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
42a0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
42b0: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
42c0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
42d0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
42e0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
42f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4300: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4310: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4320: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4330: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4340: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4360: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4370: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
4380: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
4390: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
43a0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
43b0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
43c0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
43d0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
43e0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
43f0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4400: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4410: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4420: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4430: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4440: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
4450: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
4460: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
4470: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
44a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
44b0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
44c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
44d0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
44e0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
44f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4500: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4510: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4520: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4530: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4540: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
4550: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
4560: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
4570: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
4580: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
4590: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
45a0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
45b0: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
45c0: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
45d0: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
45e0: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
45f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4600: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4610: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4620: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4630: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4640: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
4650: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4660: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
4670: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4680: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4690: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
46a0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
46b0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
46c0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c  pOrderBy;.  nCol
46d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
46e0: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
46f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4700: 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f  of(*pInfo) + nCo
4710: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
4720: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
4730: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
4740: 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  n;.  pInfo->aSor
4750: 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29  tOrder = (char*)
4760: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43  &pInfo->aColl[nC
4770: 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46  ol];.  pInfo->nF
4780: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66  ield = nCol;.  f
4790: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
47a0: 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  i++){.    /* If 
47b0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
47c0: 65 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69  ence was specifi
47d0: 65 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68  ed explicity, th
47e0: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  en it.    ** is 
47f0: 73 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72  stored in pOrder
4800: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20  By->a[i].zName. 
4810: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
4820: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  he default.    *
4830: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
4840: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
4850: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
4860: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
4880: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
4890: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
48a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e  r);.    if( !pIn
48b0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
48c0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
48d0: 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c  ll[i] = db->pDfl
48e0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
48f0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4900: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
4910: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
4920: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4930: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  dbeOp3(v, OP_Sor
4940: 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  t, 0, 0, (char*)
4950: 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  pInfo, P3_KEYINF
4960: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64  O_HANDOFF);.  ad
4970: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4980: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4990: 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Next, 0, end1);.
49a0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
49b0: 20 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20   p, addr, end2, 
49c0: 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  1);.  switch( eD
49d0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
49e0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
49f0: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
4a00: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
4a10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a20: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72  P_NewRecno, iPar
4a30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
4a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4a50: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4a60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4a80: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
4a90: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4ab0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
4ac0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
4ad0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
4ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4af0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
4b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4b10: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4b30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4b40: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
4b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4b60: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
4b70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4b80: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
4b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4ba0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4bb0: 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33  d, 1, 0, "n", P3
4bc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4be0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
4bf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c10: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28   OP_PutStrKey, (
4c20: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
4c30: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
4c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4c50: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
4c60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4c70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c90: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
4ca0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
4cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cc0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4cd0: 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62  , end1);.      b
4ce0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4cf0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
4d00: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
4d10: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
4d20: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d40: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
4d50: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
4d60: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
4d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4d80: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4d90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4da0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
4db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4dc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4dd0: 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29  Column, -1-i, i)
4de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4df0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
4e00: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
4e10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e20: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4e30: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4e40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
4e70: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4ea0: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
4eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ec0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4ed0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
4ee0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
4ef0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f10: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4f20: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
4f30: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4f40: 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73  el(v, end2);.  s
4f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f60: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4f70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
4f80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
4f90: 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nd1);.  sqlite3V
4fa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4fb0: 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b  ortReset, 0, 0);
4fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4fd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4fe0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
4ff0: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
5000: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
5010: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
5020: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
5030: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
5040: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
5050: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  caller..**.** If
5060: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
5070: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
5080: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
5090: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
50a0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69   from.** the ori
50b0: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
50c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
50d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
50e0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a  s a column..** .
50f0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
5100: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65  on type for an e
5110: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74  xpression is eit
5120: 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49  her TEXT, NUMERI
5130: 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65  C or ANY..** The
5140: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
5150: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
5160: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a  eld is INTEGER..
5170: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5180: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
5190: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
51a0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
51b0: 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
51c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
51d0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Type;.  int j;. 
51e0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
51f0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72   pTabList==0 ) r
5200: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 71 6c 69  eturn 0;..  sqli
5210: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
5220: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
5230: 4c 69 73 74 2c 20 30 2c 20 70 45 78 70 72 2c 20  List, 0, pExpr, 
5240: 31 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  1, 0);.  switch(
5250: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
5260: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
5270: 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  : {.      Table 
5280: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  *pTab;.      int
5290: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
52a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
52b0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
52c0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
52d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
52e0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
52f0: 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61  ; j++){}.      a
5300: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
5310: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
5320: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
5330: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
5340: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
5350: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
5360: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
5370: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
5380: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5390: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
53a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
53b0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
53c0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
53d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
53e0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
53f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
5400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5410: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5420: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
5430: 20 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20   {.      Select 
5440: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
5450: 6c 65 63 74 3b 0a 20 20 20 20 20 20 7a 54 79 70  lect;.      zTyp
5460: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 70  e = columnType(p
5470: 50 61 72 73 65 2c 20 70 53 2d 3e 70 53 72 63 2c  Parse, pS->pSrc,
5480: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30   pS->pEList->a[0
5490: 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20 20 20 20  ].pExpr); .     
54a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
54b0: 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20 20    case TK_AS:.  
54c0: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53      /* The TK_AS
54d0: 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e   operator can on
54e0: 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45  ly occur in ORDE
54f0: 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20  R BY, GROUP BY, 
5500: 48 41 56 49 4e 47 2c 0a 20 20 20 20 20 20 2a 2a  HAVING,.      **
5510: 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73   and LIMIT claus
5520: 65 73 2e 20 20 42 75 74 20 70 45 78 70 72 20 6f  es.  But pExpr o
5530: 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
5540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5550: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
5560: 2e 20 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20  .  So pExpr can 
5570: 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e  never contain an
5580: 20 41 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   AS operator..  
5590: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
55a0: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 20 20  ert( 0 );.      
55b0: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
55c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
55d0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
55e0: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
55f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
5600: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5610: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5620: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
5630: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
5640: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5650: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
5660: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
5670: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
5680: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5690: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
56a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
56b0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
56c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
56d0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
56e0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
56f0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5700: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5710: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5720: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5730: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  e;.  int i;.  fo
5740: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
5750: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5760: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
5770: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5780: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5790: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
57a0: 70 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  pe(pParse, pTabL
57b0: 69 73 74 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ist, p);.    if(
57c0: 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74   zType==0 ) cont
57d0: 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68 65  inue;.    /* The
57e0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
57f0: 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66  it's own copy of
5800: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
5810: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a 20  , in case the . 
5820: 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20     ** schema is 
5830: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
5840: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
5850: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
5860: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
5870: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
5880: 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  , i+pEList->nExp
5890: 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e  r, zType, strlen
58a0: 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a  (zType));.  }.}.
58b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
58c0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
58d0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
58e0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
58f0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
5900: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
5910: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
5920: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
5930: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
5940: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
5950: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5960: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
5970: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
5980: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
5990: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
59a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
59b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
59c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
59d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
59e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
59f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5a00: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5a10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5a20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5a30: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
5a40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5a50: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
5a60: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
5a70: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5a80: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
5a90: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
5aa0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
5ab0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
5ac0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
5ad0: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
5ae0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
5af0: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
5b00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
5b10: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5b20: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
5b30: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
5b40: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
5b50: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
5b60: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
5b70: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
5b80: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5b90: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
5ba0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
5bb0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
5bc0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
5bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
5be0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
5bf0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
5c00: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
5c10: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
5c20: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
5c30: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
5c40: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
5c50: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5c60: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
5c70: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
5c80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
5c90: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61  olName(v, i, zNa
5ca0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
5cb0: 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ));.      contin
5cc0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
5cd0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
5ce0: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
5cf0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
5d00: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
5d10: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
5d20: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
5d30: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
5d40: 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; j<pTabList->n
5d50: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
5d60: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
5d70: 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d  ->iTable; j++){}
5d80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
5d90: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
5da0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
5db0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
5dc0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
5dd0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
5de0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
5df0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
5e00: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
5e10: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
5e20: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
5e30: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
5e40: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
5e50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5e60: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
5e70: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5e80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
5e90: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
5ea0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
5eb0: 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26  s && p->span.z &
5ec0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
5ed0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5ee0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
5ef0: 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  v, i, p->span.z,
5f00: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
5f10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
5f20: 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72  lNames || (!shor
5f30: 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69  tNames && pTabLi
5f40: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
5f50: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
5f60: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
5f70: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20  char *zTab;. .  
5f80: 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61        zTab = pTa
5f90: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69  bList->a[j].zAli
5fa0: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
5fb0: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61  fullNames || zTa
5fc0: 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54  b==0 ) zTab = pT
5fd0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
5fe0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
5ff0: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62  ing(&zName, zTab
6000: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
6010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6020: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
6030: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44  , i, zName, P3_D
6040: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
6050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6060: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6070: 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c 2c 20  ame(v, i, zCol, 
6080: 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20  strlen(zCol));. 
6090: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
60a0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
60b0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
60c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
60d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
60e0: 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70   i, p->span.z, p
60f0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
6100: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
6110: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
6120: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
6130: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
6140: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
6150: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
6160: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
6170: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
6180: 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c    sprintf(zName,
6190: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
61a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
61b0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
61c0: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , i, zName, 0);.
61d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
61e0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
61f0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6200: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
6210: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
6220: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
6230: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
6240: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
6250: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6260: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
6270: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
6280: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
6290: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
62a0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
62b0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
62c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
62d0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
62e0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
62f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6300: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
6310: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
6320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6330: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
6340: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
6350: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
6360: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
6370: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
6380: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
6390: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
63a0: 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  mt(Parse*, Selec
63b0: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
63c0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
63d0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
63e0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
63f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
6400: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
6410: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
6420: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
6430: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
6440: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
6450: 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  se, char *zTabNa
6460: 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  me, Select *pSel
6470: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
6480: 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Tab;.  int i, j;
6490: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
64a0: 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  ist;.  Column *a
64b0: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  Col, *pCol;..  i
64c0: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
64d0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
64e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
64f0: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
6500: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
6510: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
6520: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
6530: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6540: 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   }.  pTab->zName
6550: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
6560: 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e  liteStrDup(zTabN
6570: 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69  ame) : 0;.  pELi
6580: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
6590: 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43  List;.  pTab->nC
65a0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
65b0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
65c0: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
65d0: 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f  pTab->aCol = aCo
65e0: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
65f0: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
6600: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
6610: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  ol );.  for(i=0,
6620: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54   pCol=aCol; i<pT
6630: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
6640: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  Col++){.    Expr
6650: 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a   *pR;.    char *
6660: 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20  zType;.    char 
6670: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 45 78 70 72  *zName;.    Expr
6680: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
6690: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
66a0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
66b0: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
66c0: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70  >token.z==0 || p
66d0: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
66e0: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  z[0]!=0 );.    i
66f0: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
6700: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
6710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  =0 ){.      zNam
6720: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6730: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  (zName);.    }el
6740: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
6750: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
6760: 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70       && (pR=p->p
6770: 52 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d  Right)!=0 && pR-
6780: 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e  >token.z && pR->
6790: 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  token.z[0] ){.  
67a0: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
67b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
67c0: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
67d0: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
67e0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
67f0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
6800: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6810: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
6820: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
6830: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6840: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
6850: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
6860: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
6870: 22 25 54 5f 25 64 22 2c 20 26 70 52 2d 3e 74 6f  "%T_%d", &pR->to
6880: 6b 65 6e 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ken, ++cnt);.   
6890: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
68a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
68b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
68c0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
68d0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
68e0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
68f0: 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26  3MPrintf("%T", &
6900: 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65  p->span);.    }e
6910: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  lse{.      zName
6920: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
6930: 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  f("column%d", i+
6940: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
6950: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
6960: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  me);.    pCol->z
6970: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
6980: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
6990: 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79  eStrDup(columnTy
69a0: 70 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  pe(pParse, pSele
69b0: 63 74 2d 3e 70 53 72 63 20 2c 70 29 29 3b 0a 20  ct->pSrc ,p));. 
69c0: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
69d0: 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c   zType;.    pCol
69e0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
69f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
6a00: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 29  .    if( zType )
6a10: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 61 66  {.      pCol->af
6a20: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
6a30: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
6a40: 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65  pe, strlen(zType
6a50: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
6a60: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->pColl = sqli
6a70: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
6a80: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
6a90: 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20  f( !pCol->pColl 
6aa0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  ){.      pCol->p
6ab0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
6ac0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
6ad0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
6ae0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
6af0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
6b00: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45  .** Prepare a SE
6b10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
6b20: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79  or processing by
6b30: 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   doing the follo
6b40: 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a  wing.** things:.
6b50: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
6b60: 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
6b70: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
6b80: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
6b90: 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
6ba0: 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
6bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
6bc0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
6bd0: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
6be0: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
6bf0: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
6c00: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
6c10: 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
6c20: 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
6c30: 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
6c40: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
6c50: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
6c60: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
6c70: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
6c80: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
6c90: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
6ca0: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
6cb0: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
6cc0: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
6cd0: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
6ce0: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
6cf0: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
6d00: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
6d10: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
6d20: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
6d30: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
6d40: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
6d50: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
6d60: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
6d70: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
6d80: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
6d90: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
6da0: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
6db0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
6dc0: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
6dd0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
6de0: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
6df0: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
6e00: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
6e10: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
6e20: 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
6e30: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
6e40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6e50: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
6e60: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
6e70: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
6e80: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
6e90: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
6ea0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
6eb0: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
6ec0: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
6ed0: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
6ee0: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
6ef0: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
6f00: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
6f10: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
6f20: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
6f30: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
6f40: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
6f50: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
6f60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
6f70: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
6f80: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
6f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
6fa0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
6fb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
6fc0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
6fd0: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
6fe0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
6ff0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7000: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
7010: 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  b;.  struct SrcL
7020: 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
7030: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
7040: 70 2d 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74  p->pSrc==0 ) ret
7050: 75 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73  urn 1;.  pTabLis
7060: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
7070: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
7080: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
7090: 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
70a0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
70b0: 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
70c0: 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
70d0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
70e0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
70f0: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
7100: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
7110: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
7120: 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20  p->pSrc);..  /* 
7130: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
7140: 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
7150: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
7160: 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
7170: 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
7180: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7190: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
71a0: 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
71b0: 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
71c0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
71d0: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
71e0: 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
71f0: 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
7200: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
7210: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
7220: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
7230: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
7240: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  m++){.    if( pF
7250: 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
7260: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
7270: 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
7280: 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
7290: 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
72a0: 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
72b0: 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
72c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
72d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
72e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
72f0: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
7300: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
7310: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
7320: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
7330: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
7340: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
7350: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  m->pSelect!=0 );
7360: 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
7370: 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ->zAlias==0 ){. 
7380: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41         pFrom->zA
7390: 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20  lias =.         
73a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
73b0: 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
73c0: 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46  _%p_", (void*)pF
73d0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
73e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 46 72       }.      pFr
73f0: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
7400: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
7410: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
7420: 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ect(pParse, pFro
7430: 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d  m->zAlias, pFrom
7440: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
7450: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
7460: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7470: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
7480: 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69   /* The isTransi
7490: 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ent flag indicat
74a0: 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c  es that the Tabl
74b0: 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  e structure has 
74c0: 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79  been.      ** dy
74d0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
74e0: 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66  ted and may be f
74f0: 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65  reed at any time
7500: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
7510: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62  s,.      ** pTab
7520: 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
7530: 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74   to a persistent
7540: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
7550: 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20   that defines.  
7560: 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
7570: 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  he schema. */.  
7580: 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e      pTab->isTran
7590: 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  sient = 1;.    }
75a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
75b0: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
75c0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
75d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
75e0: 20 2a 2f 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   */.      pFrom-
75f0: 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
7600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
7610: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
7620: 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  e,pFrom->zName,p
7630: 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
7640: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7660: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7670: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
7680: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
7690: 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
76a0: 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
76b0: 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
76c0: 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
76d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
76e0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
76f0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
7700: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
7710: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
7720: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66   }.        /* If
7730: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
7740: 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
7750: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
7760: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
7770: 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
7780: 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
7790: 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
77a0: 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
77b0: 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
77c0: 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
77d0: 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
77e0: 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
77f0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7800: 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
7810: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
7820: 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
7830: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
7840: 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
7850: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7860: 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63  Dup(pTab->pSelec
7870: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
78a0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
78b0: 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
78c0: 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
78d0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
78e0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
78f0: 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74  pParse, p) ) ret
7900: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72  urn 1;..  /* For
7910: 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
7920: 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
7930: 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
7940: 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
7950: 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
7960: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
7970: 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
7980: 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
7990: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
79a0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
79b0: 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
79c0: 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
79d0: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
79e0: 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
79f0: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
7a00: 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
7a10: 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
7a20: 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
7a30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
7a40: 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
7a50: 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
7a60: 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
7a70: 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
7a80: 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
7a90: 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
7aa0: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
7ab0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
7ac0: 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
7ad0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
7ae0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
7af0: 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
7b00: 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
7b10: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
7b20: 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
7b30: 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
7b40: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69   Expr *pE = pELi
7b50: 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
7b60: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
7b70: 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
7b80: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
7b90: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
7ba0: 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67  ight && pE->pRig
7bb0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20  ht->op==TK_ALL. 
7bc0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70          && pE->p
7bd0: 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66  Left && pE->pLef
7be0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62  t->op==TK_ID ) b
7bf0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  reak;.  }.  rc =
7c00: 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69   0;.  if( k<pELi
7c10: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
7c20: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
7c30: 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
7c40: 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
7c50: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
7c60: 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
7c70: 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
7c80: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
7c90: 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
7ca0: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
7cb0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
7cc0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
7cd0: 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
7ce0: 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
7cf0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
7d00: 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
7d10: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
7d20: 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
7d30: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
7d40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
7d50: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
7d60: 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72  *pE = a[k].pExpr
7d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
7d80: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20  op!=TK_ALL &&.  
7d90: 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70           (pE->op
7da0: 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
7db0: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d  pRight==0 || pE-
7dc0: 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
7dd0: 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
7de0: 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
7df0: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
7e00: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
7e10: 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
7e20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
7e30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
7e40: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
7e50: 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29  , a[k].pExpr, 0)
7e60: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
7e70: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
7e80: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
7e90: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  ame;.        a[k
7ea0: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
7eb0: 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
7ec0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
7ed0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
7ee0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7ef0: 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
7f00: 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
7f10: 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
7f20: 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
7f30: 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
7f40: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
7f50: 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
7f60: 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
7f70: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
7f80: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f90: 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
7fa0: 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
7fb0: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
7fc0: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c  TK_DOT && pE->pL
7fd0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
7fe0: 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   zTName = sqlite
7ff0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26  3NameFromToken(&
8000: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
8010: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
8020: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
8030: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
8040: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
8050: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
8060: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
8070: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
8080: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
8090: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
80a0: 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
80b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
80c0: 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
80d0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
80e0: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
80f0: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
8100: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
8110: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
8120: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
8130: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8140: 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a  if( zTName && (z
8150: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
8160: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20  abName[0]==0 || 
8170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8180: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
8190: 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
81a0: 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  e)!=0) ){.      
81b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
81c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
81d0: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
81e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
81f0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
8200: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
8210: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
8220: 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52  xpr, *pLeft, *pR
8230: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
8240: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8250: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
8260: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
8270: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
8280: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
8290: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
82a0: 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73  pLeft = &pTabLis
82b0: 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20  t->a[i-1];.     
82c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c           if( (pL
82d0: 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  eft->jointype & 
82e0: 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26  JT_NATURAL)!=0 &
82f0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
8300: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
8310: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61  Index(pLeft->pTa
8320: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
8350: 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
8360: 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
8370: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
8380: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
8390: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
83b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
83c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
83d0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
83e0: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c  e3IdListIndex(pL
83f0: 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  eft->pUsing, zNa
8400: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
8410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
8420: 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
8430: 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
8440: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
8470: 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
8480: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
84b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
84c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
84d0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
84e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
84f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
8500: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
8510: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8520: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
8530: 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  n(&pRight->token
8540: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
8550: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
8560: 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  me && pTabList->
8570: 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
8580: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
8590: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
85a0: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
85b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
85c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
85d0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
85e0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
85f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
8600: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
8610: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
8620: 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b  oken(&pLeft->tok
8630: 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  en, zTabName);. 
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
8650: 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70  Token(&pExpr->sp
8660: 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  an, sqlite3MPrin
8670: 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  tf("%s.%s", zTab
8680: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
86a0: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
86b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
86c0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
86d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
86e0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
86f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8700: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
8710: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
8720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8730: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8740: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
8750: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8760: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
8770: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
8780: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
8790: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
87a0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
87b0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
87c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
87d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
87e0: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
87f0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
8800: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
8810: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8820: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
8830: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
8840: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8860: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8870: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8880: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
8890: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
88a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
88b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
88c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
88d0: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  TName);.      }.
88e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
88f0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8900: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
8910: 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
8920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8940: 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c  utine recursivel
8950: 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65  y unlinks the Se
8960: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54  lect.pSrc.a[].pT
8970: 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69  ab pointers.** i
8980: 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63  n a select struc
8990: 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73  ture.  It just s
89a0: 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ets the pointers
89b0: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a   to NULL.  This.
89c0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ** routine is re
89d0: 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73  cursive in the s
89e0: 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65  ense that if the
89f0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d   Select.pSrc.a[]
8a00: 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e  .pSelect.** poin
8a10: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
8a20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8a30: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
8a40: 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e  ely on that poin
8a50: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
8a60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8a70: 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20  d on the Select 
8a80: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8a90: 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57  efines a.** VIEW
8aa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64   in order to und
8ab0: 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74  o any bindings t
8ac0: 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  o tables.  This 
8ad0: 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
8ae0: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61  because those ta
8af0: 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52  bles might be DR
8b00: 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71  OPed by a subseq
8b10: 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  uent SQL command
8b20: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e 64  ..** If the bind
8b30: 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65 6d  ings are not rem
8b40: 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53  oved, then the S
8b50: 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e  elect.pSrc->a[].
8b60: 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69  pTab field.** wi
8b70: 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
8b80: 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63  ing to a dealloc
8b90: 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75 63  ated Table struc
8ba0: 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a 2a  ture after the.*
8bb0: 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f 72  * DROP and a cor
8bc0: 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72  edump will occur
8bd0: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
8be0: 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64 2e  he VIEW is used.
8bf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8c00: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
8c10: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
8c20: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
8c30: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73  c = p->pSrc;.  s
8c40: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
8c50: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 54 61 62  em *pItem;.  Tab
8c60: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
8c70: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
8c80: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
8c90: 70 53 72 63 2d 3e 61 3b 20 69 3c 70 53 72 63 2d  pSrc->a; i<pSrc-
8ca0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
8cb0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
8cc0: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
8cd0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  b)!=0 ){.      i
8ce0: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
8cf0: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ient ){.        
8d00: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
8d10: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
8d20: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d     }.      pItem
8d30: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
8d40: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
8d50: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
8d60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
8d70: 69 6e 64 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ind(pItem->pSele
8d80: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
8d90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8da0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
8db0: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
8dc0: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
8dd0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
8de0: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
8df0: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
8e00: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
8e10: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
8e20: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
8e30: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8e40: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
8e50: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
8e60: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
8e70: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
8e80: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
8e90: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
8ea0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
8eb0: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
8ec0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
8ed0: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
8ee0: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
8ef0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
8f00: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
8f10: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
8f20: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
8f30: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
8f40: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
8f50: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
8f60: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
8f70: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
8f80: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
8f90: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
8fa0: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
8fb0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
8fc0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
8fd0: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
8fe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
8ff0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
9000: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
9010: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9020: 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61  * A place to lea
9030: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
9040: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
9050: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f  Select,        /
9060: 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c  * Match to resul
9070: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69  t columns of thi
9080: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78  s SELECT */.  Ex
9090: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
90a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
90b0: 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20  ER BY values to 
90c0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f  match against co
90d0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lumns */.  int i
90e0: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
90f0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
9100: 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c  s value in iTabl
9110: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43  e */.  int mustC
9120: 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f  omplete        /
9130: 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52  * If TRUE all OR
9140: 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74  DER BYs must mat
9150: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ch */.){.  int n
9160: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
9170: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
9180: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
9190: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
91a0: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
91b0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74  rn 1;.  if( must
91c0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
91d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
91e0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
91f0: 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  { pOrderBy->a[i]
9200: 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d  .done = 0; }.  }
9210: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
9220: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
9230: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
9240: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9250: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
9260: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
9270: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
9280: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
9290: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
92a0: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
92b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
92c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
92d0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
92e0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
92f0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9300: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
9310: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
9320: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9330: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
9340: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
9350: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9360: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9370: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
9380: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
9390: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
93a0: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
93b0: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
93c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
93d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
93e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52  e,.          "OR
93f0: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
9400: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
9410: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
9420: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20            iCol, 
9430: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9440: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
9450: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9470: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
9480: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9490: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
94a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
94b0: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
94c0: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
94d0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
94e0: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
94f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
9500: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
9510: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
9520: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
9530: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
9540: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
9550: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
9560: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e  Label = sqlite3N
9570: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
9580: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
9590: 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c    assert( zLabel
95a0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
95b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
95c0: 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29  p(zName, zLabel)
95d0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
95e0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
95f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9600: 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29  liteFree(zLabel)
9610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9620: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71  if( iCol<0 && sq
9630: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
9640: 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  (pE, pEList->a[j
9650: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9660: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
9670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9680: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
9690: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
96a0: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
96b0: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
96c0: 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61  l;.      pE->iTa
96d0: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
96e0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
96f0: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
9700: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c   }.    if( iCol<
9710: 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74  0 && mustComplet
9720: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
9730: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9740: 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45  e,.        "ORDE
9750: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
9760: 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   %d does not mat
9770: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
9780: 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20  lumn", i+1);.   
9790: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
97a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
97b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
97c0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20    .}../*.** Get 
97d0: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
97e0: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
97f0: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
9800: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
9810: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
9820: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
9830: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
9840: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
9850: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
9860: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
9870: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
9880: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9890: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
98a0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
98b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
98c0: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
98d0: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
98e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
98f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
9900: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
9910: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
9920: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
9930: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d  d on the.** nLim
9940: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66  it and nOffset f
9950: 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61  ields.  nLimit a
9960: 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd nOffset hold 
9970: 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  the integers.** 
9980: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
9990: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
99a0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
99b0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
99c0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
99d0: 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20  .  Or that hold 
99e0: 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73  -1 and 0 if thos
99f0: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
9a00: 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69  mitted..** iLimi
9a10: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
9a20: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
9a30: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
9a40: 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75  mbers for.** cou
9a50: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
9a60: 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
9a70: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
9a80: 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c  there is no.** l
9a90: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
9aa0: 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20  et, then iLimit 
9ab0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9ac0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
9ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
9ae0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
9af0: 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  if iLimit and iO
9b00: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
9b10: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
9b20: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
9b30: 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66   nLimit and nOff
9b40: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
9b50: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
9b60: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
9b70: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
9b80: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
9b90: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
9ba0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
9bb0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
9bc0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
9bd0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69  ** Only if nLimi
9be0: 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e  t>=0 or nOffset>
9bf0: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
9c00: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
9c10: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
9c20: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
9c30: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
9c40: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
9c50: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
9c60: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
9c70: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
9c80: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
9c90: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
9ca0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
9cb0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
9cc0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
9cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
9ce0: 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20  ect *p){.  /* . 
9cf0: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61   ** If the compa
9d00: 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d  rison is p->nLim
9d10: 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54  it>0 then "LIMIT
9d20: 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61   0" shows.  ** a
9d30: 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20  ll rows.  It is 
9d40: 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c  the same as no l
9d50: 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d  imit. If the com
9d60: 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a  parision is.  **
9d70: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68   p->nLimit>=0 th
9d80: 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f  en "LIMIT 0" sho
9d90: 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c  w no rows at all
9da0: 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31  ..  ** "LIMIT -1
9db0: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
9dc0: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
9dd0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
9de0: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
9df0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
9e00: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
9e10: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
9e20: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
9e30: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
9e40: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
9e50: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
9e60: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69   */.  if( p->nLi
9e70: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit>=0 ){.    in
9e80: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
9e90: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
9ea0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
9eb0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9ec0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
9ed0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
9ee0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9ef0: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c  _Integer, -p->nL
9f00: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
9f10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9f20: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
9f30: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
9f40: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
9f50: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
9f60: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
9f70: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
9f80: 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29  ( p->nOffset>0 )
9f90: 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  {.    int iMem =
9fa0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
9fb0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
9fc0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
9fd0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
9fe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a000: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a010: 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30  , -p->nOffset, 0
a020: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
a040: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
a050: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
a060: 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20  t((v, "# OFFSET 
a070: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
a080: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65  p->iOffset = iMe
a090: 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m;.  }.}../*.** 
a0a0: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e  Generate VDBE in
a0b0: 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
a0c0: 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e  will open a tran
a0d0: 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  sient table that
a0e0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .** will be used
a0f0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72   for an index or
a100: 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20   to store keyed 
a110: 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f  results for a co
a120: 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  mpound.** select
a130: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a140: 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  s, open a transi
a150: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e  ent table that n
a160: 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66  eeds a.** KeyInf
a170: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
a180: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
a190: 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e  mns in the KeyIn
a1a0: 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  fo is determined
a1b0: 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c  .** by the resul
a1c0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
a1d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
a1e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
a1f0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  ment..**.** Spec
a200: 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72  ifically, this r
a210: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a220: 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65   to open an inde
a230: 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44  x table for.** D
a240: 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20  ISTINCT, UNION, 
a250: 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45 58  INTERSECT and EX
a260: 43 45 50 54 20 73 65 6c 65 63 74 20 73 74 61 74  CEPT select stat
a270: 65 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20  ements (but not 
a280: 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  .** UNION ALL)..
a290: 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e  **.** Make the n
a2a0: 65 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73  ew table a KeyAs
a2b0: 44 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65  Data table if ke
a2c0: 79 41 73 44 61 74 61 20 69 73 20 74 72 75 65 2e  yAsData is true.
a2d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
a2e0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
a2f0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
a300: 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74  OP_OpenTemp inst
a310: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruction..*/.stat
a320: 69 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49  ic int openTempI
a330: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
a340: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
a350: 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79  nt iTab, int key
a360: 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e  AsData){.  KeyIn
a370: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
a380: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73  int nColumn;.  s
a390: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a3a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
a3b0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a3c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
a3d0: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20  nt addr;..  if( 
a3e0: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
a3f0: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
a400: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a410: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45   nColumn = p->pE
a420: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
a430: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
a440: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
a450: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d  pKeyInfo)+nColum
a460: 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  n*sizeof(CollSeq
a470: 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  *) );.  if( pKey
a480: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
a490: 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e   0;.  pKeyInfo->
a4a0: 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20  enc = db->enc;. 
a4b0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
a4c0: 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66  d = nColumn;.  f
a4d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
a4e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b 65  n; i++){.    pKe
a4f0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
a500: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a510: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
a520: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
a530: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  pr);.    if( !pK
a540: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
a550: 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e   ){.      pKeyIn
a560: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64  fo->aColl[i] = d
a570: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
a580: 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d    }.  }.  addr =
a590: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a5a0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
a5b0: 69 54 61 62 2c 20 30 2c 20 0a 20 20 20 20 20 20  iTab, 0, .      
a5c0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
a5d0: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
a5e0: 4f 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79 41  OFF);.  if( keyA
a5f0: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71 6c  sData ){.    sql
a600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a610: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 69   OP_KeyAsData, i
a620: 54 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Tab, 1);.  }.  r
a630: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
a640: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a650: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a660: 43 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  CT./*.** Add the
a670: 20 61 64 64 72 65 73 73 20 22 61 64 64 72 22 20   address "addr" 
a680: 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  to the set of al
a690: 6c 20 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64  l OpenTemp opcod
a6a0: 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a 20 74  e addresses.** t
a6b0: 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 61 63  hat are being ac
a6c0: 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d 3e  cumulated in p->
a6d0: 70 70 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a 73  ppOpenTemp..*/.s
a6e0: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
a6f0: 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64  electOpenTempAdd
a700: 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  r(Select *p, int
a710: 20 61 64 64 72 29 7b 0a 20 20 49 64 4c 69 73 74   addr){.  IdList
a720: 20 2a 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70 70   *pList = *p->pp
a730: 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74  OpenTemp = sqlit
a740: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a  e3IdListAppend(*
a750: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30  p->ppOpenTemp, 0
a760: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
a770: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a790: 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  }.  pList->a[pLi
a7a0: 73 74 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d  st->nId-1].idx =
a7b0: 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20   addr;.  return 
a7c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
a7d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a7e0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a7f0: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
a800: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a810: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
a820: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
a830: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
a840: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
a850: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
a860: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
a870: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
a880: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
a890: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
a8a0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
a8b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
a8c0: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
a8d0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
a8e0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
a8f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
a900: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
a910: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
a920: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
a930: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
a940: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
a950: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
a960: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
a970: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
a980: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
a990: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
a9a0: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
a9b0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
a9c0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
a9d0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
a9e0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
a9f0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
aa00: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
aa10: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
aa20: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  0;.  }.  if( pRe
aa30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74  t==0 ){.    pRet
aa40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
aa50: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
aa60: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
aa70: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
aa80: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
aa90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
aaa0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
aab0: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
aac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
aad0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
aae0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
aaf0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
ab00: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
ab10: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
ab20: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
ab30: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
ab40: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
ab50: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
ab60: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
ab70: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
ab80: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
ab90: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
aba0: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
abb0: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
abc0: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
abd0: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
abe0: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
abf0: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
ac00: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
ac10: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
ac20: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
ac30: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
ac40: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
ac50: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
ac60: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
ac70: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
ac80: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
ac90: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
aca0: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
acb0: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
acc0: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
acd0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
ace0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
acf0: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
ad00: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
ad10: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
ad20: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
ad30: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
ad40: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
ad50: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
ad60: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
ad70: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
ad80: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
ad90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ada0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
adb0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
adc0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
add0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
ade0: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
adf0: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
ae00: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
ae10: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
ae20: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
ae30: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
ae40: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
ae50: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
ae60: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
ae70: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
ae80: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
ae90: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
aea0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
aeb0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
aec0: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
aed0: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
aee0: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
aef0: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
af00: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
af10: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
af20: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
af30: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
af40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
af50: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
af60: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
af70: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
af80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
af90: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
afa0: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
afb0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
afc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f            /* \__
afd0: 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20 72  _  Store query r
afe0: 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69 66  esults as specif
aff0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ied */.  int iPa
b000: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rm,            /
b010: 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73 65  * /     by these
b020: 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e   two parameters.
b030: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68           */.  ch
b040: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
b050: 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
b060: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
b070: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
b080: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
b090: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
b0a0: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
b0b0: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
b0c0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
b0d0: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
b0e0: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
b0f0: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
b100: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
b110: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
b120: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
b130: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
b140: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70  */.  IdList *pOp
b150: 65 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f 50  enTemp = 0;/* OP
b160: 5f 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65  _OpenTemp opcode
b170: 73 20 74 68 61 74 20 6e 65 65 64 20 61 20 4b 65  s that need a Ke
b180: 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  yInfo */.  int a
b190: 41 64 64 72 5b 35 5d 3b 20 20 20 20 20 20 20 20  Addr[5];        
b1a0: 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 6f 66   /* Addresses of
b1b0: 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f   SetNumColumns o
b1c0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
b1d0: 74 20 6e 41 64 64 72 20 3d 20 30 3b 20 20 20 20  t nAddr = 0;    
b1e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 73      /* Number us
b1f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ed */.  int nCol
b200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b210: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b220: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
b230: 20 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61   set */..  /* Ma
b240: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
b250: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
b260: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
b270: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
b280: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
b290: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
b2a0: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
b2b0: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
b2c0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
b2d0: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
b2e0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
b2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
b300: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
b310: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
b320: 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  }.  pPrior = p->
b330: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50  pPrior;.  if( pP
b340: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
b350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b360: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
b370: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
b380: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
b390: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
b3a0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
b3b0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
b3c0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
b3d0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b3e0: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
b3f0: 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c  ior->nLimit>=0 |
b400: 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65  | pPrior->nOffse
b410: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
b420: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b430: 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
b440: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
b450: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
b460: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
b470: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
b480: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
b490: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
b4a0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
b4b0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
b4c0: 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65   a valid query e
b4d0: 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20  ngine.  If not, 
b4e0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
b4f0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
b500: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b510: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
b520: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
b530: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b540: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
b550: 20 2f 2a 20 49 66 20 2a 70 20 74 68 69 73 20 69   /* If *p this i
b560: 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
b570: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
b580: 74 2c 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69  t, then initiali
b590: 7a 65 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70 65  ze.  ** p->ppOpe
b5a0: 6e 54 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20 74  nTemp to point t
b5b0: 6f 20 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49 66  o pOpenTemp.  If
b5c0: 20 2a 70 20 69 73 20 6e 6f 74 20 74 68 65 20 72   *p is not the r
b5d0: 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight most.  ** s
b5e0: 74 61 74 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d  tatement then p-
b5f0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c 6c  >ppOpenTemp will
b600: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
b610: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 20  en initialized. 
b620: 20 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20 63   ** by a prior c
b630: 61 6c 6c 20 74 6f 20 74 68 69 73 20 73 61 6d 65  all to this same
b640: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 50 61 73   procedure.  Pas
b650: 73 20 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70 65  s along the pOpe
b660: 6e 54 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e 74  nTemp.  ** point
b670: 65 72 20 74 6f 20 70 50 72 69 6f 72 2c 20 74 68  er to pPrior, th
b680: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
b690: 20 74 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20   to our left..  
b6a0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f 70  */.  if( p->ppOp
b6b0: 65 6e 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  enTemp==0 ){.   
b6c0: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d   p->ppOpenTemp =
b6d0: 20 26 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d   &pOpenTemp;.  }
b6e0: 0a 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65  .  pPrior->ppOpe
b6f0: 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65  nTemp = p->ppOpe
b700: 6e 54 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72 65  nTemp;..  /* Cre
b710: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
b720: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
b730: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
b740: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
b750: 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
b760: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b770: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
b780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b790: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
b7a0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
b7b0: 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3d 3d   assert( nAddr==
b7c0: 30 20 29 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e  0 );.    aAddr[n
b7d0: 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  Addr++] = sqlite
b7e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b7f0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
b800: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65  iParm, 0);.    e
b810: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
b820: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
b830: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
b840: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
b850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b860: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
b870: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
b880: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
b890: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
b8a0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
b8b0: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69     pPrior->nLimi
b8c0: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
b8d0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e         pPrior->n
b8e0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
b8f0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  set;.        rc 
b900: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
b910: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
b920: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
b930: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
b940: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
b950: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
b960: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
b970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b980: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
b990: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
b9a0: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
b9b0: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
b9c0: 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
b9d0: 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
b9e0: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d     p->nLimit = -
b9f0: 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4f  1;.        p->nO
ba00: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
ba10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
ba20: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
ba30: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
ba40: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
ba50: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ba60: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
ba70: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ba80: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
ba90: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
baa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
bab0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
bac0: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
bad0: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
bae0: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
baf0: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
bb00: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
bb10: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
bb20: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
bb30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
bb40: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
bb50: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
bb60: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bb70: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
bb80: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
bb90: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
bba0: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
bbb0: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
bbc0: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
bbd0: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
bbe0: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
bbf0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
bc00: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
bc10: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
bc20: 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b  nLimit, nOffset;
bc30: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
bc40: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
bc50: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
bc60: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
bc70: 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68  pOrderBy;  /* Th
bc80: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
bc90: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
bca0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
bcb0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
bcc0: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
bcd0: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
bce0: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
bcf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
bd00: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d  t==priorOp && p-
bd10: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
bd20: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70  p->nLimit<0 && p
bd30: 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  ->nOffset==0 ){.
bd40: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
bd50: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
bd60: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
bd70: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
bd80: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
bd90: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
bda0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
bdb0: 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20  nTab = iParm;.  
bdc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bdd0: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
bde0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
bdf0: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
be00: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
be10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
be20: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
be30: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
be40: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
be50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
be60: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
be70: 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20  OrderBy .       
be80: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
be90: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
bea0: 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
beb0: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b   unionTab, 1) ){
bec0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bed0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
bee0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bef0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
bf00: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
bf10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bf20: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e   OP_OpenTemp, un
bf30: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
bf40: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
bf50: 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  K_ALL ){.       
bf60: 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
bf70: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
bf80: 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  p, addr);.      
bf90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bfa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
bfb0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
bfc0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
bfd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bfe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bff0: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
c000: 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  ta, unionTab, 1)
c010: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 09 61 73 73  ;.        }..ass
c020: 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f  ert( nAddr<sizeo
c030: 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28  f(aAddr)/sizeof(
c040: 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20  aAddr[0]) );.   
c050: 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72       aAddr[nAddr
c060: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
c070: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
c080: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f  NumColumns, unio
c090: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
c0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c0b0: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
c0c0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
c0d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c0e0: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
c0f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
c100: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c110: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
c120: 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
c130: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
c140: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
c150: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c160: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c170: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
c180: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
c190: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
c1a0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
c1b0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
c1c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
c1d0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
c1e0: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
c1f0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
c200: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
c210: 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e  N:   op = SRT_Un
c220: 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ion;    break;. 
c230: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
c240: 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52  ALL:     op = SR
c250: 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61  T_Table;    brea
c260: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
c270: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
c280: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
c290: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
c2a0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
c2b0: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69  = 0;.      nLimi
c2c0: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
c2d0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
c2e0: 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73   -1;.      nOffs
c2f0: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
c300: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
c310: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
c320: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c330: 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75  pParse, p, op, u
c340: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
c350: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
c360: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
c370: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
c380: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
c390: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
c3a0: 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
c3b0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66  p->nOffset = nOf
c3c0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
c3d0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
c3e0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d    p->iOffset = -
c3f0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  1;.      if( rc 
c400: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c410: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c420: 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
c430: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
c440: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
c450: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
c460: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
c470: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
c480: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
c490: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20   need..      */ 
c4a0: 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
c4b0: 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c  eDest!=priorOp |
c4c0: 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72  | unionTab!=iPar
c4d0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  m ){.        int
c4e0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
c4f0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
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 20 20 69 66 28  t );.        if(
c520: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
c530: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
c540: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
c550: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
c560: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
c570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c580: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
c590: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c5a0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
c5b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c5c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
c5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c5e0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
c5f0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
c600: 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  k);.        comp
c610: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
c620: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
c630: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
c640: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c650: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
c660: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
c670: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
c680: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
c690: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
c6a0: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
c6d0: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
c6e0: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
c710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
c720: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c730: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
c740: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c750: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
c770: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
c780: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
c790: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c7a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
c7b0: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
c7c0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
c7d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
c7e0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
c7f0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
c800: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c810: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
c820: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
c830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c840: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
c850: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
c860: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
c870: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
c880: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
c890: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  t;.      int nLi
c8a0: 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 20 20  mit, nOffset;.  
c8b0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
c8c0: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
c8d0: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
c8e0: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
c8f0: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
c900: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
c910: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
c920: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
c930: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
c940: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
c950: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
c960: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
c970: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
c980: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
c990: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
c9a0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
c9b0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
c9c0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
c9d0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
c9e0: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
c9f0: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
ca00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ca10: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
ca20: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ca30: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
ca40: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
ca50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ca60: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20  OpenTemp, tab1, 
ca70: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  0);.      rc = m
ca80: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65  ultiSelectOpenTe
ca90: 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b  mpAddr(p, addr);
caa0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
cab0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cac0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
cad0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
cae0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
caf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb00: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c  KeyAsData, tab1,
cb10: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
cb20: 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28  t( nAddr<sizeof(
cb30: 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41  aAddr)/sizeof(aA
cb40: 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  ddr[0]) );.     
cb50: 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20   aAddr[nAddr++] 
cb60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cb70: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
cb80: 6f 6c 75 6d 6e 73 2c 20 74 61 62 31 2c 20 30 29  olumns, tab1, 0)
cb90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cba0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
cbb0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
cbc0: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
cbd0: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
cbe0: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
cbf0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cc00: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
cc10: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
cc20: 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
cc30: 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b1, 0, 0, 0, aff
cc40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
cc50: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
cc60: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cc70: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
cc80: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
cc90: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
cca0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ccb0: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
ccc0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
ccd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cce0: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
ccf0: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ab2, 0);.      r
cd00: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
cd10: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
cd20: 64 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ddr);.      if( 
cd30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cd40: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
cd50: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
cd70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cd80: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
cd90: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
cda0: 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69  assert( nAddr<si
cdb0: 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65  zeof(aAddr)/size
cdc0: 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a  of(aAddr[0]) );.
cdd0: 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64        aAddr[nAdd
cde0: 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  r++] = sqlite3Vd
cdf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
ce00: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62  tNumColumns, tab
ce10: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  2, 0);.      p->
ce20: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
ce30: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
ce40: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
ce50: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
ce60: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
ce70: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
ce80: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
ce90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cea0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ceb0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
cec0: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  2, 0, 0, 0, aff)
ced0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
cee0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
cef0: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
cf00: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
cf10: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
cf20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
cf30: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
cf40: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
cf50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cf60: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
cf70: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
cf80: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
cf90: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
cfa0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
cfb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
cfc0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cfd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
cfe0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
cff0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  k ){.        gen
d000: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d010: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
d020: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
d030: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
d040: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d050: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
d060: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
d070: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d090: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
d0a0: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
d0b0: 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
d0c0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
d0d0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
d0e0: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
d0f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d100: 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20  _FullKey, tab1, 
d110: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d120: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d130: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
d140: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
d150: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
d160: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
d170: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
d180: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d190: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d1b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
d1c0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
d1f0: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
d200: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d210: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
d220: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d230: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d240: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d250: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d260: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
d270: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d280: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
d290: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
d2a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d2b0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d2c0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d2d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d2e0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
d2f0: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
d300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d310: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
d320: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
d330: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
d340: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
d350: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
d360: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
d370: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
d380: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
d390: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
d3a0: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
d3b0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d3c0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
d3d0: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
d3e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
d3f0: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
d400: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
d410: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d420: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
d430: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
d440: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
d450: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
d460: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
d470: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
d480: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d490: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d4a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d4b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d4c0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
d4d0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
d4e0: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
d4f0: 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c  bles.  */.  nCol
d500: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
d510: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41  xpr;.  while( nA
d520: 64 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64  ddr>0 ){.    nAd
d530: 64 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr--;.    sqlite
d540: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
d550: 20 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e   aAddr[nAddr], n
d560: 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Col);.  }..  /* 
d570: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
d580: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
d590: 20 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f   by either the O
d5a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
d5b0: 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65  r.  ** by any te
d5c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
d5d0: 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
d5e0: 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
d5f0: 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
d600: 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
d610: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
d620: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d630: 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20  s.  Invoke the. 
d640: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f   ** ORDER BY pro
d650: 63 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65  cessing if there
d660: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
d670: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
d680: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
d690: 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
d6a0: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
d6b0: 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
d6c0: 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
d6d0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
d6e0: 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
d6f0: 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
d700: 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
d710: 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
d720: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
d730: 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
d740: 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
d750: 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
d760: 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
d770: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
d780: 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70  pOrderBy || (pOp
d790: 65 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54  enTemp && pOpenT
d7a0: 65 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20  emp->nId>0) ){. 
d7b0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
d7e0: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
d7f0: 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
d800: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
d810: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
d820: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
d830: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
d840: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 3d 20  ->ppOpenTemp == 
d850: 26 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a 20 20  &pOpenTemp );.  
d860: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
d870: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
d880: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
d890: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
d8a0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
d8b0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
d8c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
d8d0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
d8e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d8f0: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
d900: 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65  fo->enc = pParse
d910: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  ->db->enc;.    p
d920: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
d930: 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  = nCol;..    for
d940: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
d950: 2b 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  +){.      pKeyIn
d960: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  fo->aColl[i] = m
d970: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
d980: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
d990: 0a 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79  .      if( !pKey
d9a0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
d9b0: 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  {.        pKeyIn
d9c0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
d9d0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
d9e0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
d9f0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
da00: 3b 20 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 69  ; pOpenTemp && i
da10: 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b  <pOpenTemp->nId;
da20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
da30: 20 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f   p3type = (i==0?
da40: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
da50: 46 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  FF:P3_KEYINFO);.
da60: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
da70: 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d   pOpenTemp->a[i]
da80: 2e 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  .idx;.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
daa0: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a  v, addr, (char *
dab0: 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79 70  )pKeyInfo, p3typ
dac0: 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
dad0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
dae0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
daf0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  xprList_item *pO
db00: 72 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d 3e  rderByTerm = p->
db10: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
db20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
db30: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
db40: 3b 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79 54  ; i++, pOrderByT
db50: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
db60: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
db70: 72 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78 70  rderByTerm->pExp
db80: 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  r;.        char 
db90: 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72 42  *zName = pOrderB
dba0: 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  yTerm->zName;.  
dbb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
dbc0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
dbd0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
dbe0: 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20  lumn<nCol );.   
dbf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 45       assert( !pE
dc00: 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
dc10: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
dc20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
dc30: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  pr->pColl = sqli
dc40: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
dc50: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
dc60: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -1);.        }el
dc70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45  se{.          pE
dc80: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b 65  xpr->pColl = pKe
dc90: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45 78  yInfo->aColl[pEx
dca0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  pr->iColumn];.  
dcb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dcc0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
dcd0: 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
dce0: 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  , v, p->pEList->
dcf0: 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
dd00: 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  arm);.    }..   
dd10: 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d 70 20   if( !pOpenTemp 
dd20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
dd30: 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55 4e 49   happens for UNI
dd40: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
dd50: 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c   BY */.      sql
dd60: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
dd70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d 75  );.    }.  }..mu
dd80: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
dd90: 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d 70 20    if( pOpenTemp 
dda0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
ddb0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65 6e  ListDelete(pOpen
ddc0: 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Temp);.  }.  p->
ddd0: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a  ppOpenTemp = 0;.
dde0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ddf0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
de00: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
de10: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
de20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
de30: 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  W./*.** Scan thr
de40: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
de50: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
de60: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
de70: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
de80: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
de90: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
dea0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
deb0: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
dec0: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
ded0: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
dee0: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
def0: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
df00: 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
df10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
df20: 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
df30: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
df40: 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
df50: 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
df60: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
df70: 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
df80: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
df90: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
dfa0: 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
dfb0: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
dfc0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
dfd0: 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
dfe0: 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
dff0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e000: 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
e010: 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
e020: 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
e030: 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
e040: 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
e050: 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
e060: 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
e070: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e080: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
e090: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e0a0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
e0b0: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
e0c0: 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
e0d0: 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
e0e0: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
e0f0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
e100: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
e110: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
e120: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
e130: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
e140: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e150: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
e160: 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
e170: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
e180: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
e190: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
e1a0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
e1b0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
e1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e1d0: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
e1e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
e1f0: 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
e200: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e210: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
e220: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
e230: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
e240: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
e250: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
e260: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
e270: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
e280: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
e290: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
e2a0: 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
e2b0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
e2c0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
e2d0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
e2e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65  lite3ExprDup(pNe
e2f0: 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
e300: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e310: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
e320: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
e330: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e340: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
e350: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e360: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
e370: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
e380: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
e390: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
e3a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45  pList);.      pE
e3b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
e3c0: 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
e3d0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
e3e0: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
e3f0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
e400: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
e410: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
e420: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
e430: 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
e440: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
e450: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
e460: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
e470: 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a  w->span);.    }.
e480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
e490: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
e4a0: 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
e4b0: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
e4c0: 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
e4d0: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
e4e0: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
e4f0: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
e500: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
e510: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
e520: 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70  c void .substExp
e530: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
e540: 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c  pList, int iTabl
e550: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
e560: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
e570: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e580: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
e590: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
e5a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
e5b0: 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
e5c0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
e5d0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
e5e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
e5f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e600: 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  VIEW) */..#ifnde
e610: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e620: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  EW./*.** This ro
e630: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
e640: 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
e650: 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
e660: 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
e670: 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
e680: 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
e690: 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
e6a0: 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
e6b0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
e6c0: 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
e6d0: 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
e6e0: 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
e6f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
e700: 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
e710: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
e720: 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
e730: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
e740: 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
e750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
e760: 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
e770: 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
e780: 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
e790: 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
e7a0: 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
e7b0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
e7c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e7d0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
e7e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
e7f0: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
e800: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
e810: 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
e820: 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
e830: 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
e840: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
e850: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
e860: 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
e870: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e880: 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
e890: 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
e8a0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
e8b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
e8c0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
e8d0: 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
e8e0: 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
e8f0: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
e900: 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
e910: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
e920: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
e930: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
e940: 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
e950: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
e960: 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
e970: 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
e980: 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
e990: 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
e9a0: 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
e9b0: 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
e9c0: 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
e9d0: 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
e9e0: 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
e9f0: 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
ea00: 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
ea10: 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
ea20: 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
ea30: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
ea40: 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
ea50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
ea60: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
ea70: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
ea80: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
ea90: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
eaa0: 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
eab0: 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
eac0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
ead0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
eae0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
eaf0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
eb00: 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
eb10: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
eb20: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
eb30: 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
eb40: 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
eb50: 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
eb60: 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
eb70: 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
eb80: 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
eb90: 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
eba0: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
ebb0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
ebc0: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
ebd0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
ebe0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
ebf0: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
ec00: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ec10: 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
ec20: 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
ec30: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
ec40: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
ec50: 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
ec60: 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
ec70: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
ec80: 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
ec90: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
eca0: 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
ecb0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
ecc0: 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
ecd0: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
ece0: 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
ecf0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ed00: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
ed10: 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
ed20: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
ed30: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
ed40: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
ed50: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
ed60: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
ed70: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
ed80: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
ed90: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
eda0: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
edb0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
edc0: 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
edd0: 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
ede0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
edf0: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
ee00: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
ee10: 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
ee20: 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
ee30: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ee40: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
ee50: 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
ee60: 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
ee70: 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
ee80: 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
ee90: 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
eea0: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
eeb0: 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ).**.** In this 
eec0: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
eed0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
eee0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
eef0: 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
ef00: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
ef10: 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
ef20: 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
ef30: 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
ef40: 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
ef50: 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
ef60: 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
ef70: 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
ef80: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
ef90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
efa0: 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
efb0: 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
efc0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
efd0: 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
efe0: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
eff0: 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
f000: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
f010: 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
f020: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f030: 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
f040: 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
f050: 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
f060: 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
f070: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
f080: 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
f090: 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
f0a0: 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
f0b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f0c0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
f0d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f0e0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
f0f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
f100: 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
f110: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
f120: 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
f130: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
f140: 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
f150: 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
f160: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
f170: 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
f180: 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
f190: 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
f1a0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
f1b0: 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
f1c0: 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
f1d0: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
f1e0: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
f1f0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
f200: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
f210: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
f220: 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
f230: 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
f240: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
f250: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
f260: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
f270: 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
f280: 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
f290: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
f2a0: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
f2b0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
f2c0: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
f2d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f2e0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
f2f0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
f300: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
f310: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
f320: 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
f330: 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
f340: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
f350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f360: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
f370: 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f390: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
f3a0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
f3b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
f3c0: 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
f3d0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  subquery */..  /
f3e0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
f3f0: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f400: 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
f410: 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
f420: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
f430: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
f440: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
f450: 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
f460: 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
f470: 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
f480: 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
f490: 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75  >a[iFrom];.  pSu
f4a0: 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
f4b0: 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
f4c0: 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
f4d0: 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
f4e0: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
f4f0: 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75  n 0;.  if( subqu
f500: 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
f510: 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
f520: 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d  n 0;.  pSubSrc =
f530: 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
f540: 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
f550: 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
f560: 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
f570: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
f580: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
f590: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  pSub->nLimit>=0)
f5a0: 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63   &&  (pSrc->nSrc
f5b0: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
f5c0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f5d0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44   }.  if( (p->isD
f5e0: 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c  istinct || p->nL
f5f0: 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71  imit>=0) && subq
f600: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
f610: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
f620: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
f630: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
f640: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
f650: 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
f660: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
f670: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
f680: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
f690: 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
f6a0: 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
f6b0: 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
f6c0: 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
f6d0: 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
f6e0: 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
f6f0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f700: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
f710: 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
f720: 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
f730: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
f740: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
f750: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
f760: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
f770: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
f780: 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
f790: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
f7a0: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
f7b0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
f7c0: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
f7d0: 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
f7e0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
f7f0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
f800: 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
f810: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
f820: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
f830: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
f840: 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
f850: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
f860: 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
f870: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
f880: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
f890: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
f8a0: 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
f8b0: 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
f8c0: 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
f8d0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
f8e0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
f8f0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
f900: 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
f910: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
f920: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
f930: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
f940: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f950: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
f960: 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
f970: 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
f980: 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
f990: 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
f9a0: 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
f9b0: 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
f9c0: 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
f9d0: 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
f9e0: 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
f9f0: 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
fa00: 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
fa10: 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
fa20: 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
fa30: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
fa40: 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
fa50: 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
fa60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
fa70: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
fa80: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
fa90: 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
faa0: 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
fab0: 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
fac0: 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
fad0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
fae0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
faf0: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
fb00: 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
fb10: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
fb20: 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
fb30: 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
fb40: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
fb50: 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
fb60: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
fb70: 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
fb80: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
fb90: 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
fba0: 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
fbb0: 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
fbc0: 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
fbd0: 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
fbe0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
fbf0: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
fc00: 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
fc10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
fc20: 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
fc30: 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
fc40: 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
fc50: 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
fc60: 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
fc70: 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
fc80: 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
fc90: 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
fca0: 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
fcb0: 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
fcc0: 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
fcd0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
fce0: 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
fcf0: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
fd00: 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
fd10: 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
fd20: 6e 74 79 70 65 3b 0a 20 20 20 20 54 61 62 6c 65  ntype;.    Table
fd30: 20 2a 70 54 61 62 20 3d 20 70 53 75 62 69 74 65   *pTab = pSubite
fd40: 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  m->pTab;..    if
fd50: 28 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  ( pTab && pTab->
fd60: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
fd70: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
fd80: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69  teTable(0, pSubi
fd90: 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
fda0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
fdb0: 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61  (pSubitem->zData
fdc0: 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
fdd0: 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
fde0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
fdf0: 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
fe00: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  >zAlias);.    if
fe10: 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
fe20: 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
fe30: 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
fe40: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
fe50: 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
fe60: 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
fe70: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
fe80: 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
fe90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
fea0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
feb0: 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
fec0: 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
fed0: 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
fee0: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
fef0: 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
ff00: 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
ff10: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
ff20: 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
ff30: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
ff40: 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
ff50: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
ff60: 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
ff70: 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
ff80: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
ff90: 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
ffa0: 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
ffb0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
ffc0: 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
ffd0: 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
ffe0: 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
fff0: 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
10000 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
10010 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
10020 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
10030 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
10040 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
10050 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
10060 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
10070 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
10080 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
10090 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
100a0 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
100d0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
100e0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
100f0 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
10100 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10110 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
10120 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10130 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
10140 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
10150 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
10160 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
10170 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
10180 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
10190 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
101a0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
101b0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
101c0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
101d0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
101e0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
101f0 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
10200 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10210 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
10220 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
10230 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
10240 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
10250 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
10260 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
10270 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
10280 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
10290 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
102a0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
102b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
102c0 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
102d0 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
102e0 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
102f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
10300 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
10310 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
10320 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
10330 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
10340 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
10350 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
10360 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
10370 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
10380 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
10390 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
103a0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
103b0 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
103c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
103d0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
103e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
103f0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
10400 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10410 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
10420 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10430 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
10440 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
10450 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
10460 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
10470 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65  pWhere);.  }else
10480 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
10490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
104a0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
104b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
104c0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
104d0 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
104e0 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
104f0 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
10500 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
10510 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
10520 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
10530 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
10540 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
10550 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69  p->pHaving, sqli
10560 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
10570 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20  >pHaving));.    
10580 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
10590 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
105a0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
105b0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
105c0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
105d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
105e0 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
105f0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10600 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
10610 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
10620 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
10630 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d  re, pWhere);.  }
10640 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74  ..  /* The flatt
10650 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
10660 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
10670 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
10680 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65  e.  ** outer que
10690 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
106a0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73  .  */.  p->isDis
106b0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
106c0 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
106d0 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
106e0 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69   Transfer the li
106f0 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66  mit expression f
10700 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
10710 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20   to the outer.  
10720 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ** query..  */. 
10730 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
10740 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
10750 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
10760 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
10770 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
10780 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
10790 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
107a0 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
107b0 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
107c0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
107d0 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
107e0 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
107f0 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
10800 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
10810 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
10820 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69  Offset;..  /* Fi
10830 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
10840 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
10850 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
10860 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
10870 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
10880 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
10890 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
108a0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
108b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
108c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
108d0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
108e0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
108f0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
10900 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
10910 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
10920 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
10930 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
10940 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
10950 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
10960 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
10970 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
10980 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
10990 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
109a0 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
109b0 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
109c0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
109d0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
109e0 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
109f0 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
10a00 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
10a10 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
10a20 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
10a30 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
10a40 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
10a50 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
10a60 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
10a70 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
10a80 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
10a90 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
10aa0 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
10ab0 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
10ac0 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
10ad0 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
10ae0 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
10af0 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
10b00 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
10b10 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
10b20 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
10b30 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
10b40 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
10b50 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
10b60 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
10b70 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
10b80 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
10b90 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
10ba0 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
10bb0 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
10bc0 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
10bd0 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ite3Select()..**
10be0 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
10bf0 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
10c00 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
10c10 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
10c20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
10c30 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  t simpleMinMaxQu
10c40 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
10c50 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
10c60 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
10c70 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm){.  Expr *pEx
10c80 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
10c90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
10ca0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
10cb0 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
10cc0 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
10cd0 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
10ce0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10cf0 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74  t, *pList, eList
10d00 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
10d10 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
10d20 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  em;.  SrcList *p
10d30 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  Src;..  /* Check
10d40 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
10d50 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
10d60 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
10d70 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
10d80 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
10d90 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
10da0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
10db0 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
10dc0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
10dd0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
10de0 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
10df0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
10e00 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
10e10 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
10e20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
10e30 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
10e40 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
10e50 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
10e60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
10e70 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
10e80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
10e90 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
10ea0 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
10eb0 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
10ec0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
10ed0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
10ee0 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
10ef0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
10f00 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78  ite3StrNICmp(pEx
10f10 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
10f20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
10f30 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
10f40 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
10f50 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
10f60 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
10f70 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
10f80 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
10f90 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
10fa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10fb0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
10fc0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
10fd0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
10fe0 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10ff0 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
11000 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
11010 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
11020 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
11030 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
11040 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
11050 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
11060 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
11070 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
11080 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
11090 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
110a0 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
110b0 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
110c0 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
110d0 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
110e0 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
110f0 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
11100 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
11110 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
11120 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
11130 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
11140 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
11150 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
11160 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
11170 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
11180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
11190 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
111a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
111b0 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
111c0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
111d0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
111e0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
111f0 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
11200 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
11210 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
11220 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
11230 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64  [0]==iCol && pId
11240 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11250 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65  [0]==pColl ) bre
11260 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11270 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
11280 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
11290 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
112a0 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
112b0 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
112c0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
112d0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
112e0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
112f0 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
11300 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
11310 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
11320 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
11330 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
11340 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
11350 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
11360 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
11370 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11380 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
11390 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
113a0 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
113b0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
113c0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
113d0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
113e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
113f0 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
11400 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
11410 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11420 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
11430 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
11440 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11450 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
11460 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
11470 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
11480 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
11490 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
114a0 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
114b0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
114c0 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
114d0 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
114e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
114f0 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
11500 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
11510 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
11520 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
11530 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
11540 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
11550 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
11560 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
11570 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11580 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
11590 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
115a0 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53  Db);.  base = pS
115b0 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
115c0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
115d0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
115e0 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63  , p);.  if( pSrc
115f0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
11600 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11610 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64  OpenTableForRead
11620 69 6e 67 28 76 2c 20 62 61 73 65 2c 20 70 54 61  ing(v, base, pTa
11630 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d  b);.  }.  cont =
11640 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11650 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
11660 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
11670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11680 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
11690 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
116a0 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
116b0 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
116c0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
116d0 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
116e0 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
116f0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
11700 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
11710 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
11720 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
11730 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
11740 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
11750 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
11760 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
11770 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
11780 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
11790 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
117a0 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
117b0 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
117c0 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
117d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
117e0 20 69 49 64 78 3b 0a 20 20 20 20 69 49 64 78 20   iIdx;.    iIdx 
117f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11810 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
11820 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
11830 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11840 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
11850 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49  enRead, iIdx, pI
11860 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx->tnum,.      
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11880 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e  ar*)&pIdx->keyIn
11890 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
118a0 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d  .    if( seekOp=
118b0 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20  =OP_Rewind ){.  
118c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
118d0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
118e0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
118f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11900 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
11910 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 1, 0);.      
11920 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65  seekOp = OP_Move
11930 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Gt;.    }.    sq
11940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11950 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20  , seekOp, iIdx, 
11960 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11970 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11980 64 78 52 65 63 6e 6f 2c 20 69 49 64 78 2c 20 30  dxRecno, iIdx, 0
11990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
119a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
119b0 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ose, iIdx, 0);. 
119c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
119d0 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
119e0 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
119f0 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
11a00 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
11a10 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
11a20 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
11a30 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
11a40 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
11a50 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
11a60 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  r;.  selectInner
11a70 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11a80 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
11a90 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
11aa0 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30  m, cont, cont, 0
11ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11ac0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11ad0 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
11ae0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11af0 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
11b00 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
11b10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
11b20 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
11b30 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11b40 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
11b50 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
11b60 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
11b70 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
11b80 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
11b90 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
11ba0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
11bb0 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
11bc0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
11bd0 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
11be0 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
11bf0 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
11c00 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
11c10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
11c20 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
11c30 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
11c40 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
11c50 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
11c60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11c70 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
11c80 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
11c90 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
11ca0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f  * The ORDER BY o
11cb0 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
11cc0 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65  e to be processe
11cd0 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  d */.  SrcList *
11ce0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
11cf0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
11d00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11d10 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  EList,     /* Th
11d20 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
11d30 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
11d40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11d50 69 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  if aggregate fun
11d60 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f 6c  ctions are invol
11d70 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ved */.  const c
11d80 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f  har *zType     /
11d90 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22  * Either "ORDER"
11da0 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20   or "GROUP", as 
11db0 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29  appropriate */.)
11dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
11dd0 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
11de0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
11df0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
11e00 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11e10 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
11e20 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
11e30 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
11e40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11e50 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11e60 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
11e70 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
11e80 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11e90 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11ea0 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 70  ete(pE);.      p
11eb0 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
11ec0 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
11ed0 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  e3ExprDup(pEList
11ee0 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
11ef0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
11f00 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
11f10 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65  olveNames(pParse
11f20 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11f30 73 74 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 31  st, pE, isAgg, 1
11f40 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
11f50 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
11f60 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
11f70 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
11f80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11f90 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11fa0 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a  E, &iCol)==0 ){.
11fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11fc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
11fd0 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59            "%s BY
11fe0 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
11ff0 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
12000 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65  onstants", zType
12010 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12020 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
12030 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
12040 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
12050 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
12060 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12070 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
12080 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20    "%s BY column 
12090 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66  number %d out of
120a0 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
120b0 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
120c0 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
120d0 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c  d", zType, iCol,
120e0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
120f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12100 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12110 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
12130 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
12140 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
12150 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
12160 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
12170 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
12180 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
12190 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
121a0 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
121b0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
121c0 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
121d0 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
121e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
121f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
12220 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
12230 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
12240 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
12250 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
12260 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
12270 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
12280 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
12290 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
122a0 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
122b0 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
122c0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
122d0 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20  s keys of table 
122e0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
122f0 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
12300 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
12310 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
12320 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
12330 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
12340 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d  _Except      Rem
12350 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  ove results from
12360 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
12370 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  able iParm..**.*
12380 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
12390 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
123a0 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
123b0 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
123c0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f  ** The table abo
123d0 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65  ve is incomplete
123e0 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44  .  Additional eD
123f0 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62  ist value have b
12400 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65  e added.** since
12410 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61   this comment wa
12420 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20  s written.  See 
12430 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  the selectInnerL
12440 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  oop() function f
12450 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65  or.** a complete
12460 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
12470 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
12480 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
12490 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
124a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
124b0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
124c0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
124d0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
124e0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
124f0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
12500 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
12510 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
12520 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
12530 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12540 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
12550 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
12560 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
12570 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
12580 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
12590 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
125a0 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
125b0 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
125c0 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
125d0 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
125e0 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
125f0 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
12600 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
12610 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
12620 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
12630 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
12640 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
12650 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
12660 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
12670 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
12680 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
12690 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
126a0 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
126b0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
126c0 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
126d0 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
126e0 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
126f0 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
12700 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
12710 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
12720 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
12730 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
12740 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
12750 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
12760 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
12770 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
12780 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
12790 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
127c0 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
127d0 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
12820 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12830 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
12840 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12850 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
12860 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12870 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
12880 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
12890 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
128a0 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
128b0 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
128c0 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
128d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
128e0 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
128f0 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
12900 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
12910 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
12920 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
12930 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
12940 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
12950 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12960 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
12970 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
12980 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
12990 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
129a0 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
129b0 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
129c0 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
129d0 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
129e0 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
129f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
12a00 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
12a10 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12a20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
12a30 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12a40 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12a50 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
12a60 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
12a70 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20  coded. */.  int 
12a80 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
12a90 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
12aa0 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
12ab0 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
12ac0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
12ad0 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75  /* A parameter u
12ae0 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74  sed by the eDest
12af0 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
12b00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
12b10 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  arent,       /* 
12b20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66  Another SELECT f
12b30 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
12b40 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a   a sub-query */.
12b50 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c    int parentTab,
12b60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12b70 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53  x in pParent->pS
12b80 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79  rc of this query
12b90 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65   */.  int *pPare
12ba0 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20  ntAgg,       /* 
12bb0 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
12bc0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
12bd0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  unctions */.  ch
12be0 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
12bf0 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
12c00 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
12c10 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
12c20 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ng */.){.  int i
12c30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
12c40 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76  WInfo;.  Vdbe *v
12c50 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20  ;.  int isAgg = 
12c60 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
12c70 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
12c80 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
12c90 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
12ca0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
12cb0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
12cc0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
12cd0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
12ce0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
12cf0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
12d00 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
12d10 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
12d20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
12d30 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
12d40 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
12d50 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
12d60 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
12d70 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
12d80 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12d90 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
12da0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
12db0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
12dc0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
12dd0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
12de0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
12df0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
12e00 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12e10 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
12e20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
12e30 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
12e40 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
12e50 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
12e60 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
12e70 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
12e80 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
12e90 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
12ea0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
12eb0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
12ec0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
12ed0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  tion */..  if( s
12ee0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
12ef0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
12f00 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
12f10 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
12f20 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12f30 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
12f40 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
12f50 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 23 69 66  ) return 1;..#if
12f60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12f70 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12f80 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
12f90 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
12fa0 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
12fb0 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
12fc0 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
12fd0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
12fe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ff0 4d 49 54 5f 43 55 52 53 4f 52 0a 20 20 20 20 69  MIT_CURSOR.    i
13000 66 28 20 70 2d 3e 70 46 65 74 63 68 20 29 7b 0a  f( p->pFetch ){.
13010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13020 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
13030 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65  ursors cannot be
13040 20 75 73 65 64 20 6f 6e 20 63 6f 6d 70 6f 75 6e   used on compoun
13050 64 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20  d queries");.   
13060 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13070 6e 64 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  nd;.    }.#endif
13080 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
13090 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
130a0 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
130b0 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   aff);.  }.#endi
130c0 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63  f..  /* Make loc
130d0 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  al copies of the
130e0 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20   parameters for 
130f0 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f  this query..  */
13100 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
13110 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20  >pSrc;.  pWhere 
13120 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
13130 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
13140 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42  derBy;.  pGroupB
13150 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
13160 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
13170 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
13180 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
13190 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 0a 20 20  tinct;..  /* .  
131a0 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
131b0 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
131c0 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
131d0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
131e0 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
131f0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
13200 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
13210 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
13220 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
13230 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 69 66 28 20  ect_end;..  if( 
13240 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
13250 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
13260 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13270 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d  ;.  }.  pWhere =
13280 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45   p->pWhere;.  pE
13290 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
132a0 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
132b0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
132c0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
132d0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
132e0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
132f0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
13300 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
13310 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
13320 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  /.  if( (eDest==
13330 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
13340 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
13350 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
13360 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13370 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
13380 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
13390 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
133a0 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
133b0 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
133c0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
133d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
133e0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
133f0 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
13400 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64  nored for some d
13410 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a  estinations..  *
13420 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  /.  switch( eDes
13430 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
13440 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73  T_Union:.    cas
13450 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20  e SRT_Except:.  
13460 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61    case SRT_Disca
13470 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72  rd:.      pOrder
13480 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  By = 0;.      br
13490 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
134a0 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
134b0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
134c0 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c   point, we shoul
134d0 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  d have allocated
134e0 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73   all the cursors
134f0 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65   that we.  ** ne
13500 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62  ed to handle sub
13510 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f  querys and tempo
13520 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20  rary tables.  . 
13530 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65   **.  ** Resolve
13540 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
13550 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e  s and do a seman
13560 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c  tics check on al
13570 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  l the expression
13580 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
13590 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
135a0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
135b0 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d  pr *pX = pEList-
135c0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
135d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
135e0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61  ResolveNames(pPa
135f0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30  rse, pTabList, 0
13600 2c 20 70 58 2c 20 31 2c 20 31 29 20 29 7b 0a 20  , pX, 1, 1) ){. 
13610 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13620 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
13630 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
13640 72 74 79 28 70 58 2c 20 45 50 5f 41 67 67 29 20  rty(pX, EP_Agg) 
13650 29 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d  ) isAgg = 1;.  }
13660 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
13670 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70  prResolveNames(p
13680 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
13690 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65 2c   pEList, pWhere,
136a0 20 30 2c 20 31 29 20 29 7b 0a 20 20 20 20 67 6f   0, 1) ){.    go
136b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
136c0 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
136d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   ){.    if( pGro
136e0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
136f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13700 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
13710 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
13720 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
13730 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67  AVING");.      g
13740 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13750 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
13760 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
13770 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
13780 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
13790 70 48 61 76 69 6e 67 2c 20 31 2c 20 31 29 20 29  pHaving, 1, 1) )
137a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
137b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
137c0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
137d0 6f 70 65 72 74 79 28 70 48 61 76 69 6e 67 2c 20  operty(pHaving, 
137e0 45 50 5f 41 67 67 29 20 29 20 69 73 41 67 67 20  EP_Agg) ) isAgg 
137f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
13800 47 72 6f 75 70 42 79 20 26 26 20 21 69 73 41 67  GroupBy && !isAg
13810 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
13820 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13830 20 22 47 52 4f 55 50 20 42 59 20 6d 61 79 20 6f   "GROUP BY may o
13840 6e 6c 79 20 62 65 20 75 73 65 64 20 6f 6e 20 61  nly be used on a
13850 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
13860 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
13870 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
13880 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  f( processOrderG
13890 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
138a0 4f 72 64 65 72 42 79 2c 20 70 54 61 62 4c 69 73  OrderBy, pTabLis
138b0 74 2c 20 70 45 4c 69 73 74 2c 20 69 73 41 67 67  t, pEList, isAgg
138c0 2c 20 22 4f 52 44 45 52 22 29 0a 20 20 20 7c 7c  , "ORDER").   ||
138d0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
138e0 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 47 72  upBy(pParse, pGr
138f0 6f 75 70 42 79 2c 20 70 54 61 62 4c 69 73 74 2c  oupBy, pTabList,
13900 20 70 45 4c 69 73 74 2c 20 69 73 41 67 67 2c 20   pEList, isAgg, 
13910 22 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a 20 20  "GROUP").  ){.  
13920 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13930 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  d;.  }..  /* We 
13940 63 61 6e 6e 6f 74 20 75 73 65 20 61 20 53 51 4c  cannot use a SQL
13950 20 63 75 72 73 6f 72 20 6f 6e 20 61 20 6a 6f 69   cursor on a joi
13960 6e 20 6f 72 20 6f 6e 20 61 20 44 49 53 54 49 4e  n or on a DISTIN
13970 43 54 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  CT query.  */.#i
13980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13990 54 5f 43 55 52 53 4f 52 0a 20 20 69 66 28 20 70  T_CURSOR.  if( p
139a0 2d 3e 70 46 65 74 63 68 20 29 7b 0a 20 20 20 20  ->pFetch ){.    
139b0 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  if( p->isDistinc
139c0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
139d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
139e0 65 2c 20 22 63 75 72 73 6f 72 73 20 63 61 6e 6e  e, "cursors cann
139f0 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 44 49  ot be used on DI
13a00 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 22 29  STINCT queries")
13a10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
13a20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
13a30 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
13a40 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20  >nSrc>0 ){.     
13a50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13a60 28 70 50 61 72 73 65 2c 20 22 63 75 72 73 6f 72  (pParse, "cursor
13a70 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  s cannot be used
13a80 20 6f 6e 20 6a 6f 69 6e 73 22 29 3b 0a 20 20 20   on joins");.   
13a90 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13aa0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
13ab0 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  ( pTabList->a[0]
13ac0 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  .pSelect ){.    
13ad0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13ae0 67 28 70 50 61 72 73 65 2c 20 22 63 75 72 73 6f  g(pParse, "curso
13af0 72 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  r cannot be used
13b00 20 77 69 74 68 20 6e 65 73 74 65 64 20 71 75 65   with nested que
13b10 72 69 65 73 20 22 0a 20 20 20 20 20 20 20 20 20  ries ".         
13b20 20 22 6f 72 20 76 69 65 77 73 22 29 3b 0a 20 20   "or views");.  
13b30 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13b40 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  end;.    }.  }.#
13b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
13b60 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
13b70 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
13b80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13b90 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
13ba0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
13bb0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
13bc0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
13bd0 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
13be0 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
13bf0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
13c00 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
13c10 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
13c20 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
13c30 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
13c40 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
13c50 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
13c60 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
13c70 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
13c80 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
13c90 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
13ca0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13cb0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
13cc0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
13cd0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
13ce0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
13cf0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
13d00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13d10 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
13d20 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
13d30 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
13d40 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61  xt;..    if( pTa
13d50 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
13d60 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
13d70 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  e;.    if( pTabL
13d80 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21  ist->a[i].zName!
13d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76  =0 ){.      zSav
13da0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
13db0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
13dc0 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72  text;.      pPar
13dd0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
13de0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
13df0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ].zName;.      n
13e00 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
13e10 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
13e20 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  {.      needRest
13e30 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  oreContext = 0;.
13e40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13e50 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
13e60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
13e70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70  Select, SRT_Temp
13e80 54 61 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  Table, .        
13e90 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73           pTabLis
13ea0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c  t->a[i].iCursor,
13eb0 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30   p, i, &isAgg, 0
13ec0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52  );.    if( needR
13ed0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b  estoreContext ){
13ee0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
13ef0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
13f00 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
13f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
13f20 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
13f30 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
13f40 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65  Where;.    if( e
13f50 44 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest!=SRT_Union 
13f60 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  && eDest!=SRT_Ex
13f70 63 65 70 74 20 26 26 20 65 44 65 73 74 21 3d 53  cept && eDest!=S
13f80 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a 20 20  RT_Discard ){.  
13f90 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
13fa0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
13fb0 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  }.    pGroupBy =
13fc0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
13fd0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
13fe0 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69  Having;.    isDi
13ff0 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
14000 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f  stinct;.  }..  /
14010 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
14020 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
14030 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
14040 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73   function by its
14050 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  elf.  ** in the 
14060 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f  result set..  */
14070 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
14080 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
14090 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
140a0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  ) ){.    rc = 0;
140b0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
140c0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
140d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
140e0 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
140f0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
14100 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
14110 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
14120 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
14130 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
14140 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
14150 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
14160 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
14170 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
14180 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
14190 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
141a0 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
141b0 72 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ry(pParse, pPare
141c0 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
141d0 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
141e0 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
141f0 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
14200 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  g = 1;.    retur
14210 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
14220 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
14230 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
14240 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20 61  lause, resolve a
14250 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
14260 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65  uences.  ** name
14270 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
14280 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
14290 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ified..  */.  if
142a0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
142b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
142c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
142d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
142e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61  rderBy->a[i].zNa
142f0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  me ){.        pO
14300 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14310 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20 20  pr->pColl = .   
14320 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14330 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
14340 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
14350 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b  a[i].zName, -1);
14360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14370 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
14380 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
14390 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
143a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
143b0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
143c0 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
143d0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
143e0 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  se, p);..  /* If
143f0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
14400 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
14410 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
14420 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
14430 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
14440 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
14450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14460 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
14470 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
14480 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14490 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
144a0 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61  tNumColumns, iPa
144b0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
144c0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  r);.  }..  /* Do
144d0 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
144e0 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
144f0 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  sions..  */.  sq
14500 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
14510 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
14520 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70    if( isAgg || p
14530 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61  GroupBy ){.    a
14540 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
14550 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73  Agg==0 );.    is
14560 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  Agg = 1;.    for
14570 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
14580 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
145a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
145b0 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69  tes(pParse, pELi
145c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
145d0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
145e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
145f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14600 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
14610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14620 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
14630 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
14640 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
14650 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
14660 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
14670 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
14680 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
14690 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
146a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
146b0 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
146c0 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
146d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
146e0 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  es(pParse, pHavi
146f0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
14700 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
14710 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
14720 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
14730 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
14740 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
14750 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14760 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
14770 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
14780 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14790 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
147a0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
147b0 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
147c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
147d0 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65  ..  /* Reset the
147e0 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f   aggregator.  */
147f0 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
14800 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
14810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14820 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20  v, OP_AggReset, 
14830 28 70 47 72 6f 75 70 42 79 3f 30 3a 31 29 2c 20  (pGroupBy?0:1), 
14840 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
14850 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
14860 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
14870 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
14880 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66  *pFunc;.      if
14890 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73  ( (pFunc = pPars
148a0 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63  e->aAgg[i].pFunc
148b0 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78  )!=0 && pFunc->x
148c0 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
148d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
148e0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 49  beOp3(v, OP_AggI
148f0 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61 72  nit, 0, i, (char
14900 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  *)pFunc, P3_FUNC
14910 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DEF);.      }.  
14920 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
14930 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
14940 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 4b 65  t sz = sizeof(Ke
14950 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f 75 70 42  yInfo) + pGroupB
14960 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  y->nExpr*sizeof(
14970 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 20 20 20  CollSeq*);.     
14980 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
14990 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69   (KeyInfo *)sqli
149a0 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  teMalloc(sz);.  
149b0 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65 79 20      if( 0==pKey 
149c0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
149d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
149e0 20 20 7d 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e    }.      pKey->
149f0 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
14a00 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 70 4b 65  ->enc;.      pKe
14a10 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 47 72 6f  y->nField = pGro
14a20 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
14a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
14a40 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
14a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
14a60 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
14a70 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
14a80 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
14a90 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
14aa0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4b 65          if( !pKe
14ab0 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  y->aColl[i] ){. 
14ac0 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61           pKey->a
14ad0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65  Coll[i] = pParse
14ae0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
14af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14b00 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14b10 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
14b20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29 70 4b  addr, (char *)pK
14b30 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
14b40 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20  ANDOFF);.    }. 
14b50 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
14b60 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
14b70 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
14b80 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
14b90 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
14ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14bb0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
14bc0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
14bd0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14be0 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
14bf0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  1);.  }..  /* Op
14c00 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  en a temporary t
14c10 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
14c20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
14c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
14c40 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64  istinct ){.    d
14c50 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
14c60 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 6f 70  ->nTab++;.    op
14c70 65 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61 72  enTempIndex(pPar
14c80 73 65 2c 20 70 2c 20 64 69 73 74 69 6e 63 74 2c  se, p, distinct,
14c90 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
14ca0 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
14cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
14cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
14cd0 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  an.  */.  pWInfo
14ce0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
14cf0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
14d00 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 0a 20  bList, pWhere,. 
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 70 47 72 6f              pGro
14d30 75 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64  upBy ? 0 : &pOrd
14d40 65 72 42 79 2c 20 70 2d 3e 70 46 65 74 63 68 29  erBy, p->pFetch)
14d50 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
14d60 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
14d70 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74  end;..  /* Use t
14d80 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
14d90 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65  r loop if we are
14da0 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74   not dealing wit
14db0 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  h.  ** aggregate
14dc0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  s.  */.  if( !is
14dd0 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Agg ){.    if( s
14de0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
14df0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
14e00 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
14e10 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
14e20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14e30 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
14e40 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
14e50 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
14e60 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20   aff) ){.       
14e70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14e90 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   If we are deali
14ea0 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74  ng with aggregat
14eb0 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  es, then do the 
14ec0 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74  special aggregat
14ed0 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  e.  ** processin
14ee0 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  g.  .  */.  else
14ef0 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 70  {.    AggExpr *p
14f00 41 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72  Agg;.    if( pGr
14f10 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
14f20 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66  nt lbl1;.      f
14f30 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
14f40 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
14f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14f60 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14f70 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
14f80 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
14f90 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69        /* No affi
14fa0 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61  nity string is a
14fb0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66  ttached to the f
14fc0 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65  ollowing OP_Make
14fd0 52 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a  Record .      **
14fe0 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e   because we do n
14ff0 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e  ot need to do an
15000 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61  y coercion of da
15010 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20  tatypes. */.    
15020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15030 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
15040 6f 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  ord, pGroupBy->n
15050 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
15060 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64  lbl1 = sqlite3Vd
15070 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15090 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
150a0 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b  Focus, 0, lbl1);
150b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
150c0 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67  pAgg=pParse->aAg
150d0 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  g; i<pParse->nAg
150e0 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b  g; i++, pAgg++){
150f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67  .        if( pAg
15100 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  g->isAgg ) conti
15110 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
15120 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15130 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72  rse, pAgg->pExpr
15140 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15150 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15160 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b  P_AggSet, 0, i);
15170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15180 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15190 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b  eLabel(v, lbl1);
151a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
151b0 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d  =0, pAgg=pParse-
151c0 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d  >aAgg; i<pParse-
151d0 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67  >nAgg; i++, pAgg
151e0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
151f0 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  *pE;.      int n
15200 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e 63  Expr;.      Func
15210 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
15220 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41 67   if( !pAgg->isAg
15230 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
15240 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
15250 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20  ->pFunc!=0 );.  
15260 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
15270 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d  ->pFunc->xStep!=
15280 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  0 );.      pDef 
15290 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20  = pAgg->pFunc;. 
152a0 20 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d 3e       pE = pAgg->
152b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
152c0 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
152d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
152e0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
152f0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  ION );.      nEx
15300 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
15310 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
15320 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b  rse, pE->pList);
15330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15340 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
15350 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
15360 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
15370 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
15380 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
15390 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oll = 0;.       
153a0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
153b0 66 6f 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20  for(j=0; !pColl 
153c0 26 26 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  && j<nExpr; j++)
153d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
153e0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
153f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15400 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
15410 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
15420 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
15430 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
15440 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
15450 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  oll;.        sql
15460 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
15470 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
15480 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
15490 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
154a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
154b0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
154c0 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70  AggFunc, 0, nExp
154d0 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
154e0 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
154f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64   }.  }..  /* End
15500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
15510 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
15520 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
15530 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
15540 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73  f we are process
15550 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20  ing aggregates, 
15560 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75  we need to set u
15570 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a  p a second loop.
15580 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
15590 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76   the aggregate v
155a0 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73  alues and proces
155b0 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  s them..  */.  i
155c0 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
155d0 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c  int endagg = sql
155e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
155f0 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  l(v);.    int st
15600 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72  artagg;.    star
15610 74 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64  tagg = sqlite3Vd
15620 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
15630 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67  gNext, 0, endagg
15640 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75  );.    pParse->u
15650 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69  seAgg = 1;.    i
15660 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
15670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
15680 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
15690 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67  Having, startagg
156a0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
156b0 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
156c0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
156d0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
156e0 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
156f0 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
15700 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
15710 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64  m, startagg, end
15720 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  agg, aff) ){.   
15730 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15740 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
15750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15760 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
15770 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
15780 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15790 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b  abel(v, endagg);
157a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
157b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
157c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
157d0 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b  rse->useAgg = 0;
157e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
157f0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
15800 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
15810 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
15820 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
15830 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
15840 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
15850 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
15860 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
15870 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
15880 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
15890 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
158a0 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
158b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
158c0 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
158d0 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
158e0 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
158f0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
15900 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
15910 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20  ble.  So delete 
15920 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72  the subquery str
15930 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
15940 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70  parent.  ** to p
15950 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71  revent this subq
15960 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
15970 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
15980 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
15990 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
159a0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
159b0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
159c0 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
159d0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
159e0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
159f0 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
15a00 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
15a10 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
15a20 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
15a30 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15a40 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70  Delete(p);.    p
15a50 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
15a60 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
15a70 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
15a80 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
15a90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
15aa0 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
15ab0 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
15ac0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
15ad0 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
15ae0 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
15af0 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
15b00 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
15b10 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
15b20 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
15b30 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
15b40 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
15b50 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
15b60 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  ct_end:.  sqlite
15b70 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73  AggregateInfoRes
15b80 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  et(pParse);.  re
15b90 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.