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

Artifact 37b9ddb9688a98c521d092dc38c811ec72191b14:


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 34  select.c,v 1.224
0200: 20 32 30 30 35 2f 30 31 2f 31 38 20 30 34 3a 30   2005/01/18 04:0
0210: 30 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a  0:44 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 77 69 74  eturn 0;..  swit
5210: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
5220: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
5230: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62  UMN: {.      Tab
5240: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
5250: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
5260: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
5270: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
5280: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
5290: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
52a0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
52b0: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
52c0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
52d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
52e0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
52f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
5300: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5310: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
5320: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
5330: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
5340: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
5350: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
5360: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5370: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
5380: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
5390: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
53a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
53b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
53c0: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
53e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
53f0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 53 65 6c 65  CT: {.      Sele
5400: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
5410: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 7a  pSelect;.      z
5420: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
5430: 65 28 70 50 61 72 73 65 2c 20 70 53 2d 3e 70 53  e(pParse, pS->pS
5440: 72 63 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  rc, pS->pEList->
5450: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20  a[0].pExpr); .  
5460: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
5480: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 54 4b  .      /* The TK
5490: 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  _AS operator can
54a0: 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f   only occur in O
54b0: 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50 20 42  RDER BY, GROUP B
54c0: 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20 20 20 20  Y, HAVING,.     
54d0: 20 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c   ** and LIMIT cl
54e0: 61 75 73 65 73 2e 20 20 42 75 74 20 70 45 78 70  auses.  But pExp
54f0: 72 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20  r originates in 
5500: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
5510: 66 20 61 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  f a.      ** SEL
5520: 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20 63  ECT.  So pExpr c
5530: 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  an never contain
5540: 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72 2e   an AS operator.
5550: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5560: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
5570: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
5580: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  */.    default:.
5590: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b        zType = 0;
55a0: 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
55b0: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
55c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
55d0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
55e0: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
55f0: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
5600: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
5610: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
5620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
5630: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
5640: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5650: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
5660: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5670: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5680: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
5690: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
56a0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
56b0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
56c0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
56d0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
56e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
56f0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
5700: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
5710: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
5720: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
5730: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
5740: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
5750: 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d  r *zType = colum
5760: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20 70 54  nType(pParse, pT
5770: 61 62 4c 69 73 74 2c 20 70 29 3b 0a 20 20 20 20  abList, p);.    
5780: 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63  if( zType==0 ) c
5790: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20  ontinue;.    /* 
57a0: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
57b0: 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79  ke it's own copy
57c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
57d0: 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ype, in case the
57e0: 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20   .    ** schema 
57f0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
5800: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
5810: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
5820: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
5830: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
5840: 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e  e(v, i+pEList->n
5850: 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72  Expr, zType, str
5860: 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d  len(zType));.  }
5870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
5880: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
5890: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
58a0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
58b0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
58c0: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
58d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
58e0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
58f0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
5900: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
5910: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
5920: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
5930: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
5940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5950: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5960: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
5970: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
5980: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
5990: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
59a0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
59b0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
59c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
59d0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
59e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
59f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
5a00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5a10: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
5a20: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
5a30: 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  es;..  /* If thi
5a40: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
5a50: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
5a60: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
5a70: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
5a80: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
5a90: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
5aa0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
5ab0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
5ac0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
5ad0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
5ae0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
5af0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
5b00: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
5b10: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
5b20: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
5b30: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
5b40: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
5b50: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
5b60: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
5b70: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
5b80: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
5b90: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
5ba0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5bb0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
5bc0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
5bd0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
5be0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
5bf0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5c00: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
5c10: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
5c20: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
5c30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
5c40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5c50: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
5c60: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
5c70: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
5c80: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
5c90: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
5ca0: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
5cb0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
5cc0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
5cd0: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
5ce0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
5cf0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
5d00: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
5d10: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
5d20: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
5d30: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
5d40: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
5d50: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
5d60: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
5d70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
5d80: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
5d90: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
5da0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
5db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
5dc0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
5dd0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
5de0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
5df0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
5e00: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
5e10: 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c  WID_";.      }el
5e20: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
5e30: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5e40: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
5e50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
5e60: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
5e70: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
5e80: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
5e90: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
5ea0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5eb0: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
5ec0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5ed0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5ee0: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
5ef0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
5f00: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
5f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
5f20: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
5f30: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
5f40: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
5f50: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
5f60: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
5f70: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
5f80: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
5f90: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
5fa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
5fb0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
5fc0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
5fd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
5fe0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
5ff0: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6000: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
6010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
6030: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
6040: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
6050: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
6060: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
6070: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
6080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6090: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d  ColName(v, i, p-
60a0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
60b0: 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71  .n);.      /* sq
60c0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
60d0: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
60e0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
60f0: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
6100: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
6110: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
6120: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
6130: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
6140: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
6150: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
6160: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
6170: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
6180: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
6190: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
61a0: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
61b0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
61c0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  st);.}../*.** Na
61d0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
61e0: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
61f0: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
6200: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
6210: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
6220: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
6230: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
6240: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
6250: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
6260: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
6270: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
6280: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
6290: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
62a0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
62b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
62c0: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
62d0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
62e0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
62f0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
6300: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
6310: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
6320: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  z;.}../*.** Forw
6330: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
6340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
6350: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
6360: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
6370: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
6380: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6390: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
63a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
63b0: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
63c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
63d0: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
63e0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
63f0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
6400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6410: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
6420: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
6430: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
6440: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
6450: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
6460: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
6470: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66   *pCol;..  if( f
6480: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
6490: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
64a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
64b0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
64c0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
64d0: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
64e0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
64f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6500: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
6510: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
6520: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
6530: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
6540: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
6550: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
6560: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
6570: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
6580: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
6590: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
65a0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
65b0: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
65c0: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
65d0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
65e0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
65f0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
6600: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
6610: 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  pR;.    char *zT
6620: 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ype;.    char *z
6630: 4e 61 6d 65 3b 0a 20 20 20 20 45 78 70 72 20 2a  Name;.    Expr *
6640: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
6650: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
6660: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
6670: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
6680: 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e  oken.z==0 || p->
6690: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
66a0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
66b0: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
66c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
66d0: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   ){.      zName 
66e0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
66f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
6700: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
6710: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT .            
6720: 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69     && (pR=p->pRi
6730: 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74  ght)!=0 && pR->t
6740: 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f  oken.z && pR->to
6750: 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  ken.z[0] ){.    
6760: 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 20    int cnt;.     
6770: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6780: 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70  MPrintf("%T", &p
6790: 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  R->token);.     
67a0: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
67b0: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  i; j++){.       
67c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
67d0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
67e0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
67f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6800: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
6810: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
6820: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
6830: 54 5f 25 64 22 2c 20 26 70 52 2d 3e 74 6f 6b 65  T_%d", &pR->toke
6840: 6e 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  n, ++cnt);.     
6850: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
6860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6870: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
6880: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
6890: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
68a0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
68b0: 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d  Printf("%T", &p-
68c0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  >span);.    }els
68d0: 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  e{.      zName =
68e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
68f0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
6900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6910: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
6920: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61  );.    pCol->zNa
6930: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20  me = zName;..   
6940: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53   zType = sqliteS
6950: 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65  trDup(columnType
6960: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
6970: 2d 3e 70 53 72 63 20 2c 70 29 29 3b 0a 20 20 20  ->pSrc ,p));.   
6980: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
6990: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
69a0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
69b0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
69c0: 20 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a     if( zType ){.
69d0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69        pCol->affi
69e0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
69f0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
6a00: 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29  , strlen(zType))
6a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
6a20: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
6a30: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
6a40: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
6a50: 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b   !pCol->pColl ){
6a60: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f  .      pCol->pCo
6a70: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
6a80: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6a90: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
6aa0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
6ab0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
6ac0: 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * For the given 
6ad0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6ae0: 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67  , do three thing
6af0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
6b00: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
6b10: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
6b20: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
6b30: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
6b40: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74         defines t
6b50: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
6b60: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
6b70: 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69  scanned.  For vi
6b80: 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ews,.**         
6b90: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
6ba0: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
6bb0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
6bc0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
6bd0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
6be0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
6bf0: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
6c00: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
6c10: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
6c20: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
6c30: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
6c40: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
6c50: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
6c60: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
6c70: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
6c80: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
6c90: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
6ca0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
6cb0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
6cc0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
6cd0: 28 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (2)  Add terms t
6ce0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
6cf0: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
6d00: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
6d10: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
6d20: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
6d30: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
6d40: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
6d50: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61  *.**    (3)  Sca
6d60: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
6d70: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
6d80: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
6d90: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
6da0: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
6db0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
6dc0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
6dd0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
6de0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
6df0: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
6e00: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
6e10: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
6e20: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
6e30: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
6e40: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
6e50: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
6e60: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
6e70: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
6e80: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
6e90: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
6ea0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
6eb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
6ec0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
6ed0: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
6ee0: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
6ef0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
6f00: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
6f10: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
6f20: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
6f30: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
6f40: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72  ble *pTab;.  str
6f50: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
6f60: 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20   *pFrom;..  if( 
6f70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d  p==0 || p->pSrc=
6f80: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
6f90: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
6fa0: 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
6fb0: 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
6fc0: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
6fd0: 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c  able in the tabl
6fe0: 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66  e list..  */.  f
6ff0: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
7000: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
7010: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
7020: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
7030: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
7040: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7050: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
7060: 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65   before!  No nee
7070: 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f  d to continue */
7080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7090: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
70a0: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
70b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
70c0: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
70d0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
70e0: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
70f0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
7100: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
7110: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
7120: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
7130: 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20    pFrom->zAlias 
7140: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
7150: 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c 69  te3MPrintf("sqli
7160: 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
7170: 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e  , (void*)pFrom->
7180: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7190: 7d 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  }.      pFrom->p
71a0: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
71b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
71c0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
71d0: 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41  Parse, pFrom->zA
71e0: 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lias, pFrom->pSe
71f0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28  lect);.      if(
7200: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
7210: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7220: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
7230: 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66  he isTransient f
7240: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
7250: 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  at the Table str
7260: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a  ucture has been.
7270: 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
7280: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
7290: 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20  nd may be freed 
72a0: 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e  at any time.  In
72b0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20   other words,.  
72c0: 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e      ** pTab is n
72d0: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
72e0: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
72f0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
7300: 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a   defines.      *
7310: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63  * part of the sc
7320: 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70  hema. */.      p
7330: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
7340: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
7350: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
7360: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
7370: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
7380: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
7390: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
73a0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
73b0: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
73c0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72  Table(pParse,pFr
73d0: 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
73e0: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
73f0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7400: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7410: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7420: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
7430: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
7440: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
7450: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
7460: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
7470: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
7480: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
7490: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
74a0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
74b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
74c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
74d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
74e0: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
74f0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
7500: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
7510: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
7520: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
7530: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
7540: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
7550: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
7560: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
7570: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
7580: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
7590: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
75a0: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
75b0: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
75c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
75d0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
75e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
75f0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
7600: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
7610: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
7620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7630: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7640: 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
7650: 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
7660: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
7670: 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
7680: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50  */.  if( sqliteP
7690: 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
76a0: 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31  e, p) ) return 1
76b0: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  ;..  /* For ever
76c0: 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
76d0: 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
76e0: 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
76f0: 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
7700: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
7710: 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
7720: 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
7730: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
7740: 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
7750: 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
7760: 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
7770: 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
7780: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
7790: 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
77a0: 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
77b0: 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
77c0: 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
77d0: 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
77e0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
77f0: 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
7800: 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
7810: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
7820: 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
7830: 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
7840: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7850: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
7860: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
7870: 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
7880: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
7890: 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
78a0: 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
78b0: 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
78c0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
78d0: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
78e0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
78f0: 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
7900: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
7910: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
7920: 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
7930: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
7940: 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
7950: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
7960: 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
7970: 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
7980: 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
7990: 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
79a0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
79b0: 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
79c0: 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
79d0: 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
79e0: 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
79f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
7a00: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
7a10: 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
7a20: 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
7a30: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
7a40: 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
7a50: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
7a60: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
7a70: 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
7a80: 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
7a90: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
7aa0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
7ab0: 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
7ac0: 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
7ad0: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
7ae0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
7af0: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
7b00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
7b10: 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
7b20: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
7b30: 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20  K_ALL &&.       
7b40: 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f      (pE->op!=TK_
7b50: 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
7b60: 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67  t==0 || pE->pRig
7b70: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
7b80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
7b90: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
7ba0: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
7bb0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
7bc0: 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
7bd0: 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
7be0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7bf0: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b  Append(pNew, a[k
7c00: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
7c10: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
7c20: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
7c30: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
7c40: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
7c50: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
7c60: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
7c70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7c80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
7c90: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
7ca0: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
7cb0: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
7cc0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
7cd0: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
7ce0: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
7cf0: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
7d00: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
7d10: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
7d20: 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
7d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
7d40: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
7d50: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
7d60: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
7d70: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
7d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
7d90: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
7da0: 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70  FromToken(&pE->p
7db0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
7dc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7dd0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
7de0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7df0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
7e00: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
7e10: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
7e20: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
7e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
7e40: 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
7e50: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
7e60: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7e70: 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
7e80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
7e90: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
7ea0: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
7eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
7ec0: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
7ed0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
7ef0: 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  TName && (zTabNa
7f00: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
7f10: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7f30: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
7f40: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
7f50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7f60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7f80: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
7f90: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7fa0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
7fb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7fc0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
7fd0: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
7ff0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
8000: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
8010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8020: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
8030: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
8040: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
8050: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
8060: 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
8070: 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e      if( (pLeft->
8080: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
8090: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
80c0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
80d0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
80e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
80f0: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
8100: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
8110: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
8120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8130: 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
8140: 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
8150: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
8160: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
8170: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
8190: 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  istIndex(pLeft->
81a0: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
81b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
81c0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
81d0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
81e0: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
81f0: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
8200: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
8210: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
8220: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
8230: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
8240: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8250: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8270: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
8280: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
8290: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
82a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
82b0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
82c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
82d0: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52      setToken(&pR
82e0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61  ight->token, zNa
82f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
8300: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
8310: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
8320: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8330: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
8340: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
8350: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
8360: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
8370: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
8380: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
8390: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
83a0: 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
83b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
83c0: 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28         setToken(
83d0: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  &pLeft->token, z
83e0: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
83f0: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
8400: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73  (&pExpr->span, s
8410: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
8420: 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
8430: 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20   zName));.      
8440: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
8450: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
8460: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8470: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8490: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
84a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
84b0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
84c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
84d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
84e0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
84f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
8500: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
8510: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
8520: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8530: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
8540: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8550: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
8560: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
8570: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8580: 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
8590: 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
85a0: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
85c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
85d0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
85e0: 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
85f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8600: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
8610: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8620: 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
8630: 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
8640: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8650: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
8660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
8670: 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65  qliteFree(zTName
8680: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8690: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
86a0: 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73  ListDelete(pELis
86b0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
86c0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
86d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
86e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
86f0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c   recursively unl
8700: 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e  inks the Select.
8710: 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f  pSrc.a[].pTab po
8720: 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73  inters.** in a s
8730: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
8740: 20 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74    It just sets t
8750: 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e  he pointers to N
8760: 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ULL.  This.** ro
8770: 75 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69  utine is recursi
8780: 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  ve in the sense 
8790: 74 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65  that if the Sele
87a0: 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c  ct.pSrc.a[].pSel
87b0: 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ect.** pointer i
87c0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73  s not NULL, this
87d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
87e0: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ed recursively o
87f0: 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a  n that pointer..
8800: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8810: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  ne is called on 
8820: 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
8830: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
8840: 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f  s a.** VIEW in o
8850: 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79  rder to undo any
8860: 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62   bindings to tab
8870: 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65  les.  This is ne
8880: 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75  cessary.** becau
8890: 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20  se those tables 
88a0: 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20  might be DROPed 
88b0: 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  by a subsequent 
88c0: 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20  SQL command..** 
88d0: 49 66 20 74 68 65 20 62 69 6e 64 69 6e 67 73 20  If the bindings 
88e0: 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c  are not removed,
88f0: 20 74 68 65 6e 20 74 68 65 20 53 65 6c 65 63 74   then the Select
8900: 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20  .pSrc->a[].pTab 
8910: 66 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  field.** will be
8920: 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
8930: 6f 20 61 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  o a deallocated 
8940: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
8950: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f  after the.** DRO
8960: 50 20 61 6e 64 20 61 20 63 6f 72 65 64 75 6d 70  P and a coredump
8970: 20 77 69 6c 6c 20 6f 63 63 75 72 20 74 68 65 20   will occur the 
8980: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 56 49  next time the VI
8990: 45 57 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76  EW is used..*/.v
89a0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
89b0: 74 55 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a  tUnbind(Select *
89c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
89d0: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
89e0: 2d 3e 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74  ->pSrc;.  struct
89f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
8a00: 49 74 65 6d 3b 0a 20 20 54 61 62 6c 65 20 2a 70  Item;.  Table *p
8a10: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
8a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8a30: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  i=0, pItem=pSrc-
8a40: 3e 61 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  >a; i<pSrc->nSrc
8a50: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
8a60: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d  .    if( (pTab =
8a70: 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 21 3d 30   pItem->pTab)!=0
8a80: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
8a90: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
8aa0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8ab0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
8ac0: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a   pTab);.      }.
8ad0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
8ae0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
8af0: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
8b00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8b10: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  e3SelectUnbind(p
8b20: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
8b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8b40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
8b50: 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74  routine associat
8b60: 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e  es entries in an
8b70: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
8b80: 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a  sion list with.*
8b90: 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72  * columns in a r
8ba0: 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68  esult.  For each
8bb0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
8bc0: 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65  sion, the opcode
8bd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
8be0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61  evel node is cha
8bf0: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
8c00: 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d  N and the iColum
8c10: 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  n value of.** th
8c20: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
8c30: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
8c40: 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  th column number
8c50: 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a   and the iTable.
8c60: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
8c70: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8c80: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54  s filled with iT
8c90: 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  able parameter..
8ca0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
8cb0: 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20  re prior SELECT 
8cc0: 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72  clauses, they ar
8cd0: 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73  e processed firs
8ce0: 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69  t.  A match.** i
8cf0: 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c  n an earlier SEL
8d00: 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64  ECT takes preced
8d10: 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65  ence over a late
8d20: 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  r SELECT..**.** 
8d30: 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64  Any entry that d
8d40: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73  oes not match is
8d50: 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65   flagged as an e
8d60: 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  rror.  The numbe
8d70: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69  r.** of errors i
8d80: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
8d90: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
8da0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
8db0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
8dd0: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
8de0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
8df0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
8e00: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
8e10: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
8e20: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
8e30: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
8e40: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
8e50: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
8e60: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
8e70: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
8e80: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
8e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8ea0: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
8eb0: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
8ec0: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
8ed0: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
8ee0: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
8ef0: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
8f00: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
8f10: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
8f20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8f30: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
8f40: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
8f50: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
8f60: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
8f70: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
8f80: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8f90: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
8fa0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8fb0: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
8fc0: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
8fd0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
8fe0: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
8ff0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
9000: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
9010: 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f  {.    if( matchO
9020: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
9030: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
9040: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
9050: 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
9060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9070: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
9080: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
9090: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
90a0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
90b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
90c0: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
90d0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
90e0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
90f0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
9100: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
9110: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
9120: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
9130: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
9140: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
9150: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
9160: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
9170: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9180: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
9190: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
91a0: 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20   BY position %d 
91b0: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
91c0: 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20  n 1 and %d",.   
91d0: 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c         iCol, pEL
91e0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
91f0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
9200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9210: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d    }.      if( !m
9220: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f  ustComplete ) co
9230: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43  ntinue;.      iC
9240: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
9250: 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20  for(j=0; iCol<0 
9260: 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  && j<pEList->nEx
9270: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
9280: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  if( pEList->a[j]
9290: 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f  .zName && (pE->o
92a0: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e  p==TK_ID || pE->
92b0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29  op==TK_STRING) )
92c0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
92d0: 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a  zName, *zLabel;.
92e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
92f0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
9300: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62  me;.        zLab
9310: 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  el = sqlite3Name
9320: 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74  FromToken(&pE->t
9330: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  oken);.        a
9340: 73 73 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30  ssert( zLabel!=0
9350: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9360: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9370: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30  Name, zLabel)==0
9380: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69   ){ .          i
9390: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  Col = j;.       
93a0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
93b0: 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  eFree(zLabel);. 
93c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
93d0: 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74   iCol<0 && sqlit
93e0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
93f0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  , pEList->a[j].p
9400: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
9410: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
9420: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9430: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
9440: 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f    pE->op = TK_CO
9450: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e  LUMN;.      pE->
9460: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
9470: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
9480: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20   = iTable;.     
9490: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
94a0: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  done = 1;.    }.
94b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
94c0: 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  & mustComplete )
94d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
94e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
94f0: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
9500: 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64  Y term number %d
9510: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9520: 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
9530: 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  n", i+1);.      
9540: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72  nErr++;.      br
9550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9560: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
9570: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
9580: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
9590: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
95a0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
95b0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
95c0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
95d0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
95e0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
95f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
9600: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
9610: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
9620: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
9630: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9640: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
9650: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
9660: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
9670: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
9680: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
9690: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f    return v;.}../
96a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
96b0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
96c0: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
96d0: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
96e0: 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74 20  n the.** nLimit 
96f0: 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65 6c  and nOffset fiel
9700: 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20  ds.  nLimit and 
9710: 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  nOffset hold the
9720: 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68 61   integers.** tha
9730: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
9740: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
9750: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
9760: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
9770: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
9780: 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31 20  Or that hold -1 
9790: 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20 6b  and 0 if those k
97a0: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
97b0: 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  ted..** iLimit a
97c0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 74  nd iOffset are t
97d0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
97e0: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
97f0: 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74 65  rs for.** counte
9800: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
9810: 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  te the limit and
9820: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
9830: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d 69  re is no.** limi
9840: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
9850: 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e 64   then iLimit and
9860: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
9870: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
9880: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
9890: 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66 20  s the values if 
98a0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
98b0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
98c0: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
98d0: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c  is defined by nL
98e0: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
98f0: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
9900: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
9910: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
9920: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
9930: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
9940: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
9950: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
9960: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
9970: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
9980: 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d  Only if nLimit>=
9990: 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64  0 or nOffset>0 d
99a0: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
99b0: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
99c0: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
99d0: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
99e0: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
99f0: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
9a00: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
9a10: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
9a20: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
9a30: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
9a40: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
9a50: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
9a60: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
9a70: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
9a80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9a90: 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a   *p){.  /* .  **
9aa0: 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   If the comparis
9ab0: 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74 3e  on is p->nLimit>
9ac0: 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22  0 then "LIMIT 0"
9ad0: 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c 20   shows.  ** all 
9ae0: 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68 65  rows.  It is the
9af0: 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d 69   same as no limi
9b00: 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72  t. If the compar
9b10: 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 2d  ision is.  ** p-
9b20: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e 20  >nLimit>=0 then 
9b30: 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20 6e  "LIMIT 0" show n
9b40: 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a 20  o rows at all.. 
9b50: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
9b60: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
9b70: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
9b80: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
9b90: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
9ba0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
9bb0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
9bc0: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
9bd0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
9be0: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
9bf0: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
9c00: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
9c10: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  .  if( p->nLimit
9c20: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=0 ){.    int i
9c30: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
9c40: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
9c50: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9c60: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
9c70: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
9c80: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
9c90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9ca0: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69  teger, -p->nLimi
9cb0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
9cc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9cd0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
9ce0: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
9cf0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d  mment((v, "# LIM
9d00: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
9d10: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
9d20: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
9d30: 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ->nOffset>0 ){. 
9d40: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
9d50: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
9d60: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
9d70: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9d80: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
9d90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
9da0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9db0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
9dc0: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->nOffset, 0);.
9dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9de0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
9df0: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
9e00: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
9e10: 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75  v, "# OFFSET cou
9e20: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e  nter"));.    p->
9e30: 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a  iOffset = iMem;.
9e40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9e50: 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74 72  erate VDBE instr
9e60: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c  uctions that wil
9e70: 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65  l open a transie
9e80: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a  nt table that.**
9e90: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
9ea0: 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f  r an index or to
9eb0: 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73   store keyed res
9ec0: 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ults for a compo
9ed0: 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20  und.** select.  
9ee0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
9ef0: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
9f00: 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64   table that need
9f10: 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  s a.** KeyInfo s
9f20: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e  tructure.  The n
9f30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9f40: 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   in the KeyInfo 
9f50: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
9f60: 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20 73   by the result s
9f70: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9f80: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
9f90: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9fa0: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69  t..**.** Specifi
9fb0: 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74  cally, this rout
9fc0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
9fd0: 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74   open an index t
9fe0: 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54  able for.** DIST
9ff0: 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54  INCT, UNION, INT
a000: 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45 50  ERSECT and EXCEP
a010: 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  T select stateme
a020: 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a  nts (but not .**
a030: 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a   UNION ALL)..**.
a040: 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  ** Make the new 
a050: 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61 74  table a KeyAsDat
a060: 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41 73  a table if keyAs
a070: 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Data is true..**
a080: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
a090: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 61 64  turned is the ad
a0a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
a0b0: 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63  OpenTemp instruc
a0c0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
a0d0: 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65  int openTempInde
a0e0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
a0f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
a100: 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73 44  iTab, int keyAsD
a110: 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  ata){.  KeyInfo 
a120: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
a130: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69   nColumn;.  sqli
a140: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a150: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
a160: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a170: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
a180: 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 66 69 6c  addr;..  if( fil
a190: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
a1a0: 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
a1b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a1c0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c  nColumn = p->pEL
a1d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b  ist->nExpr;.  pK
a1e0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
a1f0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a200: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e  KeyInfo)+nColumn
a210: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
a220: 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  ) );.  if( pKeyI
a230: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
a240: 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  0;.  pKeyInfo->e
a250: 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20  nc = db->enc;.  
a260: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
a270: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f   = nColumn;.  fo
a280: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
a290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79  ; i++){.    pKey
a2a0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
a2b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
a2c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
a2d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
a2e0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  r);.    if( !pKe
a2f0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
a300: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
a310: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62  o->aColl[i] = db
a320: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
a330: 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20   }.  }.  addr = 
a340: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a350: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
a360: 54 61 62 2c 20 30 2c 20 0a 20 20 20 20 20 20 28  Tab, 0, .      (
a370: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
a380: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
a390: 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79 41 73  FF);.  if( keyAs
a3a0: 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  Data ){.    sqli
a3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a3c0: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 69 54  OP_KeyAsData, iT
a3d0: 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  ab, 1);.  }.  re
a3e0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69  turn addr;.}..#i
a3f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a400: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
a410: 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  T./*.** Add the 
a420: 61 64 64 72 65 73 73 20 22 61 64 64 72 22 20 74  address "addr" t
a430: 6f 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  o the set of all
a440: 20 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65   OpenTemp opcode
a450: 20 61 64 64 72 65 73 73 65 73 0a 2a 2a 20 74 68   addresses.** th
a460: 61 74 20 61 72 65 20 62 65 69 6e 67 20 61 63 63  at are being acc
a470: 75 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d 3e 70  umulated in p->p
a480: 70 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a 73 74  pOpenTemp..*/.st
a490: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
a4a0: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
a4b0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
a4c0: 61 64 64 72 29 7b 0a 20 20 49 64 4c 69 73 74 20  addr){.  IdList 
a4d0: 2a 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70 70 4f  *pList = *p->ppO
a4e0: 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74 65  penTemp = sqlite
a4f0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a 70  3IdListAppend(*p
a500: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29  ->ppOpenTemp, 0)
a510: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
a520: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a530: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a540: 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
a550: 74 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20  t->nId-1].idx = 
a560: 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  addr;.  return S
a570: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
a580: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a590: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
a5a0: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
a5b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a5c0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
a5d0: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
a5e0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
a5f0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
a600: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
a610: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
a620: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
a630: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
a640: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
a650: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
a660: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
a670: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
a680: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
a690: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
a6a0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
a6b0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
a6c0: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
a6d0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
a6e0: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
a6f0: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
a700: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
a710: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
a720: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
a730: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
a740: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a750: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
a760: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
a770: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
a780: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
a790: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
a7a0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
a7b0: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
a7c0: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
a7d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74  ;.  }.  if( pRet
a7e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ==0 ){.    pRet 
a7f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a800: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
a810: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
a820: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
a830: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
a840: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a850: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a860: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
a870: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a880: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
a890: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a8a0: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
a8b0: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
a8c0: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
a8d0: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
a8e0: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
a8f0: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
a900: 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70  ueries..**.** "p
a910: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
a920: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
a930: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
a940: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
a950: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
a960: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
a970: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
a980: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
a990: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
a9a0: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
a9b0: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
a9c0: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
a9d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
a9e0: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
a9f0: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
aa00: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
aa10: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
aa20: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
aa30: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
aa40: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
aa50: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
aa60: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
aa70: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
aa80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
aa90: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
aaa0: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
aab0: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
aac0: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
aad0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
aae0: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
aaf0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
ab00: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
ab10: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
ab20: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
ab30: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
ab40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ab50: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
ab60: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
ab70: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
ab80: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
ab90: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
aba0: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
abb0: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
abc0: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
abd0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
abe0: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
abf0: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
ac00: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
ac10: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
ac20: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
ac30: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
ac40: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
ac50: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
ac60: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
ac70: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
ac80: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
ac90: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
aca0: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
acb0: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
acc0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
acd0: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
ace0: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
acf0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ad00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ad10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
ad20: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
ad30: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
ad40: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
ad50: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
ad60: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
ad70: 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f           /* \___
ad80: 20 20 53 74 6f 72 65 20 71 75 65 72 79 20 72 65    Store query re
ad90: 73 75 6c 74 73 20 61 73 20 73 70 65 63 69 66 69  sults as specifi
ada0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
adb0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
adc0: 20 2f 20 20 20 20 20 62 79 20 74 68 65 73 65 20   /     by these 
add0: 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20  two parameters. 
ade0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61          */.  cha
adf0: 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
ae00: 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69     /* If eDest i
ae10: 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65  s SRT_Union, the
ae20: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
ae30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
ae40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
ae50: 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
ae60: 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
ae70: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
ae80: 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
ae90: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
aea0: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
aeb0: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
aec0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
aed0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
aee0: 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
aef0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70 65  /.  IdList *pOpe
af00: 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f 50 5f  nTemp = 0;/* OP_
af10: 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65 73  OpenTemp opcodes
af20: 20 74 68 61 74 20 6e 65 65 64 20 61 20 4b 65 79   that need a Key
af30: 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 41  Info */.  int aA
af40: 64 64 72 5b 35 5d 3b 20 20 20 20 20 20 20 20 20  ddr[5];         
af50: 2f 2a 20 41 64 64 72 65 73 73 65 73 20 6f 66 20  /* Addresses of 
af60: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f 70  SetNumColumns op
af70: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
af80: 20 6e 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20   nAddr = 0;     
af90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 73 65     /* Number use
afa0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  d */.  int nCol;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afc0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
afd0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
afe0: 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  set */..  /* Mak
aff0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
b000: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
b010: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
b020: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
b030: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
b040: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
b050: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
b060: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
b070: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
b080: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  T..  */.  if( p=
b090: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
b0a0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
b0b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
b0c0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
b0d0: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
b0e0: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72  Prior;.  if( pPr
b0f0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
b100: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
b110: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
b120: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
b130: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
b140: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
b150: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
b160: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
b170: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
b180: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
b190: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
b1a0: 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c  or->nLimit>=0 ||
b1b0: 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74   pPrior->nOffset
b1c0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
b1d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b1e0: 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
b1f0: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
b200: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
b210: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
b220: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
b230: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
b240: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b250: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
b260: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
b270: 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e  a valid query en
b280: 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63  gine.  If not, c
b290: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
b2a0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
b2b0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b2c0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
b2d0: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
b2e0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b2f0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
b300: 2f 2a 20 49 66 20 2a 70 20 74 68 69 73 20 69 73  /* If *p this is
b310: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
b320: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
b330: 2c 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a  , then initializ
b340: 65 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70 65 6e  e.  ** p->ppOpen
b350: 54 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Temp to point to
b360: 20 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49 66 20   pOpenTemp.  If 
b370: 2a 70 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  *p is not the ri
b380: 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73 74  ght most.  ** st
b390: 61 74 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d 3e  atement then p->
b3a0: 70 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c 6c 20  ppOpenTemp will 
b3b0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b3c0: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 20 20  n initialized.  
b3d0: 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ** by a prior ca
b3e0: 6c 6c 20 74 6f 20 74 68 69 73 20 73 61 6d 65 20  ll to this same 
b3f0: 70 72 6f 63 65 64 75 72 65 2e 20 20 50 61 73 73  procedure.  Pass
b400: 20 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70 65 6e   along the pOpen
b410: 54 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  Temp.  ** pointe
b420: 72 20 74 6f 20 70 50 72 69 6f 72 2c 20 74 68 65  r to pPrior, the
b430: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
b440: 74 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20 2a  to our left..  *
b450: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f 70 65  /.  if( p->ppOpe
b460: 6e 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  nTemp==0 ){.    
b470: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  p->ppOpenTemp = 
b480: 26 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 0a  &pOpenTemp;.  }.
b490: 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e    pPrior->ppOpen
b4a0: 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e  Temp = p->ppOpen
b4b0: 54 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  Temp;..  /* Crea
b4c0: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
b4d0: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
b4e0: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
b4f0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
b500: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
b510: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b520: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b550: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
b560: 61 73 73 65 72 74 28 20 6e 41 64 64 72 3d 3d 30  assert( nAddr==0
b570: 20 29 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e 41   );.    aAddr[nA
b580: 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  ddr++] = sqlite3
b590: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b5a0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
b5b0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44  Parm, 0);.    eD
b5c0: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
b5d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
b5e0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
b5f0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
b600: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b610: 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
b620: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
b630: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
b640: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
b650: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
b660: 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74    pPrior->nLimit
b670: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
b680: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f        pPrior->nO
b690: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
b6a0: 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  et;.        rc =
b6b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
b6c0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65  Parse, pPrior, e
b6d0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
b6e0: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
b6f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
b700: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
b710: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b730: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
b740: 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
b750: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
b760: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
b770: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
b780: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
b790: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31    p->nLimit = -1
b7a0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66  ;.        p->nOf
b7b0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
b7c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
b7d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
b7e0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
b7f0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
b800: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
b810: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
b820: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
b830: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
b840: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b850: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
b860: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b870: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20     /* For UNION 
b880: 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ALL ... ORDER BY
b890: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
b8a0: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
b8b0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
b8c0: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
b8d0: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
b8e0: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
b8f0: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
b900: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
b910: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b920: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
b930: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  /.      int op =
b940: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20   0;      /* One 
b950: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
b960: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
b970: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
b980: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
b990: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
b9a0: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
b9b0: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
b9c0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
b9d0: 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20  Limit, nOffset; 
b9e0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
b9f0: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
ba00: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
ba10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
ba20: 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65  OrderBy;  /* The
ba30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ba40: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 53   for the right S
ba50: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 69  ELECT */.      i
ba60: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
ba70: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
ba80: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
ba90: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
baa0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
bab0: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e  ==priorOp && p->
bac0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70  pOrderBy==0 && p
bad0: 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d  ->nLimit<0 && p-
bae0: 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  >nOffset==0 ){. 
baf0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
bb00: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
bb10: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
bb20: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
bb30: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
bb40: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
bb50: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
bb60: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
bb70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bb80: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
bb90: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
bba0: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
bbb0: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
bbc0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
bbd0: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
bbe0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
bbf0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
bc00: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
bc10: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
bc20: 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20  rderBy .        
bc30: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
bc40: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
bc50: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
bc60: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a  unionTab, 1) ){.
bc70: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
bc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
bc90: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bca0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
bcb0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
bcc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bcd0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69  OP_OpenTemp, uni
bce0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
bcf0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b     if( p->op!=TK
bd00: 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _ALL ){.        
bd10: 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
bd20: 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70  ctOpenTempAddr(p
bd30: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20  , addr);.       
bd40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bd50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bd60: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bd70: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
bd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bd90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bda0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
bdb0: 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b  a, unionTab, 1);
bdc0: 0a 20 20 20 20 20 20 20 20 7d 0a 09 61 73 73 65  .        }..asse
bdd0: 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66  rt( nAddr<sizeof
bde0: 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61  (aAddr)/sizeof(a
bdf0: 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Addr[0]) );.    
be00: 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b      aAddr[nAddr+
be10: 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  +] = sqlite3Vdbe
be20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
be30: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e  umColumns, union
be40: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
be50: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
be60: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
be70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
be80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
be90: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
bea0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
beb0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
bec0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
bed0: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
bee0: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  ab, 0, 0, 0, aff
bef0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bf10: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bf20: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bf30: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
bf40: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
bf50: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
bf60: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
bf70: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
bf80: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
bf90: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
bfa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bfb0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
bfc0: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
bfd0: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
bfe0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
bff0: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
c000: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
c010: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c020: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
c030: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
c040: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
c050: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
c060: 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74   0;.      nLimit
c070: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
c080: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
c090: 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65  -1;.      nOffse
c0a0: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
c0b0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
c0c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
c0d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
c0e0: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
c0f0: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
c100: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
c110: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
c120: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
c130: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
c140: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
c150: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
c160: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
c170: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
c180: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
c190: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
c1a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c1b0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c1c0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c1d0: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
c1e0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
c1f0: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
c200: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
c210: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
c220: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
c230: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
c240: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
c250: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
c260: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
c270: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
c280: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c290: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
c2a0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
c2b0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c2c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c2d0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
c2e0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
c2f0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
c300: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
c310: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
c320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
c330: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
c340: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
c350: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
c360: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c370: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
c380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c390: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
c3a0: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
c3b0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
c3c0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c3d0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
c3e0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
c3f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
c400: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
c410: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
c420: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
c430: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
c440: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
c450: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
c480: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
c490: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
c4c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
c4d0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
c4e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
c4f0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c500: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c510: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
c520: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
c530: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
c540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c550: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
c560: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
c570: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
c580: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c590: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
c5a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c5b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c5c0: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
c5d0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
c5e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c5f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
c600: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
c610: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
c620: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
c630: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
c640: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
c650: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  it, nOffset;.   
c660: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
c670: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
c680: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
c690: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
c6a0: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
c6b0: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
c6c0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
c6d0: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
c6e0: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
c6f0: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
c700: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
c710: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
c720: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c730: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
c740: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
c750: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
c760: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
c770: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
c780: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
c790: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
c7a0: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
c7b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c7c0: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
c7d0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c7e0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c7f0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
c810: 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 30  penTemp, tab1, 0
c820: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75  );.      rc = mu
c830: 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d  ltiSelectOpenTem
c840: 70 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a  pAddr(p, addr);.
c850: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c860: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c870: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c880: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c890: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
c8a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
c8b0: 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20  eyAsData, tab1, 
c8c0: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
c8d0: 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61  ( nAddr<sizeof(a
c8e0: 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64  Addr)/sizeof(aAd
c8f0: 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20  dr[0]) );.      
c900: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
c910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c920: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
c930: 6c 75 6d 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b  lumns, tab1, 0);
c940: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c950: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
c960: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
c970: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
c980: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
c990: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
c9a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
c9b0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c9c0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
c9d0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
c9e0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  1, 0, 0, 0, aff)
c9f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ca00: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ca10: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ca20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ca30: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
ca40: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
ca50: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ca60: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
ca70: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
ca80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ca90: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
caa0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b2, 0);.      rc
cab0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
cac0: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
cad0: 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
cae0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
caf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
cb00: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
cb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
cb20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cb30: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
cb40: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  ab2, 1);.      a
cb50: 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a  ssert( nAddr<siz
cb60: 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f  eof(aAddr)/sizeo
cb70: 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20  f(aAddr[0]) );. 
cb80: 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72       aAddr[nAddr
cb90: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
cba0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
cbb0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32  NumColumns, tab2
cbc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
cbd0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
cbe0: 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69   nLimit = p->nLi
cbf0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  mit;.      p->nL
cc00: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
cc10: 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f   nOffset = p->nO
cc20: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
cc30: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
cc40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cc50: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
cc60: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
cc70: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
cc80: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
cc90: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
cca0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69   p->nLimit = nLi
ccb0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  mit;.      p->nO
ccc0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
ccd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
cce0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
ccf0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cd00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
cd10: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cd20: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
cd30: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
cd40: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
cd50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
cd60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
cd70: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cd80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
cd90: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
cda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
cdb0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
cdc0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
cdd0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
cde0: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
cdf0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ce00: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
ce10: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
ce20: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ce30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ce40: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
ce50: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
ce60: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
ce70: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
ce80: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
ce90: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
cea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ceb0: 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30  FullKey, tab1, 0
cec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ced0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cee0: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
cef0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
cf00: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
cf10: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
cf20: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
cf30: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
cf40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
cf60: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
cf70: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
cfa0: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
cfb0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
cfc0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
cfd0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
cfe0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
cff0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d000: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d010: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
d020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d030: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
d040: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
d050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d060: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d070: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d090: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
d0a0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
d0b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d0c0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
d0d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
d0e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
d0f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
d100: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
d110: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
d120: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d130: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
d140: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
d150: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
d160: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
d170: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
d180: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
d190: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
d1a0: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
d1b0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d1c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d1d0: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
d1e0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
d1f0: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
d200: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
d210: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
d220: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
d230: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
d240: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
d250: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d260: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d270: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
d280: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
d290: 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
d2a0: 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
d2b0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
d2c0: 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41 64  pr;.  while( nAd
d2d0: 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64 64  dr>0 ){.    nAdd
d2e0: 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r--;.    sqlite3
d2f0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
d300: 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e 43  aAddr[nAddr], nC
d310: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
d320: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
d330: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
d340: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
d350: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
d360: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
d370: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
d380: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
d390: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
d3a0: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
d3b0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
d3c0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
d3d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
d3e0: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
d3f0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
d400: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
d410: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
d420: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
d430: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
d440: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
d450: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
d460: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
d470: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
d480: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
d490: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
d4a0: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
d4b0: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
d4c0: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
d4d0: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
d4e0: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
d4f0: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
d500: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
d510: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
d520: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
d530: 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65  OrderBy || (pOpe
d540: 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65  nTemp && pOpenTe
d550: 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20  mp->nId>0) ){.  
d560: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d590: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
d5a0: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
d5b0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
d5c0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
d5d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
d5e0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
d5f0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 3d 20 26  >ppOpenTemp == &
d600: 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a 20 20 20  pOpenTemp );.   
d610: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
d620: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
d630: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
d640: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
d650: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
d660: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
d670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
d680: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
d690: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d6a0: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
d6b0: 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  o->enc = pParse-
d6c0: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4b  >db->enc;.    pK
d6d0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
d6e0: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
d6f0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
d700: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
d710: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  o->aColl[i] = mu
d720: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
d730: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
d740: 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79 49        if( !pKeyI
d750: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
d760: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
d770: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  o->aColl[i] = pP
d780: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
d790: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
d7a0: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
d7b0: 20 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 69 3c   pOpenTemp && i<
d7c0: 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b 20  pOpenTemp->nId; 
d7d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
d7e0: 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f 50  p3type = (i==0?P
d7f0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
d800: 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  F:P3_KEYINFO);. 
d810: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
d820: 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d 2e  pOpenTemp->a[i].
d830: 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  idx;.      sqlit
d840: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
d850: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
d860: 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79 70 65  pKeyInfo, p3type
d870: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
d880: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
d890: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
d8a0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 72  prList_item *pOr
d8b0: 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d 3e 70  derByTerm = p->p
d8c0: 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
d8d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d8e0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d8f0: 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79 54 65   i++, pOrderByTe
d900: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
d910: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
d920: 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78 70 72  derByTerm->pExpr
d930: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
d940: 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72 42 79  zName = pOrderBy
d950: 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Term->zName;.   
d960: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
d970: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
d980: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  N && pExpr->iCol
d990: 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  umn<nCol );.    
d9a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 45 78      assert( !pEx
d9b0: 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
d9c0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
d9d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
d9e0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
d9f0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
da00: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d  pParse, zName, -
da10: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
da20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  e{.          pEx
da30: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  pr->pColl = pKey
da40: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45 78 70  Info->aColl[pExp
da50: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20  r->iColumn];.   
da60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
da70: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
da80: 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
da90: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
daa0: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
dab0: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
dac0: 69 66 28 20 21 70 4f 70 65 6e 54 65 6d 70 20 29  if( !pOpenTemp )
dad0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
dae0: 68 61 70 70 65 6e 73 20 66 6f 72 20 55 4e 49 4f  happens for UNIO
daf0: 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20  N ALL ... ORDER 
db00: 42 59 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  BY */.      sqli
db10: 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  teFree(pKeyInfo)
db20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d 75 6c  ;.    }.  }..mul
db30: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
db40: 20 69 66 28 20 70 4f 70 65 6e 54 65 6d 70 20 29   if( pOpenTemp )
db50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
db60: 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65 6e 54  istDelete(pOpenT
db70: 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  emp);.  }.  p->p
db80: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20  pOpenTemp = 0;. 
db90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
dba0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dbb0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
dbc0: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
dbd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
dbe0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
dbf0: 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
dc00: 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
dc10: 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
dc20: 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
dc30: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
dc40: 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
dc50: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
dc60: 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
dc70: 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
dc80: 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
dc90: 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
dca0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
dcb0: 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
dcc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
dcd0: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
dce0: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
dcf0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
dd00: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
dd10: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
dd20: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
dd30: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
dd40: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
dd50: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
dd60: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
dd70: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
dd80: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
dd90: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
dda0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
ddb0: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
ddc0: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
ddd0: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
dde0: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
ddf0: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
de00: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
de10: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
de20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
de30: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
de40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
de50: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
de60: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
de70: 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
de80: 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
de90: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
dea0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
deb0: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
dec0: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
ded0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
dee0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
def0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
df00: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
df10: 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
df20: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
df30: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
df40: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
df50: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
df60: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
df70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
df80: 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
df90: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
dfa0: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
dfb0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
dfc0: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
dfd0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
dfe0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
dff0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
e000: 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
e010: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
e020: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e030: 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
e040: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
e050: 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
e060: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
e070: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
e080: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
e090: 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
e0a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
e0b0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e0c0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
e0d0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
e0e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
e0f0: 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a  (pNew->pRight);.
e100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e110: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
e120: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
e130: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
e140: 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70  rListDup(pNew->p
e150: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
e160: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
e170: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
e180: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
e190: 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
e1a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
e1b0: 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
e1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
e1d0: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
e1e0: 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
e1f0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
e200: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45  te3TokenCopy(&pE
e210: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
e220: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->span);.    }. 
e230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
e240: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  tExpr(pExpr->pLe
e250: 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
e260: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
e270: 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  pr(pExpr->pRight
e280: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
e290: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
e2a0: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
e2b0: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
e2c0: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
e2d0: 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72   void .substExpr
e2e0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
e2f0: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
e300: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
e310: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
e320: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
e330: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
e340: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
e350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
e360: 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
e370: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
e380: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
e390: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
e3a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
e3b0: 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  IEW) */..#ifndef
e3c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
e3d0: 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  W./*.** This rou
e3e0: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
e3f0: 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
e400: 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
e410: 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
e420: 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
e430: 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
e440: 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
e450: 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
e460: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
e470: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
e480: 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
e490: 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
e4a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
e4b0: 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
e4c0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
e4d0: 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
e4e0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
e4f0: 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
e500: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
e510: 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
e520: 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
e530: 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
e540: 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
e550: 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
e560: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
e570: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
e580: 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
e590: 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
e5a0: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
e5b0: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
e5c0: 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
e5d0: 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
e5e0: 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
e5f0: 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
e600: 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
e610: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
e620: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e630: 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
e640: 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
e650: 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
e660: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
e670: 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
e680: 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
e690: 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
e6a0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
e6b0: 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
e6c0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
e6d0: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
e6e0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
e6f0: 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
e700: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
e710: 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
e720: 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
e730: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
e740: 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
e750: 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
e760: 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
e770: 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
e780: 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
e790: 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
e7a0: 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
e7b0: 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
e7c0: 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
e7d0: 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
e7e0: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
e7f0: 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
e800: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
e810: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
e820: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
e830: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
e840: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
e850: 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
e860: 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
e870: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
e880: 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
e890: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
e8a0: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
e8b0: 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
e8c0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
e8d0: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
e8e0: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
e8f0: 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20   join, or.**    
e900: 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79      the subquery
e910: 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61   is not itself a
e920: 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20   join.  (Ticket 
e930: 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  #306).**.**   (4
e940: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
e950: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
e960: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
e970: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
e980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
e990: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
e9a0: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
e9b0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
e9c0: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
e9d0: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
e9e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
e9f0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
ea00: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
ea10: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
ea20: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
ea30: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
ea40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
ea50: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
ea60: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
ea70: 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
ea80: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
ea90: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
eaa0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
eab0: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
eac0: 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
ead0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
eae0: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
eaf0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
eb00: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
eb10: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
eb20: 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
eb30: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
eb40: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
eb50: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
eb60: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
eb70: 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
eb80: 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
eb90: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
eba0: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
ebb0: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
ebc0: 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
ebd0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29  ses..**.**  (12)
ebe0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
ebf0: 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
ec00: 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f  term of a LEFT O
ec10: 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65  UTER JOIN or the
ec20: 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
ec30: 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
ec40: 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64   clause.  (added
ec50: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29   by ticket #350)
ec60: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
ec70: 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
ec80: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
ec90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
eca0: 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
ecb0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
ecc0: 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
ecd0: 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
ece0: 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
ecf0: 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
ed00: 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
ed10: 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
ed20: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
ed30: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
ed40: 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
ed50: 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
ed60: 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
ed70: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
ed80: 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
ed90: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
eda0: 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
edb0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
edc0: 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
edd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ede0: 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
edf0: 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
ee00: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
ee10: 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
ee20: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
ee30: 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
ee40: 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
ee50: 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
ee60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ee70: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
ee80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
ee90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
eea0: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
eeb0: 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
eec0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
eed0: 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
eee0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
eef0: 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
ef00: 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
ef10: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
ef20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
ef30: 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
ef40: 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
ef50: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
ef60: 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
ef70: 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
ef80: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
ef90: 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
efa0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
efb0: 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
efc0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
efd0: 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
efe0: 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
eff0: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
f000: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
f010: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
f020: 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
f030: 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
f040: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
f050: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
f060: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f070: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
f080: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
f090: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
f0a0: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
f0b0: 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
f0c0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
f0d0: 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
f0e0: 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
f0f0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f100: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f110: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
f120: 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f140: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
f150: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
f160: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
f170: 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
f180: 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  ubquery */..  /*
f190: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
f1a0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
f1b0: 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
f1c0: 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
f1d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
f1e0: 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
f1f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
f200: 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
f210: 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
f220: 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
f230: 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
f240: 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62  a[iFrom];.  pSub
f250: 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
f260: 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
f270: 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
f280: 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
f290: 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
f2a0: 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   0;.  if( subque
f2b0: 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
f2c0: 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
f2d0: 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20   0;.  pSubSrc = 
f2e0: 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
f2f0: 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
f300: 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
f310: 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
f320: 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d   0;.  if( (pSub-
f330: 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
f340: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20  Sub->nLimit>=0) 
f350: 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e  &&  (pSrc->nSrc>
f360: 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
f370: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f380: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44 69  }.  if( (p->isDi
f390: 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69  stinct || p->nLi
f3a0: 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71 75  mit>=0) && subqu
f3b0: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
f3c0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  n 0;.  if( p->pO
f3d0: 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
f3e0: 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
f3f0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72  n 0;..  /* Restr
f400: 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
f410: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
f420: 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
f430: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
f440: 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
f450: 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
f460: 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
f470: 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
f480: 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
f490: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
f4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f4b0: 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
f4c0: 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
f4d0: 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
f4e0: 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
f4f0: 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
f500: 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
f510: 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
f520: 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
f530: 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
f540: 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
f550: 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
f560: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  g..  */.  if( pS
f570: 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26  ubSrc->nSrc>1 &&
f580: 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72   iFrom>0 && (pSr
f590: 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f  c->a[iFrom-1].jo
f5a0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
f5b0: 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
f5c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
f5d0: 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
f5e0: 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
f5f0: 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
f600: 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
f610: 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
f620: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
f630: 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
f640: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
f650: 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
f660: 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
f670: 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
f680: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
f690: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
f6a0: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
f6b0: 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
f6c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
f6d0: 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
f6e0: 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
f6f0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
f700: 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
f710: 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
f720: 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
f730: 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
f740: 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
f750: 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
f760: 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
f770: 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
f780: 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
f790: 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
f7a0: 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
f7b0: 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30  */.  if( iFrom>0
f7c0: 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72   && (pSrc->a[iFr
f7d0: 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  om-1].jointype &
f7e0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
f7f0: 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57       && pSub->pW
f800: 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
f810: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f820: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
f830: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
f840: 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
f850: 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
f860: 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74  the.  ** iFrom-t
f870: 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
f880: 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
f890: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
f8a0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61   */..  /* Move a
f8b0: 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
f8c0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
f8d0: 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
f8e0: 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
f8f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
f900: 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
f910: 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
f920: 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
f930: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
f940: 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
f950: 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
f960: 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
f970: 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
f980: 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
f990: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
f9a0: 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
f9b0: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
f9c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
f9d0: 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
f9e0: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
f9f0: 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
fa00: 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
fa10: 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
fa20: 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
fa30: 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
fa40: 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
fa50: 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
fa60: 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61  g in..  */.  iPa
fa70: 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
fa80: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20  >iCursor;.  {.  
fa90: 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20    int nSubSrc = 
faa0: 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
fab0: 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20     int jointype 
fac0: 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
fad0: 74 79 70 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  type;.    Table 
fae0: 2a 70 54 61 62 20 3d 20 70 53 75 62 69 74 65 6d  *pTab = pSubitem
faf0: 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28  ->pTab;..    if(
fb00: 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69   pTab && pTab->i
fb10: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
fb20: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
fb30: 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69 74  eTable(0, pSubit
fb40: 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d  em->pTab);.    }
fb50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
fb60: 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
fb70: 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
fb80: 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  Free(pSubitem->z
fb90: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
fba0: 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
fbb0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
fbc0: 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
fbd0: 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
fbe0: 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
fbf0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
fc00: 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
fc10: 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
fc20: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
fc30: 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  (pSrc, 0, 0);.  
fc40: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
fc50: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
fc60: 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
fc70: 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
fc80: 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
fc90: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
fca0: 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
fcb0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
fcc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fcd0: 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
fce0: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
fcf0: 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
fd00: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
fd10: 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
fd20: 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
fd30: 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
fd40: 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
fd50: 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31  [iFrom+nSubSrc-1
fd60: 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
fd70: 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
fd80: 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
fd90: 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
fda0: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
fdb0: 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
fdc0: 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
fdd0: 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
fde0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
fdf0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
fe00: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
fe10: 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
fe20: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
fe30: 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
fe40: 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
fe50: 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
fe80: 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
fe90: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
fea0: 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
feb0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
fec0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
fed0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
fee0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
fef0: 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
ff00: 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
ff10: 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
ff20: 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
ff30: 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
ff40: 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
ff50: 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
ff60: 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
ff70: 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
ff80: 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
ff90: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
ffa0: 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
ffb0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
ffc0: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e  );.  pList = p->
ffd0: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
ffe0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
fff0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
10000 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66  r *pExpr;.    if
10010 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
10020 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72  ame==0 && (pExpr
10030 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
10040 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30  Expr)->span.z!=0
10050 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
10060 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
10070 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70  liteStrNDup(pExp
10080 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
10090 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
100a0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
100b0 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
100c0 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
100d0 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
100e0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
100f0 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
10100 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
10110 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
10120 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72  .  if( pSub->pOr
10130 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73  derBy ){.    ass
10140 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10150 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  ==0 );.    p->pO
10160 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
10170 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75  OrderBy;.    pSu
10180 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
10190 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
101a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
101b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
101c0 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
101d0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
101e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
101f0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
10200 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
10210 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  3ExprDup(pSub->p
10220 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
10230 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
10240 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
10250 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
10260 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
10270 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
10280 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
10290 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
102a0 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
102b0 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
102c0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
102d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
102e0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
102f0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
10300 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74  ->pHaving, sqlit
10310 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
10320 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61  pHaving));.    a
10330 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
10340 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
10350 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
10360 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 53  e3ExprListDup(pS
10370 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  ub->pGroupBy);. 
10380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
10390 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  tExpr(p->pWhere,
103a0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
103b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
103c0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
103d0 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72  ExprAnd(p->pWher
103e0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a  e, pWhere);.  }.
103f0 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65  .  /* The flatte
10400 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
10410 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
10420 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
10430 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72  .  ** outer quer
10440 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
10450 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74    */.  p->isDist
10460 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
10470 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73  inct || pSub->is
10480 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
10490 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d  Transfer the lim
104a0 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  it expression fr
104b0 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
104c0 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a  to the outer.  *
104d0 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  * query..  */.  
104e0 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  if( pSub->nLimit
104f0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
10500 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ->nLimit<0 ){.  
10510 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
10520 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20  pSub->nLimit;.  
10530 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
10540 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74  Limit+p->nOffset
10550 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b   > pSub->nLimit+
10560 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b  pSub->nOffset ){
10570 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
10580 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20   = pSub->nLimit 
10590 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  + pSub->nOffset 
105a0 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  - p->nOffset;.  
105b0 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66    }.  }.  p->nOf
105c0 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f  fset += pSub->nO
105d0 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e  ffset;..  /* Fin
105e0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
105f0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
10600 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
10610 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
10620 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
10630 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
10640 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Sub);.  return 1
10650 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10660 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
10670 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
10680 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10690 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
106a0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
106b0 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
106c0 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
106d0 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
106e0 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
106f0 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
10700 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
10710 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
10720 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
10730 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
10740 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
10750 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
10760 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
10770 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
10780 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
10790 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
107a0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
107b0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
107c0 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
107d0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
107e0 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
107f0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
10800 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
10810 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
10820 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
10830 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
10840 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
10850 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
10860 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
10870 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
10880 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
10890 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
108a0 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
108b0 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
108c0 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
108d0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
108e0 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
108f0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
10900 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
10910 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
10920 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
10930 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
10940 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
10950 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
10960 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
10970 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
10980 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  te3Select()..** 
10990 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
109a0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
109b0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
109c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
109d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
109e0 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
109f0 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
10a00 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10a10 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
10a20 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
10a30 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
10a40 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
10a50 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
10a60 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
10a70 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70  *v;.  int seekOp
10a80 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20  ;.  int cont;.  
10a90 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10aa0 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
10ab0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
10ac0 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
10ad0 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
10ae0 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  rc;..  /* Check 
10af0 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71  to see if this q
10b00 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
10b10 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
10b20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20  query.  Return. 
10b30 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69   ** zero if it i
10b40 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  s  not..  */.  i
10b50 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c  f( p->pGroupBy |
10b60 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20  | p->pHaving || 
10b70 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
10b80 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
10b90 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53  ->pSrc;.  if( pS
10ba0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
10bb0 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
10bc0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
10bd0 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
10be0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
10bf0 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
10c00 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
10c10 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
10c20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
10c30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c  ) return 0;.  pL
10c40 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
10c50 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  st;.  if( pList=
10c60 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78  =0 || pList->nEx
10c70 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
10c80 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
10c90 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
10ca0 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
10cb0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
10cc0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
10cd0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
10ce0 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
10cf0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
10d00 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45  lite3StrNICmp(pE
10d10 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
10d20 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
10d30 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
10d40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
10d50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
10d60 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
10d70 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
10d80 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
10d90 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
10da0 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  .  iCol = pExpr-
10db0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62  >iColumn;.  pTab
10dc0 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
10dd0 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ab;..  /* If we 
10de0 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
10df0 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
10e00 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
10e10 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
10e20 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
10e30 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
10e40 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
10e50 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
10e60 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
10e70 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
10e80 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
10e90 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
10ea0 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
10eb0 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
10ec0 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
10ed0 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
10ee0 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
10ef0 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
10f00 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
10f10 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
10f20 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
10f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
10f40 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
10f50 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10f60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
10f70 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
10f80 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
10f90 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
10fa0 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
10fb0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
10fc0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
10fd0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10fe0 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78  0]==iCol && pIdx
10ff0 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11000 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61  0]==pColl ) brea
11010 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
11020 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
11030 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
11040 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
11050 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
11060 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
11070 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
11080 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
11090 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
110a0 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
110b0 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
110c0 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
110d0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
110e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
110f0 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
11100 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
11110 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
11120 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11130 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
11140 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
11150 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
11160 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
11170 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11180 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
11190 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
111a0 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
111b0 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
111c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
111d0 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
111e0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
111f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11200 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
11210 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
11220 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
11230 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
11240 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
11250 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
11260 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
11270 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
11280 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
11290 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
112a0 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
112b0 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
112c0 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
112d0 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
112e0 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
112f0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
11300 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
11310 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
11320 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
11330 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
11340 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44  pParse, pTab->iD
11350 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  b);.  base = pSr
11360 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
11370 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
11380 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
11390 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d   p);.  if( pSrc-
113a0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
113b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
113c0 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69  penTableForReadi
113d0 6e 67 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62  ng(v, base, pTab
113e0 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20  );.  }.  cont = 
113f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11400 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70  abel(v);.  if( p
11410 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Idx==0 ){.    sq
11420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11430 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20  , seekOp, base, 
11440 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
11450 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
11460 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
11470 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65  to open the inde
11480 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64  x here is closed
11490 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20  .    ** as soon 
114a0 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  as a single valu
114b0 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64 20  e has been read 
114c0 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74  from it, allocat
114d0 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e  e it.    ** usin
114e0 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b  g (pParse->nTab+
114f0 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  +) to prevent th
11500 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d  e cursor id from
11510 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72   being .    ** r
11520 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20 69  eused. This is i
11530 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61  mportant for sta
11540 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66  tements of the f
11550 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53  orm .    ** "INS
11560 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43  ERT INTO x SELEC
11570 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e  T max() FROM x".
11580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
11590 69 49 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d  iIdx;.    iIdx =
115a0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
115b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
115c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
115d0 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20  ger, pIdx->iDb, 
115e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
115f0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
11600 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64  nRead, iIdx, pId
11610 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20  x->tnum,.       
11620 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11630 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66  r*)&pIdx->keyInf
11640 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
11650 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d      if( seekOp==
11660 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20  OP_Rewind ){.   
11670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11680 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
11690 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
116a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
116b0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
116c0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
116d0 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47  eekOp = OP_MoveG
116e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
116f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11700 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30   seekOp, iIdx, 0
11710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11720 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
11730 78 52 65 63 6e 6f 2c 20 69 49 64 78 2c 20 30 29  xRecno, iIdx, 0)
11740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11750 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11760 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  se, iIdx, 0);.  
11770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11780 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
11790 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20   base, 0);.  }. 
117a0 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31   eList.nExpr = 1
117b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73  ;.  memset(&eLis
117c0 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  tItem, 0, sizeof
117d0 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20  (eListItem));.  
117e0 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74  eList.a = &eList
117f0 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b  Item;.  eList.a[
11800 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
11810 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
11820 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26  oop(pParse, p, &
11830 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  eList, 0, 0, 0, 
11840 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
11850 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29  , cont, cont, 0)
11860 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
11870 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63  esolveLabel(v, c
11880 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ont);.  sqlite3V
11890 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
118a0 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  lose, base, 0);.
118b0 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d    .  return 1;.}
118c0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
118d0 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20  and ORDER BY or 
118e0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
118f0 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
11900 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a  ement.  Return.*
11910 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
11920 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
11930 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f  ** An ORDER BY o
11940 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61 20  r GROUP BY is a 
11950 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
11960 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70  ons.  If any exp
11970 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e  ression.** is an
11980 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
11990 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78 70  t, then that exp
119a0 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61  ression is repla
119b0 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f  ced by the.** co
119c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72  rresponding entr
119d0 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  y in the result 
119e0 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
119f0 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  nt processOrderG
11a00 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20  roupBy(.  Parse 
11a10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11a20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11a30 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
11a40 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
11a50 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
11a60 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11a70 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
11a80 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
11a90 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54  TabList,    /* T
11aa0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
11ab0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11ac0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
11ad0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11ae0 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
11af0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11b00 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
11b10 74 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f 6c 76  tions are involv
11b20 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
11b30 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
11b40 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20   Either "ORDER" 
11b50 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61  or "GROUP", as a
11b60 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
11b70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11b80 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
11b90 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
11ba0 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
11bb0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11bc0 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78  int iCol;.    Ex
11bd0 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
11be0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
11bf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11c00 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
11c10 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30  &iCol) && iCol>0
11c20 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
11c30 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
11c40 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
11c50 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 70 45  te(pE);.      pE
11c60 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
11c70 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
11c80 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
11c90 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
11ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11cb0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11cc0 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  lveNames(pParse,
11cd0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11ce0 74 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 31 29  t, pE, isAgg, 1)
11cf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11d00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
11d10 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
11d20 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20  onstant(pE) ){. 
11d30 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11d40 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
11d50 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  , &iCol)==0 ){. 
11d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11d70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
11d80 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
11d90 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
11da0 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
11db0 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65 29  nstants", zType)
11dc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
11dd0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
11de0 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
11df0 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
11e00 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
11e10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11e20 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
11e30 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e   "%s BY column n
11e40 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20  umber %d out of 
11e50 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
11e60 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
11e70 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
11e80 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20  ", zType, iCol, 
11e90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
11ea0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
11eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
11ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
11ee0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
11ef0 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
11f00 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
11f10 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
11f20 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
11f30 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
11f40 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ng on the.** val
11f50 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  ue of eDest and 
11f60 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
11f70 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20   eDest Value    
11f80 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
11f90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
11fa0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
11fd0 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
11fe0 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
11ff0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
12000 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
12010 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
12020 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
12030 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
12040 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
12050 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
12060 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
12070 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
12080 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69   keys of table i
12090 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
120a0 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
120b0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
120c0 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
120d0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
120e0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
120f0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
12100 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
12110 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
12120 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
12130 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
12140 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
12150 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
12160 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
12170 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76  * The table abov
12180 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e  e is incomplete.
12190 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69    Additional eDi
121a0 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65  st value have be
121b0 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20   added.** since 
121c0 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
121d0 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74   written.  See t
121e0 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
121f0 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
12200 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20  r.** a complete 
12210 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61  listing of the a
12220 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12230 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
12240 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
12250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
12260 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
12270 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
12280 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
12290 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
122a0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
122b0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
122c0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
122d0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
122e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
122f0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
12300 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
12310 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
12320 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
12330 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
12340 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
12350 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
12360 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
12370 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
12380 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
12390 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
123a0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
123b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
123c0 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
123d0 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
123e0 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
123f0 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
12400 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
12410 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
12420 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
12430 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
12440 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
12450 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
12460 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
12470 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
12480 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
12490 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
124a0 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
124b0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
124c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
124d0 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
124e0 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
124f0 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
12500 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
12510 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
12520 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
12530 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
12540 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
12560 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
12570 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
12580 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20   /.**     \     
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
125d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
125e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
125f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12600 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
12610 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
12620 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
12630 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
12640 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
12650 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
12660 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
12670 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
12680 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
12690 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
126a0 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
126b0 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
126c0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
126d0 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
126e0 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
126f0 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
12700 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
12710 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
12720 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
12730 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
12740 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
12750 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
12760 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
12770 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
12780 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
12790 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
127a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
127b0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
127c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
127d0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
127e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
127f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12800 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
12810 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
12820 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
12830 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
12840 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
12850 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
12860 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
12870 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
12880 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73  * A parameter us
12890 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20  ed by the eDest 
128a0 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
128b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
128c0 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
128d0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
128e0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
128f0 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
12900 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
12910 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12920 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
12930 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
12940 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
12950 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
12960 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
12970 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
12980 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
12990 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
129a0 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
129b0 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
129c0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
129d0 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  g */.){.  int i;
129e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
129f0 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
12a00 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30  .  int isAgg = 0
12a10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
12a20 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
12a30 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
12a40 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
12a50 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
12a60 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
12a70 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
12a80 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
12a90 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
12aa0 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
12ab0 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
12ac0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
12ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
12ae0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
12af0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
12b00 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
12b10 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
12b20 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
12b30 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
12b40 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
12b50 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
12b60 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
12b70 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12b80 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
12b90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
12ba0 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
12bb0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
12bc0 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
12bd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12be0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
12bf0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
12c00 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
12c10 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
12c20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
12c30 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
12c40 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
12c50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
12c60 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
12c70 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
12c80 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  ion */..  if( sq
12c90 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
12ca0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
12cb0 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
12cc0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
12cd0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12ce0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
12cf0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
12d00 20 72 65 74 75 72 6e 20 31 3b 0a 0a 23 69 66 6e   return 1;..#ifn
12d10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12d20 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
12d30 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
12d40 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
12d50 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
12d60 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
12d70 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
12d80 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 23  ( p->pPrior ){.#
12d90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12da0 49 54 5f 43 55 52 53 4f 52 0a 20 20 20 20 69 66  IT_CURSOR.    if
12db0 28 20 70 2d 3e 70 46 65 74 63 68 20 29 7b 0a 20  ( p->pFetch ){. 
12dc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12dd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 75  rMsg(pParse, "cu
12de0 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65 20  rsors cannot be 
12df0 75 73 65 64 20 6f 6e 20 63 6f 6d 70 6f 75 6e 64  used on compound
12e00 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20   queries");.    
12e10 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12e20 64 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  d;.    }.#endif.
12e30 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
12e40 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12e50 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
12e60 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  aff);.  }.#endif
12e70 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
12e80 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
12e90 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
12ea0 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
12eb0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
12ec0 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
12ed0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
12ee0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12ef0 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
12f00 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
12f10 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
12f20 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
12f30 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
12f40 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
12f50 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f 72  cate VDBE cursor
12f60 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  s for each table
12f70 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12f80 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  use.  */.  sqlit
12f90 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
12fa0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
12fb0 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
12fc0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
12fd0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
12fe0 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
12ff0 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
13000 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
13010 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
13020 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
13030 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
13040 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
13050 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
13060 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22  * Expand any "*"
13070 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
13080 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20  sult set.  (For 
13090 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20  example the "*" 
130a0 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20  in.  ** "SELECT 
130b0 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65  * FROM t1")  The
130c0 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73   fillInColumnlis
130d0 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  t() routine also
130e0 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20   does some.  ** 
130f0 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69  other housekeepi
13100 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61  ng - see the hea
13110 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
13120 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  details..  */.  
13130 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
13140 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20  List(pParse, p) 
13150 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
13160 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57  ct_end;.  }.  pW
13170 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
13180 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
13190 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
131a0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
131b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
131c0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
131d0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
131e0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
131f0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
13200 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
13210 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
13220 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
13230 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
13240 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
13250 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
13260 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13270 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
13280 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
13290 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
132a0 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
132b0 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
132c0 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ssion");.    got
132d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
132e0 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  }..  /* ORDER BY
132f0 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
13300 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
13310 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
13320 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
13330 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20  ase SRT_Union:. 
13340 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
13350 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  pt:.    case SRT
13360 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20  _Discard:.      
13370 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
13380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
13390 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72  efault:.      br
133a0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  eak;.  }..  /* A
133b0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
133c0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c   should have all
133d0 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63  ocated all the c
133e0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20  ursors that we. 
133f0 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64   ** need to hand
13400 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64  le subquerys and
13410 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13420 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  s.  .  **.  ** R
13430 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d  esolve the colum
13440 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61  n names and do a
13450 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b   semantics check
13460 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72   on all the expr
13470 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
13480 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
13490 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
134a0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
134b0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
134c0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
134d0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
134e0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
134f0 69 73 74 2c 20 30 2c 20 70 58 2c 20 31 2c 20 31  ist, 0, pX, 1, 1
13500 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13510 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13520 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
13530 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
13540 5f 41 67 67 29 20 29 20 69 73 41 67 67 20 3d 20  _Agg) ) isAgg = 
13550 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
13560 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13570 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
13580 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
13590 57 68 65 72 65 2c 20 30 2c 20 31 29 20 29 7b 0a  Where, 0, 1) ){.
135a0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
135b0 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
135c0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
135d0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
135e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
135f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13600 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
13610 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
13620 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
13630 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13640 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
13650 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13660 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72  esolveNames(pPar
13670 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
13680 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 2c 20 31  List, pHaving, 1
13690 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  , 1) ){.      go
136a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
136b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78 70     }.    if( Exp
136c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 48 61  rHasProperty(pHa
136d0 76 69 6e 67 2c 20 45 50 5f 41 67 67 29 20 29 20  ving, EP_Agg) ) 
136e0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20  isAgg = 1;.  }. 
136f0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 26 26   if( pGroupBy &&
13700 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73   !isAgg ){.    s
13710 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13720 50 61 72 73 65 2c 20 22 47 52 4f 55 50 20 42 59  Parse, "GROUP BY
13730 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
13740 64 20 6f 6e 20 61 67 67 72 65 67 61 74 65 20 71  d on aggregate q
13750 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 67 6f  ueries");.    go
13760 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13770 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73   }.  if( process
13780 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
13790 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
137a0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
137b0 20 69 73 41 67 67 2c 20 22 4f 52 44 45 52 22 29   isAgg, "ORDER")
137c0 0a 20 20 20 7c 7c 20 70 72 6f 63 65 73 73 4f 72  .   || processOr
137d0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
137e0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 54 61  e, pGroupBy, pTa
137f0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 69  bList, pEList, i
13800 73 41 67 67 2c 20 22 47 52 4f 55 50 22 29 0a 20  sAgg, "GROUP"). 
13810 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
13820 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
13830 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 75 73 65  /* We cannot use
13840 20 61 20 53 51 4c 20 63 75 72 73 6f 72 20 6f 6e   a SQL cursor on
13850 20 61 20 6a 6f 69 6e 20 6f 72 20 6f 6e 20 61 20   a join or on a 
13860 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 0a 20  DISTINCT query. 
13870 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
13880 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52 0a 20  TE_OMIT_CURSOR. 
13890 20 69 66 28 20 70 2d 3e 70 46 65 74 63 68 20 29   if( p->pFetch )
138a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 44  {.    if( p->isD
138b0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
138c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
138d0 28 70 50 61 72 73 65 2c 20 22 63 75 72 73 6f 72  (pParse, "cursor
138e0 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  s cannot be used
138f0 20 6f 6e 20 44 49 53 54 49 4e 43 54 20 71 75 65   on DISTINCT que
13900 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20 67 6f  ries");.      go
13910 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13920 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
13930 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  bList->nSrc>0 ){
13940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
13950 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13960 63 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74 20 62  cursors cannot b
13970 65 20 75 73 65 64 20 6f 6e 20 6a 6f 69 6e 73 22  e used on joins"
13980 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  );.      goto se
13990 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
139a0 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
139b0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
139c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
139d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
139e0 22 63 75 72 73 6f 72 20 63 61 6e 6e 6f 74 20 62  "cursor cannot b
139f0 65 20 75 73 65 64 20 77 69 74 68 20 6e 65 73 74  e used with nest
13a00 65 64 20 71 75 65 72 69 65 73 20 22 0a 20 20 20  ed queries ".   
13a10 20 20 20 20 20 20 20 22 6f 72 20 76 69 65 77 73         "or views
13a20 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ");.      goto s
13a30 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13a40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
13a50 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
13a60 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
13a70 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13a80 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
13a90 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
13aa0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
13ab0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
13ac0 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
13ad0 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
13ae0 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
13af0 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
13b00 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
13b10 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
13b20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
13b30 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
13b40 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
13b50 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
13b60 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
13b70 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
13b80 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
13b90 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13ba0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
13bb0 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
13bc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
13bd0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
13be0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
13bf0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
13c00 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
13c10 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  hContext = 0;.  
13c20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72    int needRestor
13c30 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69  eContext;..    i
13c40 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
13c50 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
13c60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
13c70 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
13c80 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  zName!=0 ){.    
13c90 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
13ca0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
13cb0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
13cc0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
13cd0 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73  ontext = pTabLis
13ce0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
13cf0 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
13d00 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
13d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
13d20 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
13d30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
13d40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13d50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
13d60 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
13d70 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20  T_TempTable, .  
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13d90 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
13da0 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73  ursor, p, i, &is
13db0 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Agg, 0);.    if(
13dc0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
13dd0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
13de0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
13df0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
13e00 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
13e10 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
13e20 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
13e30 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
13e40 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
13e50 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d  Union && eDest!=
13e60 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44  SRT_Except && eD
13e70 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64  est!=SRT_Discard
13e80 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
13e90 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
13ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
13eb0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
13ec0 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
13ed0 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
13ee0 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
13ef0 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
13f00 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
13f10 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
13f20 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
13f30 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
13f40 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
13f50 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
13f60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
13f70 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
13f80 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
13f90 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
13fa0 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
13fb0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
13fc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
13fd0 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
13fe0 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61  subquery that ca
13ff0 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22  n be "flattened"
14000 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
14010 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65  ..  ** If flatte
14020 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62  ning is a possib
14030 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20  lity, do so and 
14040 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
14050 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64  ly.  .  */.#ifnd
14060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14070 49 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e  IEW.  if( pParen
14080 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
14090 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
140a0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
140b0 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
140c0 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
140d0 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
140e0 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
140f0 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
14100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14110 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
14120 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
14130 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73  R BY clause, res
14140 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  olve any collati
14150 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a  on sequences.  *
14160 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76  * names that hav
14170 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  e been explicitl
14180 79 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  y specified..  *
14190 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
141a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
141b0 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
141c0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
141d0 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
141e0 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
141f0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
14200 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  i].pExpr->pColl 
14210 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  = .            s
14220 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
14230 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64  Seq(pParse, pOrd
14240 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  erBy->a[i].zName
14250 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
14260 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
14270 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
14280 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
14290 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
142a0 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
142b0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70  ter..  */.  comp
142c0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
142d0 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  s(pParse, p);.. 
142e0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
142f0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
14300 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
14310 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
14320 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
14330 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
14340 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
14350 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14360 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
14370 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
14380 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14390 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
143a0 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  s, iParm, pEList
143b0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
143c0 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73   /* Do an analys
143d0 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  is of aggregate 
143e0 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
143f0 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67  /.  sqliteAggreg
14400 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  ateInfoReset(pPa
14410 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67  rse);.  if( isAg
14420 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b  g || pGroupBy ){
14430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
14440 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a  rse->nAgg==0 );.
14450 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
14460 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
14470 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
14480 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
14490 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
144a0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
144b0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
144c0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
144d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
144e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
144f0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
14500 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
14510 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
14520 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14530 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14540 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
14550 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72  ates(pParse, pGr
14560 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
14570 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
14580 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
145a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
145b0 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69   pHaving && sqli
145c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
145d0 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
145e0 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
145f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
14600 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
14610 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
14620 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14630 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
14640 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
14650 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
14660 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
14670 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
14680 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
14690 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
146a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
146b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
146c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73   }.  }..  /* Res
146d0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  et the aggregato
146e0 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  r.  */.  if( isA
146f0 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  gg ){.    int ad
14700 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14710 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52  AddOp(v, OP_AggR
14720 65 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79 3f  eset, (pGroupBy?
14730 30 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e 41  0:1), pParse->nA
14740 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  gg);.    for(i=0
14750 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
14760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75  ; i++){.      Fu
14770 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20  ncDef *pFunc;.  
14780 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d      if( (pFunc =
14790 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
147a0 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46  .pFunc)!=0 && pF
147b0 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  unc->xFinalize!=
147c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
147d0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
147e0 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c  P_AggInit, 0, i,
147f0 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50   (char*)pFunc, P
14800 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
14810 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14820 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
14830 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a      int sz = siz
14840 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 70  eof(KeyInfo) + p
14850 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a 73  GroupBy->nExpr*s
14860 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
14870 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
14880 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
14890 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
148a0 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  z);.      if( 0=
148b0 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  =pKey ){.       
148c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
148d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
148e0 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61 72  pKey->enc = pPar
148f0 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
14900 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
14910 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
14920 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
14930 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
14940 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14950 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
14960 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
14970 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14980 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
14990 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
149a0 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69  ( !pKey->aColl[i
149b0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ] ){.          p
149c0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
149d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
149e0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  tColl;.        }
149f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14a00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14a10 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
14a20 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  r *)pKey, P3_KEY
14a30 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
14a40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14a50 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
14a60 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
14a70 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
14a80 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
14a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14aa0 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
14ab0 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  8, 0, 0);.    sq
14ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14ad0 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
14ae0 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
14af0 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f   /* Open a tempo
14b00 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
14b10 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
14b20 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
14b30 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
14b40 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
14b50 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14b60 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65      openTempInde
14b70 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73  x(pParse, p, dis
14b80 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  tinct, 0);.  }el
14b90 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
14ba0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
14bb0 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
14bc0 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
14bd0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
14be0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
14bf0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
14c00 65 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ere,.           
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a    pGroupBy ? 0 :
14c30 20 26 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70   &pOrderBy, p->p
14c40 46 65 74 63 68 29 3b 0a 20 20 69 66 28 20 70 57  Fetch);.  if( pW
14c50 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
14c60 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
14c70 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
14c80 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
14c90 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
14ca0 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
14cb0 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
14cc0 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
14cd0 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
14ce0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
14cf0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
14d00 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
14d10 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
14d30 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
14d40 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
14d50 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20  Break, aff) ){. 
14d60 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
14d70 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
14d80 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
14d90 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67   dealing with ag
14da0 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64  gregates, then d
14db0 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67  o the special ag
14dc0 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f  gregate.  ** pro
14dd0 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a  cessing.  .  */.
14de0 20 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45    else{.    AggE
14df0 78 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69  xpr *pAgg;.    i
14e00 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
14e10 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20       int lbl1;. 
14e20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14e30 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
14e40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
14e50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14e60 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
14e70 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
14e80 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e      }.      /* N
14e90 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
14ea0 67 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  g is attached to
14eb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f   the following O
14ec0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20  P_MakeRecord .  
14ed0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77      ** because w
14ee0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
14ef0 20 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e   do any coercion
14f00 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a   of datatypes. *
14f10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
14f20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14f30 61 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75  akeRecord, pGrou
14f40 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  pBy->nExpr, 0);.
14f50 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c        lbl1 = sql
14f60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14f70 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
14f80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14f90 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
14fa0 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  lbl1);.      for
14fb0 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73  (i=0, pAgg=pPars
14fc0 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73  e->aAgg; i<pPars
14fd0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41  e->nAgg; i++, pA
14fe0 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  gg++){.        i
14ff0 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29  f( pAgg->isAgg )
15000 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15020 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d  de(pParse, pAgg-
15030 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
15040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15050 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
15060 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, i);.      }. 
15070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15080 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15090 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
150a0 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
150b0 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
150c0 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
150d0 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
150e0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
150f0 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
15100 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
15110 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
15120 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ->isAgg ) contin
15130 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
15140 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30  ( pAgg->pFunc!=0
15150 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15160 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78  ( pAgg->pFunc->x
15170 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
15180 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46   pDef = pAgg->pF
15190 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  unc;.      pE = 
151a0 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAgg->pExpr;.   
151b0 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
151c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
151d0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
151e0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
151f0 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
15200 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
15210 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
15220 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  List);.      sql
15230 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15240 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
15250 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
15260 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
15270 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
15280 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
15290 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
152a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21        for(j=0; !
152b0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72  pColl && j<nExpr
152c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
152d0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
152e0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
152f0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
15300 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
15310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15320 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
15330 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
15340 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
15350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
15360 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
15370 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
15380 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
15390 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
153a0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
153b0 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30  v, OP_AggFunc, 0
153c0 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29  , nExpr, (char*)
153d0 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52  pDef, P3_POINTER
153e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
153f0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
15400 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
15410 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
15420 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
15430 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
15440 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
15450 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
15460 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
15470 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
15480 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
15490 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
154a0 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
154b0 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
154c0 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
154d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
154e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
154f0 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20  int startagg;.  
15500 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c    startagg = sql
15510 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15520 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
15530 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61  endagg);.    pPa
15540 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b  rse->useAgg = 1;
15550 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
15560 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15570 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
15580 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
15590 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20  artagg, 1);.    
155a0 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  }.    if( select
155b0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
155c0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
155d0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
155e0 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67    iParm, startag
15610 67 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20  g, endagg, aff) 
15620 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
15630 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
15640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15650 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
15660 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20   0, startagg);. 
15670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15680 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
15690 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dagg);.    sqlit
156a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
156b0 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
156c0 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67     pParse->useAg
156d0 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
156e0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
156f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
15700 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
15710 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
15720 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
15730 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
15740 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
15750 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
15760 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
15770 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
15780 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
15790 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
157a0 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
157b0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
157c0 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61   subquery, we ha
157d0 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64  ve now converted
157e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
157f0 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  to a.  ** tempor
15800 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64  ary table.  So d
15810 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65  elete the subque
15820 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ry structure fro
15830 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a  m the parent.  *
15840 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  * to prevent thi
15850 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
15860 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
15870 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
15880 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  ce the.  ** the 
15890 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  use of the tempo
158a0 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
158b0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
158c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
158d0 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  arent->pSrc->nSr
158e0 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20  c>parentTab );. 
158f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
15900 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
15910 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d  ntTab].pSelect==
15920 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
15930 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b  SelectDelete(p);
15940 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
15950 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
15960 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
15970 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  }..  /* The SELE
15980 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
15990 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
159a0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
159b0 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
159c0 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
159d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
159e0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
159f0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
15a00 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
15a10 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
15a20 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
15a30 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
15a40 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
15a50 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
15a60 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
15a70 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
15a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15a90 0a                                               .