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

Artifact 5fa9db32e24f4c0f0ead43cfa59a6cfc3a452a15:


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 30 34  select.c,v 1.204
0200: 20 32 30 30 34 2f 30 38 2f 32 39 20 30 31 3a 33   2004/08/29 01:3
0210: 31 3a 30 35 20 64 72 68 20 45 78 70 20 24 0a 2a  1:05 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0a00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0a10: 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20 75 38 20  Keyword;.    u8 
0a20: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0a30: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0a40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0a50: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0a60: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0a70: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0a80: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0a90: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0aa0: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0ab0: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0ac0: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0ad0: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0ae0: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0af0: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0b00: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0b10: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0b20: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0b30: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0b40: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d 3b 0a  T_INNER },.  };.
0b50: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
0b60: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
0b70: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
0b80: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
0b90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
0ba0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
0bb0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
0bc0: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
0bd0: 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  j<sizeof(keyword
0be0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0bf0: 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20  ds[0]); j++){.  
0c00: 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65      if( p->n==ke
0c10: 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20  ywords[j].nChar 
0c20: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71  .          && sq
0c30: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 2d  lite3StrNICmp(p-
0c40: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
0c50: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
0c60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
0c70: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
0c80: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
0c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
0ca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
0cb0: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
0cc0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0cd0: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
0ce0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
0cf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
0d00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
0d10: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
0d20: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
0d30: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
0d40: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
0d50: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
0d60: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
0d70: 0a 20 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  .  ){.    static
0d80: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 20 3d 20 7b   Token dummy = {
0d90: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 63 68 61   0, 0 };.    cha
0da0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 2c 20 2a  r *zSp1 = " ", *
0db0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
0dc0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 70 42 20  if( pB==0 ){ pB 
0dd0: 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 31 20 3d  = &dummy; zSp1 =
0de0: 20 30 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43   0; }.    if( pC
0df0: 3d 3d 30 20 29 7b 20 70 43 20 3d 20 26 64 75 6d  ==0 ){ pC = &dum
0e00: 6d 79 3b 20 7a 53 70 32 20 3d 20 30 3b 20 7d 0a  my; zSp2 = 0; }.
0e10: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
0e20: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
0e30: 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e  ErrMsg, "unknown
0e40: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0e50: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 2c 20 30 2c  join type: ", 0,
0e60: 0a 20 20 20 20 20 20 20 70 41 2d 3e 7a 2c 20 70  .       pA->z, p
0e70: 41 2d 3e 6e 2c 20 7a 53 70 31 2c 20 31 2c 20 70  A->n, zSp1, 1, p
0e80: 42 2d 3e 7a 2c 20 70 42 2d 3e 6e 2c 20 7a 53 70  B->z, pB->n, zSp
0e90: 32 2c 20 31 2c 20 70 43 2d 3e 7a 2c 20 70 43 2d  2, 1, pC->z, pC-
0ea0: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
0eb0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0ec0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
0ed0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
0ee0: 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52   jointype & JT_R
0ef0: 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  IGHT ){.    sqli
0f00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
0f10: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
0f20: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
0f30: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
0f40: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
0f50: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
0f60: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0f70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
0f80: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
0f90: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
0fa0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
0fb0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
0fc0: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
0fd0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
0fe0: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
0ff0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1000: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
1010: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
1020: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
1030: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1040: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
1050: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
1070: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
1080: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
1090: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
10a0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
10b0: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
10c0: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
10d0: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
10e0: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
10f0: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
1100: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
1110: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
1120: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
1130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1140: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e  WhereTerm(.  con
1150: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1160: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1170: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1180: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1190: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
11a0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
11b0: 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32  nst Table *pTab2
11c0: 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  ,      /* Second
11d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
11e0: 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20   **ppExpr       
11f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1200: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f  equality term to
1210: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1220: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 64   */.){.  Token d
1230: 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a 70 45  ummy;.  Expr *pE
1240: 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63  1a, *pE1b, *pE1c
1250: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20  ;.  Expr *pE2a, 
1260: 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20  *pE2b, *pE2c;.  
1270: 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 64 75 6d  Expr *pE;..  dum
1280: 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b 0a 20 20 64  my.z = zCol;.  d
1290: 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  ummy.n = strlen(
12a0: 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d 6d 79 2e 64  zCol);.  dummy.d
12b0: 79 6e 20 3d 20 30 3b 0a 20 20 70 45 31 61 20 3d  yn = 0;.  pE1a =
12c0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
12d0: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
12e0: 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69  );.  pE2a = sqli
12f0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
1300: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
1310: 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62 31 2d  dummy.z = pTab1-
1320: 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e  >zName;.  dummy.
1330: 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d 6d 79  n = strlen(dummy
1340: 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20 73 71  .z);.  pE1b = sq
1350: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1360: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1370: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1380: 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  2->zName;.  dumm
1390: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
13a0: 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d 20  my.z);.  pE2b = 
13b0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
13c0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
13d0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
13e0: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
13f0: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1400: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1410: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62  xpr(TK_DOT, pE2b
1420: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1440: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
1450: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
1460: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1470: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20  romJoin);.  if( 
1480: 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a  *ppExpr ){.    *
1490: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
14a0: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70  Expr(TK_AND, *pp
14b0: 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20  Expr, pE, 0);.  
14c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 45 78  }else{.    *ppEx
14d0: 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a  pr = pE;.  }.}..
14e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
14f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
1500: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1510: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1520: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
1530: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1540: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
1550: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
1560: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
1570: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
1580: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
1590: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
15a0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
15b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
15c0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
15d0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
15e0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
15f0: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
1600: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
1610: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
1620: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
1630: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
1640: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
1650: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
1660: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
1670: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
1680: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
1690: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
16a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
16b0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
16c0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
16d0: 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
16e0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
16f0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1700: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
1710: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1720: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  (p->pLeft);.    
1730: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
1740: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
1750: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
1760: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
1770: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
1780: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1790: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
17a0: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
17b0: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
17c0: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
17d0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
17e0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
17f0: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
1800: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1810: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1820: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1830: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1840: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
1850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1860: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
1870: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1880: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
1890: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69  cList *pSrc;.  i
18a0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20  nt i, j;.  pSrc 
18b0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
18c0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
18d0: 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rc-1; i++){.    
18e0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18f0: 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 53  tem *pTerm = &pS
1900: 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  rc->a[i];.    st
1910: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1920: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 53 72  m *pOther = &pSr
1930: 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20  c->a[i+1];..    
1940: 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d  if( pTerm->pTab=
1950: 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54  =0 || pOther->pT
1960: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
1970: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
1980: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
1990: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
19a0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
19b0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
19c0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
19d0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
19e0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
19f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a00: 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pTerm->jointype
1a10: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
1a20: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
1a30: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ab;.      if( pT
1a40: 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72  erm->pOn || pTer
1a50: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1a60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1a80: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
1a90: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
1aa0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
1ab0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
1ac0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
1ad0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1ae0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 65 72 6d      pTab = pTerm
1af0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 66 6f  ->pTab;.      fo
1b00: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1b10: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1b20: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
1b30: 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c  ex(pOther->pTab,
1b40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1b50: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
1b60: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
1b70: 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  rm(pTab->aCol[j]
1b80: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20 70 4f  .zName, pTab, pO
1b90: 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e  ther->pTab, &p->
1ba0: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
1bb0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bc0: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
1bd0: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
1be0: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
1bf0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
1c00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
1c10: 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72 6d 2d  m->pOn && pTerm-
1c20: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
1c30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c40: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
1c50: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
1c60: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
1c70: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
1c80: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
1c90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ca0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1cb0: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
1cc0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1cd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
1ce0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
1cf0: 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65 72 61  ** and AND opera
1d00: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
1d10: 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 29  if( pTerm->pOn )
1d20: 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
1d30: 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e 29 3b  xpr(pTerm->pOn);
1d40: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57  .      if( p->pW
1d50: 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  here==0 ){.     
1d60: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
1d70: 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20 20  Term->pOn;.     
1d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d90: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
1da0: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
1db0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65 72 6d  p->pWhere, pTerm
1dc0: 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ->pOn, 0);.     
1dd0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
1de0: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
1df0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
1e00: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
1e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
1e20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
1e30: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
1e40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
1e50: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
1e60: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
1e70: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
1e80: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
1e90: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1ea0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
1eb0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
1ec0: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
1ed0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
1ee0: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
1ef0: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
1f00: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
1f10: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
1f20: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
1f30: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
1f40: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
1f50: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1f60: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
1f70: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
1f80: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1f90: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
1fa0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  IdList *pList;. 
1fb0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1fc0: 20 20 61 73 73 65 72 74 28 20 69 3c 70 53 72 63    assert( i<pSrc
1fd0: 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20 20 20  ->nSrc-1 );.    
1fe0: 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72 6d 2d    pList = pTerm-
1ff0: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2000: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2010: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2020: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2030: 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61 62 2c  dex(pTerm->pTab,
2040: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
2050: 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20 20 20  me)<0 ||.       
2060: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
2070: 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70  (pOther->pTab, p
2080: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
2090: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
20a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20b0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
20c0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
20d0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
20e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
20f0: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
2100: 68 20 74 61 62 6c 65 73 22 2c 20 70 4c 69 73 74  h tables", pList
2110: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[j].zName);. 
2120: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2130: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2140: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
2150: 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  m(pList->a[j].zN
2160: 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54 61 62  ame, pTerm->pTab
2170: 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20  , pOther->pTab, 
2180: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2190: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
21a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21b0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
21c0: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
21d0: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
21e0: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
21f0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2200: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2210: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2220: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2230: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2240: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69  stDelete(p->pELi
2250: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
2260: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  cListDelete(p->p
2270: 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Src);.  sqlite3E
2280: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68  xprDelete(p->pWh
2290: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
22a0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
22b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
22c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
22d0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
22e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
22f0: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2300: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2310: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2320: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  or);.  sqliteFre
2330: 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20  e(p->zSelect);. 
2340: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2350: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2360: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e  the aggregate in
2370: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2380: 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75  he parse structu
2390: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
23a0: 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  id sqliteAggrega
23b0: 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73  teInfoReset(Pars
23c0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
23d0: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
23e0: 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65  >aAgg);.  pParse
23f0: 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
2400: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
2410: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
2420: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2430: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
2440: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
2450: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
2460: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
2470: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
2480: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
2490: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
24a0: 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70  oSorter(Parse *p
24b0: 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20  Parse, Vdbe *v, 
24c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24d0: 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  By){.  int i;.  
24e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
24f0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
2500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2510: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f  rCode(pParse, pO
2520: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2530: 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pr);.  }.  sqlit
2540: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2550: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f  P_MakeRecord, pO
2560: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30  rderBy->nExpr, 0
2570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2580: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2590: 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Put, 0, 0);.}../
25a0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
25b0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
25c0: 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 0a  FFSET and LIMIT.
25d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
25e0: 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20 20 56 64  odeLimiter(.  Vd
25f0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
2600: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2610: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
2620: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2630: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
2640: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
2650: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
2660: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2670: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2680: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
2690: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
26a0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 2f   iBreak,       /
26b0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
26c0: 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  nd the loop */. 
26d0: 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20   int nPop       
26e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26f0: 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61  times to pop sta
2700: 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20  ck when jumping 
2710: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
2720: 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20  Offset>=0 ){.   
2730: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2740: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2750: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 69  dr(v) + 2;.    i
2760: 66 28 20 6e 50 6f 70 3e 30 20 29 20 61 64 64 72  f( nPop>0 ) addr
2770: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
2780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2790: 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73  emIncr, p->iOffs
27a0: 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69  et, addr);.    i
27b0: 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20  f( nPop>0 ){.   
27c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
27e0: 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Pop, 0);.    }. 
27f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2800: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
2810: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
2820: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d   }.  if( p->iLim
2830: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
2840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2850: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2860: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2870: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2880: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2890: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
28a0: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
28b0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
28c0: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
28d0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
28e0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
28f0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2900: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2910: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2920: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2930: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2940: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2950: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2960: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2970: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2980: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2990: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
29a0: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
29b0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
29c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
29d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
29e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a00: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2a10: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a30: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2a40: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2a50: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2a60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2a70: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2a80: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2a90: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2aa0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2ab0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2ac0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2ad0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2ae0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2af0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2b00: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2b10: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2b20: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2b30: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2b40: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2b50: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2b60: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2b70: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2b80: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2b90: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2ba0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2bb0: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2bc0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2bd0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2be0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2bf0: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2c00: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2c10: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2c20: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2c30: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2c40: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2c50: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2c60: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2c70: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2c90: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2ca0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2cb0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
2cc0: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
2cd0: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
2ce0: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
2cf0: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
2d00: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2d10: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2d20: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
2d30: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
2d40: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
2d50: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2d60: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
2d70: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2d80: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
2d90: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
2da0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2db0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2dc0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2dd0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2de0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2df0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2e00: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2e10: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
2e20: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
2e30: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
2e40: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
2e50: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
2e60: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
2e70: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
2e80: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
2e90: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
2ea0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
2eb0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
2ec0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
2ed0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
2ee0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
2ef0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
2f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
2f20: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
2f30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2f40: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
2f50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
2f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
2f70: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
2f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f90: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2fa0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
2fb0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
2fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
2fd0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
2fe0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
2ff0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3000: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3010: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3020: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3030: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3040: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3050: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3060: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3070: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
3080: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30a0: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
30b0: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
30c0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
30d0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
30e0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
30f0: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
3100: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
3110: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
3120: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3130: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
3140: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3160: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
3170: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
3180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3190: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
31a0: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
31b0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
31c0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
31d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31e0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
31f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
3200: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3210: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3220: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3230: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3240: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3250: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
3260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3270: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
3280: 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29  ey, distinct, 0)
3290: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
32a0: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  By==0 ){.      c
32b0: 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c  odeLimiter(v, p,
32c0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65   iContinue, iBre
32d0: 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ak, nColumn);.  
32e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
32f0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
3300: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
3310: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
3320: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
3330: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
3340: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
3350: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3360: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
3370: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
3380: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3390: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
33a0: 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57  Column, NULL_ALW
33b0: 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20  AYS_DISTINCT);. 
33c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
33e0: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3410: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
3420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3430: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3440: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
3450: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3460: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
3470: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
3480: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
3490: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
34a0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
34b0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
34c0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
34d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
34f0: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3500: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3510: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3520: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3530: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3540: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3550: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3560: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3570: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
3580: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35a0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
35b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
35c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
35d0: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50  OP_PutIntKey, iP
35e0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
35f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3600: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
3610: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
3620: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
3630: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
3640: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
3650: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
3660: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
3670: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
3680: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
3690: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
36a0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
36b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
36c0: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
36d0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
36e0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
36f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3700: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3710: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3720: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71  TINCT);.      sq
3730: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3740: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
3750: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
3760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3770: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
3780: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
3790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
37b0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b  lete, iParm, 0);
37c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
37d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77    }..    /* If w
37e0: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
37f0: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
3800: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
3810: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
3820: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
3830: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
3840: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
3850: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
3860: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
3870: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
3880: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
3890: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
38a0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
38b0: 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
38c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
38d0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
38e0: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
38f0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
3900: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
3910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3920: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
3930: 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20  , addr1+3);.    
3940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3950: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
3960: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32   0);.      addr2
3970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3980: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3990: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
39a0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
39b0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
39c0: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
39d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
39e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
39f0: 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66 53 74  har const *affSt
3a00: 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  r;.        char 
3a10: 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36  aff = (iParm>>16
3a20: 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  )&0xFF;.        
3a30: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
3a40: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
3a50: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
3a60: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 61   aff);.        a
3a70: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
3a80: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66  ffinityString(af
3a90: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
3aa0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
3ab0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
3ac0: 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54  0, affStr, P3_ST
3ad0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
3ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3af0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3b00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3b10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3b20: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3b30: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3b40: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3b60: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3b70: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3b80: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3b90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ba0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3bb0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3bc0: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3bd0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3be0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3bf0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3c00: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3c10: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3c20: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3c30: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3c40: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3c50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
3c60: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
3c70: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3c80: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3c90: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3ca0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3cb0: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3cc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3ce0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3cf0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
3d00: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
3d10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3d20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3d30: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d50: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3d60: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3d70: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3d80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3d90: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3da0: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3db0: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3dc0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3de0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3df0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3e00: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3e10: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3e20: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3e30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3e40: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
3e50: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
3e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
3e70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3e80: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
3e90: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
3ea0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3eb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
3ec0: 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  oke a subroutine
3ed0: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72   to handle the r
3ee0: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62  esults.  The sub
3ef0: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20  routine itself. 
3f00: 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73     ** is respons
3f10: 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67  ible for popping
3f20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66   the results off
3f30: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
3f40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3f50: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
3f60: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3f70: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
3f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3f90: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3fa0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3fb0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
3fc0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
3fd0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
3fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4000: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
4010: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
4020: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4030: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
4040: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
4050: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4060: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4070: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4080: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4090: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
40a0: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
40b0: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
40c0: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
40d0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
40e0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
40f0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
4100: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
4110: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
4120: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
4130: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
4140: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4150: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4160: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4190: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
41a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
41b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
41c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
41d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
41e0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
41f0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
4200: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
4210: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
4220: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
4230: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
4240: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4250: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4260: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4270: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4280: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4290: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
42a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
42b0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
42c0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
42d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
42e0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
42f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4300: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
4310: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4320: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4330: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
4340: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4350: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4360: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4370: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4380: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4390: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
43a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
43b0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
43c0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
43d0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
43e0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
43f0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
4400: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
4410: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
4420: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
4430: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
4440: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4450: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4460: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4470: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4480: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4490: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
44a0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
44b0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
44c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
44d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
44e0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 6f  f( eDest==SRT_So
44f0: 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  rter ) return;. 
4500: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
4510: 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c 20  OrderBy;.  nCol 
4520: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
4530: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
4540: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
4550: 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f 6c  f(*pInfo) + nCol
4560: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
4570: 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  *)+1) );.  if( p
4580: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
4590: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74  ;.  pInfo->aSort
45a0: 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29 26  Order = (char*)&
45b0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  pInfo->aColl[nCo
45c0: 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  l];.  pInfo->nFi
45d0: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66 6f  eld = nCol;.  fo
45e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
45f0: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  ++){.    /* If a
4600: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
4610: 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69 65  nce was specifie
4620: 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68 65  d explicity, the
4630: 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 73  n it.    ** is s
4640: 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72 42  tored in pOrderB
4650: 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20 4f  y->a[i].zName. O
4660: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
4670: 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  e default.    **
4680: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
4690: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
46a0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
46b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
46c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
46d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64  Seq(pParse, pOrd
46e0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
46f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e 66  );.    if( !pInf
4700: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
4710: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
4720: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
4730: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
4740: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
4750: 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
4760: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
4770: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4780: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  beOp3(v, OP_Sort
4790: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70  , 0, 0, (char*)p
47a0: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
47b0: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64 64  _HANDOFF);.  add
47c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
47d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e  ddOp(v, OP_SortN
47e0: 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20  ext, 0, end1);. 
47f0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20   codeLimiter(v, 
4800: 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20 31  p, addr, end2, 1
4810: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
4820: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
4830: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
4840: 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  se SRT_TempTable
4850: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4860: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4870: 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d  _NewRecno, iParm
4880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4890: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
48a0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
48b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
48c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
48d0: 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  IntKey, iParm, 0
48e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
48f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4900: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
4910: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4920: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
4930: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4940: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
4950: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
4960: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4980: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4990: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
49a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
49b0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
49c0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
49d0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
49e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
49f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4a00: 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f  , 1, 0, "n", P3_
4a10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
4a20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a30: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
4a40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4a60: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69  OP_PutStrKey, (i
4a70: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
4a80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4a90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4aa0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
4ab0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4ac0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4ad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4ae0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
4af0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
4b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b10: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4b20: 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62 72   end1);.      br
4b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4b40: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
4b50: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
4b60: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
4b70: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
4b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4ba0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
4bb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4bd0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
4be0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4bf0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4c00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4c10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4c20: 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b  olumn, -1-i, i);
4c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4c40: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
4c50: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
4c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4c70: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
4c80: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
4c90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
4cc0: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
4cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4cf0: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
4d00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d10: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
4d20: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
4d30: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
4d40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d60: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4d70: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
4d80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
4d90: 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73 71  l(v, end2);.  sq
4da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4db0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4dc0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
4dd0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
4de0: 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  d1);.  sqlite3Vd
4df0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4e00: 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a  rtReset, 0, 0);.
4e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
4e30: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
4e40: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
4e50: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
4e60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
4e70: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
4e80: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
4e90: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
4ea0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aller..**.** If 
4eb0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
4ec0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
4ed0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
4ee0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
4ef0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67  from.** the orig
4f00: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
4f10: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
4f20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4f30: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a   a column..** .*
4f40: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
4f50: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78  n type for an ex
4f60: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68  pression is eith
4f70: 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43  er TEXT, NUMERIC
4f80: 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20   or ANY..** The 
4f90: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
4fa0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
4fb0: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a  ld is INTEGER..*
4fc0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
4fd0: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
4fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
4ff0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5000: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5010: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
5020: 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  ype;.  int j;.  
5030: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
5040: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72 65  pTabList==0 ) re
5050: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
5060: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5070: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
5080: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c  MN: {.      Tabl
5090: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
50a0: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
50b0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
50c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
50d0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
50e0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
50f0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
5100: 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  le; j++){}.     
5110: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
5120: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
5130: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
5140: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
5150: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5160: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
5170: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
5180: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
5190: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
51a0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
51b0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
51c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70   ){.        zTyp
51d0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
51e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
51f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
5200: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
5210: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
5220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5230: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20     case TK_AS:. 
5240: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
5250: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20  umnType(pParse, 
5260: 70 54 61 62 4c 69 73 74 2c 20 70 45 78 70 72 2d  pTabList, pExpr-
5270: 3e 70 4c 65 66 74 29 3b 20 0a 20 20 20 20 20 20  >pLeft); .      
5280: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5290: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
52a0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
52b0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
52c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
52d0: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c  lumnType(pParse,
52e0: 20 70 53 2d 3e 70 53 72 63 2c 20 70 53 2d 3e 70   pS->pSrc, pS->p
52f0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
5300: 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  r); .      break
5310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
5320: 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79 70 65  ult:.      zType
5330: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 72   = 0;.  }.  .  r
5340: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
5350: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
5360: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
5370: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
5380: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5390: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
53a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
53b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
53c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
53d0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
53e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
53f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5400: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
5410: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
5420: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
5430: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
5440: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
5450: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
5460: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
5470: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5480: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5490: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
54a0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
54b0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
54c0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
54d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
54e0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
54f0: 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73  columnType(pPars
5500: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 29 3b  e, pTabList, p);
5510: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  .    if( zType==
5520: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5530: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
5540: 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e  st make it's own
5550: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
5560: 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61 73  umn-type, in cas
5570: 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 63  e the .    ** sc
5580: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
5590: 66 6f 72 65 20 74 68 69 73 20 76 69 72 74 75 61  fore this virtua
55a0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
55b0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
55c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
55d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69  olName(v, i+pELi
55e0: 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65  st->nExpr, zType
55f0: 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29  , strlen(zType))
5600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
5610: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
5620: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
5630: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
5640: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
5650: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
5660: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
5670: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
5680: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
5690: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
56a0: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
56b0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
56c0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
56d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
56e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
56f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
5700: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
5710: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
5720: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
5730: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
5740: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
5750: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
5760: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
5770: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5780: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
5790: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
57a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
57b0: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
57c0: 74 4e 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  tNames;..  /* If
57d0: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
57e0: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
57f0: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
5800: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
5810: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5820: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
5830: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
5840: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
5850: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
5860: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
5870: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
5880: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
5890: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
58a0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
58b0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
58c0: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
58d0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
58e0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
58f0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
5900: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
5910: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
5920: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
5930: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
5940: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
5950: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
5960: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
5970: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
5980: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5990: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
59a0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
59b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
59c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
59d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
59e0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
59f0: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
5a00: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
5a10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
5a20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
5a30: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
5a40: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
5a50: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
5a60: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
5a70: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5a80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
5a90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
5aa0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
5ab0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
5ac0: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
5ad0: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
5ae0: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
5af0: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
5b00: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
5b10: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
5b20: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
5b30: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
5b40: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
5b50: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
5b60: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
5b70: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
5b80: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
5b90: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
5ba0: 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20  "_ROWID_";.     
5bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5bc0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
5bd0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
5be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5bf0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
5c00: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
5c10: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
5c20: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
5c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5c40: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70  tColName(v, i, p
5c50: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
5c60: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n.n);.      }els
5c70: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
5c80: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
5c90: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
5ca0: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
5cb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
5cc0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5cd0: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
5ce0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5cf0: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
5d00: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
5d10: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
5d20: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
5d30: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
5d40: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
5d50: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
5d60: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
5d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
5d80: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e  ColName(v, i, zN
5d90: 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  ame, P3_DYNAMIC)
5da0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5db0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5dc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5dd0: 69 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  i, zCol, 0);.   
5de0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
5df0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
5e00: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
5e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5e20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
5e30: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
5e40: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f  span.n);.      /
5e50: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  * sqlite3VdbeCom
5e60: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
5e70: 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  dr); */.    }els
5e80: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
5e90: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
5ea0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
5eb0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
5ec0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
5ed0: 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22  sprintf(zName, "
5ee0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
5ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5f00: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5f10: 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i, zName, 0);.  
5f20: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
5f30: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
5f40: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
5f50: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
5f60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
5f70: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
5f80: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
5f90: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
5fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5fb0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
5fc0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
5fd0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
5fe0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
5ff0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
6000: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
6010: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6020: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
6030: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
6040: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
6050: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
6060: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
6070: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
6080: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
6090: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
60a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
60b0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
60c0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
60d0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
60e0: 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  t fillInColumnLi
60f0: 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  st(Parse*, Selec
6100: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
6110: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
6120: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
6130: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6140: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
6150: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
6160: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
6170: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
6180: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
6190: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
61a0: 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  se, char *zTabNa
61b0: 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  me, Select *pSel
61c0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
61d0: 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Tab;.  int i, j;
61e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
61f0: 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  ist;.  Column *a
6200: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  Col, *pCol;..  i
6210: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
6220: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
6230: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
6240: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
6250: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6260: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
6270: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6290: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  .  }.  pTab->zNa
62a0: 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20  me = zTabName ? 
62b0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61  sqliteStrDup(zTa
62c0: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
62d0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
62e0: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
62f0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
6300: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
6310: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6320: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61    pTab->aCol = a
6330: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Col = sqliteMall
6340: 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  oc( sizeof(pTab-
6350: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
6360: 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nCol );.  for(i=
6370: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
6380: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
6390: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78   pCol++){.    Ex
63a0: 70 72 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  pr *pR;.    char
63b0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 45 78 70   *zType;.    Exp
63c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
63d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
63e0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
63f0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
6400: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20  ->token.z==0 || 
6410: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
6420: 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  .z[0]!=0 );.    
6430: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6440: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6450: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pCol->zName = sq
6460: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
6470: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
6480: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6490: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
64b0: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
64c0: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
64d0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
64e0: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ] ){.      int c
64f0: 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nt;.      sqlite
6500: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 43 6f  3SetNString(&pCo
6510: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f  l->zName, pR->to
6520: 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e  ken.z, pR->token
6530: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  .n, 0);.      fo
6540: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
6550: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
6560: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6570: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
6580: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  pCol->zName)==0 
6590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
65a0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68   n;.          ch
65b0: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
65c0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
65d0: 42 75 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74 29  Buf,"_%d",++cnt)
65e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
65f0: 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
6600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6610: 65 74 4e 53 74 72 69 6e 67 28 26 70 43 6f 6c 2d  etNString(&pCol-
6620: 3e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65  >zName, pR->toke
6630: 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pR->token.n
6640: 2c 20 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20  , zBuf,n,0);.   
6650: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
6660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6670: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
6680: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
6690: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
66a0: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
66b0: 69 6e 67 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ing(&pCol->zName
66c0: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
66d0: 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  span.n, 0);.    
66e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
66f0: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
6700: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
6710: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
6720: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
6730: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
6740: 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a  up(zBuf);.    }.
6750: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6760: 74 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  te(pCol->zName);
6770: 0a 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ..    zType = sq
6780: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d  liteStrDup(colum
6790: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20 70 53  nType(pParse, pS
67a0: 65 6c 65 63 74 2d 3e 70 53 72 63 20 2c 70 29 29  elect->pSrc ,p))
67b0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  ;.    pCol->zTyp
67c0: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
67d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
67e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
67f0: 49 43 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  IC;.    if( zTyp
6800: 65 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  e ){.      pCol-
6810: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
6820: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
6830: 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54  zType, strlen(zT
6840: 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ype));.    }.   
6850: 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73   pCol->pColl = s
6860: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6870: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
6880: 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f    if( !pCol->pCo
6890: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
68a0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ->pColl = pParse
68b0: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
68c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
68d0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
68e0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
68f0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67  ./*.** For the g
6900: 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
6910: 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20  ement, do three 
6920: 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  things..**.**   
6930: 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (1)  Fill in th
6940: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
6950: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
6960: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
6970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
6980: 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 74  nes the set of t
6990: 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c  ables that shoul
69a0: 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 20 46  d be scanned.  F
69b0: 6f 72 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20  or views,.**    
69c0: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
69d0: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
69e0: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
69f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6a00: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
6a10: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
6a20: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
6a30: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
6a40: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
6a50: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
6a60: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
6a70: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
6a80: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
6a90: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
6aa0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
6ab0: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
6ac0: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
6ad0: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
6ae0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
6af0: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
6b00: 2a 20 20 20 20 28 32 29 20 20 41 64 64 20 74 65  *    (2)  Add te
6b10: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
6b20: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
6b30: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
6b40: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
6b50: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
6b60: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
6b70: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
6b80: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ns..**.**    (3)
6b90: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
6ba0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
6bb0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
6bc0: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
6bd0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
6be0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
6bf0: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
6c00: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
6c10: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
6c20: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
6c30: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
6c40: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
6c50: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
6c60: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
6c70: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
6c80: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
6c90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
6ca0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
6cb0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
6cc0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
6cd0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
6ce0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
6cf0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
6d00: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
6d10: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20  olumnList(Parse 
6d20: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
6d30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
6d40: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
6d50: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
6d60: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
6d70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
6d80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
6d90: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
6da0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
6db0: 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSrc==0 ) return
6dc0: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
6dd0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
6de0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
6df0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
6e00: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ery table in the
6e10: 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a   table list..  *
6e20: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
6e30: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
6e40: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
6e50: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
6e60: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
6e70: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pTab ){.      /*
6e80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
6e90: 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20 4e  s run before!  N
6ea0: 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e  o need to contin
6eb0: 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ue */.      retu
6ec0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6ed0: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
6ee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6ef0: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
6f00: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
6f10: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
6f20: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
6f30: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  m->pSelect!=0 );
6f40: 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
6f50: 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ->zAlias==0 ){. 
6f60: 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b         char zFak
6f70: 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20  eName[60];.     
6f80: 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65     sprintf(zFake
6f90: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75  Name, "sqlite_su
6fa0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
6fb0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
6fc0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
6fd0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
6fe0: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 7a 46  From->zAlias, zF
6ff0: 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  akeName, 0);.   
7000: 20 20 20 7d 0a 20 20 20 20 20 20 70 46 72 6f 6d     }.      pFrom
7010: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
7020: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7030: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
7040: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
7050: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
7060: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7070: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
7080: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
70a0: 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e  * The isTransien
70b0: 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
70c0: 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20   that the Table 
70d0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
70e0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61  en.      ** dyna
70f0: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
7100: 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65  d and may be fre
7110: 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20  ed at any time. 
7120: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
7130: 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69  .      ** pTab i
7140: 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
7150: 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74  o a persistent t
7160: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
7170: 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20  hat defines.    
7180: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
7190: 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20   schema. */.    
71a0: 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69    pTab->isTransi
71b0: 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ent = 1;.    }el
71c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
71d0: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
71e0: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
71f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7200: 2f 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  /.      pFrom->p
7210: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
7220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
7230: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
7240: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72  pFrom->zName,pFr
7250: 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om->zDatabase);.
7260: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7270: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7280: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7290: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
72a0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
72b0: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
72c0: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
72d0: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
72e0: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
72f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
7300: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
7310: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
7320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
7330: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
7340: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
7350: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
7360: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
7370: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
7380: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
7390: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
73a0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
73b0: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
73c0: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
73d0: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
73e0: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
73f0: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
7400: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
7410: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7420: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
7430: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7440: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
7450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7460: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
7470: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7480: 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  p(pTab->pSelect)
7490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
74a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
74b0: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
74c0: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
74d0: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
74e0: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
74f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
7500: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
7510: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
7520: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
7530: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
7540: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
7550: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
7560: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
7570: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
7580: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
7590: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
75a0: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
75b0: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
75c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
75d0: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
75e0: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
75f0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
7600: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
7610: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
7620: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
7630: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
7640: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
7650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
7660: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
7670: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
7680: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
7690: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
76a0: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
76b0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
76c0: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
76d0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
76e0: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
76f0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
7700: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
7710: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
7720: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
7730: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
7740: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
7750: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
7760: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
7770: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
7780: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
7790: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
77a0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
77b0: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
77c0: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
77d0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
77e0: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
77f0: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
7800: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
7810: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
7820: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
7830: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
7840: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
7850: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
7860: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7870: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
7880: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
7890: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
78a0: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
78b0: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
78c0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
78d0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
78e0: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
78f0: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
7900: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
7910: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7920: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
7930: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
7940: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
7950: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
7960: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
7970: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
7980: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
7990: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
79a0: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
79b0: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
79c0: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
79d0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
79e0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
79f0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
7a00: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
7a10: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
7a20: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
7a30: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
7a40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
7a50: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
7a60: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
7a70: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
7a80: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
7a90: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
7aa0: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
7ab0: 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  e;.        a[k].
7ac0: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
7ad0: 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
7ae0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
7af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
7b00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7b10: 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
7b20: 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
7b30: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
7b40: 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
7b50: 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
7b60: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
7b70: 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
7b80: 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
7b90: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
7ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7bb0: 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
7bc0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
7bd0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
7be0: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66  _DOT && pE->pLef
7bf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
7c00: 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  TName = sqlite3N
7c10: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
7c20: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b  ->pLeft->token);
7c30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7c40: 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
7c50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7c60: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
7c70: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
7c80: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
7c90: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
7ca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
7cb0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
7cc0: 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
7cd0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
7ce0: 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
7cf0: 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  as;.          if
7d00: 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c  ( zTabName==0 ||
7d10: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
7d20: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
7d30: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
7d40: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7d50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7d60: 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61  ( zTName && (zTa
7d70: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7d80: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7db0: 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
7dc0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
7dd0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7de0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7df0: 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
7e00: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
7e10: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
7e20: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
7e30: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7e40: 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  r, *pLeft, *pRig
7e50: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
7e60: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
7e70: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
7e80: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
7e90: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
7ea0: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
7eb0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
7ec0: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
7ed0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
7ee0: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
7ef0: 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61  a[i-1].pTab, zNa
7f00: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7f10: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7f20: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
7f30: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
7f40: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7f60: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7f70: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
7f80: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7f90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7fa0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7fb0: 26 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  & sqlite3IdListI
7fc0: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
7fd0: 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  [i-1].pUsing, zN
7fe0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
7ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
8000: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
8010: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
8020: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8040: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
8050: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
8060: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
8070: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8080: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8090: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
80a0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
80b0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
80c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
80d0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
80e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
80f0: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
8100: 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  n.z = zName;.   
8110: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
8120: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
8130: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
8140: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
8150: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
8160: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
8170: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
8180: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
8190: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
81a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
81b0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
81d0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
81e0: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
81f0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
8200: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8210: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
8220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8230: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Left->token.z = 
8240: 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zTabName;.      
8250: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
8260: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
8270: 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
8280: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
8290: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
82b0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 28 63  ite3SetString((c
82c0: 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70  har**)&pExpr->sp
82d0: 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  an.z, zTabName, 
82e0: 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ".", zName, 0);.
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8300: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74  xpr->span.n = st
8310: 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e  rlen(pExpr->span
8320: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .z);.           
8330: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
8340: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
8350: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8360: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
8370: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8380: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
8390: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
83a0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
83c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
83d0: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
83e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
83f0: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
8400: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
8410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8420: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8430: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8440: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
8450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8470: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
8480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8490: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
84a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
84b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
84c0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
84d0: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
84e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
84f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8510: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
8520: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
8530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8540: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
8550: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
8560: 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  Free(zTName);.  
8570: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8590: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
85a0: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
85b0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
85c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
85d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
85e0: 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20  rsively unlinks 
85f0: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e  the Select.pSrc.
8600: 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72  a[].pTab pointer
8610: 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74  s.** in a select
8620: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
8630: 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f  just sets the po
8640: 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20  inters to NULL. 
8650: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
8660: 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e   is recursive in
8670: 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
8680: 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  if the Select.pS
8690: 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a  rc.a[].pSelect.*
86a0: 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  * pointer is not
86b0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74   NULL, this rout
86c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
86d0: 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61  cursively on tha
86e0: 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  t pointer..**.**
86f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8700: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53   called on the S
8710: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
8720: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a  that defines a.*
8730: 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20  * VIEW in order 
8740: 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64  to undo any bind
8750: 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20  ings to tables. 
8760: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
8770: 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  ry.** because th
8780: 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74  ose tables might
8790: 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20   be DROPed by a 
87a0: 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63  subsequent SQL c
87b0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68  ommand..** If th
87c0: 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e  e bindings are n
87d0: 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e  ot removed, then
87e0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
87f0: 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
8800: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  .** will be left
8810: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64   pointing to a d
8820: 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65  eallocated Table
8830: 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72   structure after
8840: 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64   the.** DROP and
8850: 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c   a coredump will
8860: 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74 20   occur the next 
8870: 74 69 6d 65 20 74 68 65 20 56 49 45 57 20 69 73  time the VIEW is
8880: 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
8890: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
88a0: 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  nd(Select *p){. 
88b0: 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
88c0: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
88d0: 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  c;.  Table *pTab
88e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
88f0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8900: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
8910: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  i++){.    if( (p
8920: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  Tab = pSrc->a[i]
8930: 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20  .pTab)!=0 ){.   
8940: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
8950: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
8960: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
8970: 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b  eTable(0, pTab);
8980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8990: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  Src->a[i].pTab =
89a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   0;.      if( pS
89b0: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
89c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
89d0: 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  te3SelectUnbind(
89e0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
89f0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
8a00: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8a10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
8a20: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
8a30: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
8a40: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
8a50: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
8a60: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
8a70: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
8a80: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
8a90: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
8aa0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8ab0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
8ac0: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
8ad0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
8ae0: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
8af0: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
8b00: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
8b10: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
8b20: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
8b30: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
8b40: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
8b50: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
8b60: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
8b70: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
8b80: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
8b90: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
8ba0: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
8bb0: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
8bc0: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
8bd0: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
8be0: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
8bf0: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
8c00: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
8c10: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
8c20: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
8c30: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
8c40: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
8c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
8c60: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
8c70: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
8c80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
8c90: 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61  * A place to lea
8ca0: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
8cb0: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
8cc0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f  Select,        /
8cd0: 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c  * Match to resul
8ce0: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69  t columns of thi
8cf0: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78  s SELECT */.  Ex
8d00: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
8d10: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
8d20: 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20  ER BY values to 
8d30: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f  match against co
8d40: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lumns */.  int i
8d50: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
8d60: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
8d70: 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c  s value in iTabl
8d80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43  e */.  int mustC
8d90: 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f  omplete        /
8da0: 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52  * If TRUE all OR
8db0: 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74  DER BYs must mat
8dc0: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ch */.){.  int n
8dd0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
8de0: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
8df0: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
8e00: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
8e10: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
8e20: 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74  rn 1;.  if( must
8e30: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
8e40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8e50: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8e60: 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  { pOrderBy->a[i]
8e70: 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d  .done = 0; }.  }
8e80: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
8e90: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
8ea0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
8eb0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
8ec0: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  if( pSelect->pPr
8ed0: 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  ior ){.    if( m
8ee0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
8ef0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c  umn(pParse, pSel
8f00: 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72  ect->pPrior, pOr
8f10: 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30  derBy, iTable, 0
8f20: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8f30: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
8f40: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
8f50: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  t->pEList;.  for
8f60: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
8f70: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8f80: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
8f90: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
8fa0: 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  pr;.    int iCol
8fb0: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
8fc0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
8fd0: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
8fe0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
8ff0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
9000: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
9010: 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
9020: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
9030: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
9040: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9050: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
9060: 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f  ORDER BY positio
9070: 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62  n %d should be b
9080: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
9090: 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  ,.          iCol
90a0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
90b0: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
90c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
90d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
90e0: 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65  f( !mustComplete
90f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9100: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
9110: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43  .    for(j=0; iC
9120: 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74  ol<0 && j<pEList
9130: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
9140: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
9150: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
9160: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
9170: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
9180: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
9190: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
91a0: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
91b0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
91c0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
91d0: 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   zLabel = sqlite
91e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26  3NameFromToken(&
91f0: 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pE->token);.    
9200: 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62      assert( zLab
9210: 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  el!=0 );.       
9220: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9230: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
9240: 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  l)==0 ){ .      
9250: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
9260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9270: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65  sqliteFree(zLabe
9280: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
9290: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
92a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
92b0: 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61  re(pE, pEList->a
92c0: 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [j].pExpr) ){.  
92d0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
92e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92f0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
9300: 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20  .      pE->op = 
9310: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
9320: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
9330: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  Col;.      pE->i
9340: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
9350: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
9360: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20  a[i].done = 1;. 
9370: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
9380: 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c  l<0 && mustCompl
9390: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ete ){.      sql
93a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
93b0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52  rse,.        "OR
93c0: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
93d0: 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d  er %d does not m
93e0: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
93f0: 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20  column", i+1);. 
9400: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
9410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
9430: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  r;  .}../*.** Ge
9440: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
9450: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
9460: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
9470: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
9480: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
9490: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
94a0: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
94b0: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
94c0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
94d0: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
94e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
94f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
9500: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
9510: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
9520: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
9530: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
9540: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
9550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
9560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
9570: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
9580: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
9590: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
95a0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c  sed on the.** nL
95b0: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
95c0: 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74   fields.  nLimit
95d0: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c   and nOffset hol
95e0: 64 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a  d the integers.*
95f0: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
9600: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
9610: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
9620: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
9630: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
9640: 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c  ds.  Or that hol
9650: 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68  d -1 and 0 if th
9660: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
9670: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69   omitted..** iLi
9680: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
9690: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
96a0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
96b0: 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63  numbers for.** c
96c0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
96d0: 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  compute the limi
96e0: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
96f0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a  f there is no.**
9700: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
9710: 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69  fset, then iLimi
9720: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
9730: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
9740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9750: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
9760: 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s if iLimit and 
9770: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
9780: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
9790: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
97a0: 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f  by nLimit and nO
97b0: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
97c0: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
97d0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
97e0: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
97f0: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
9800: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
9810: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
9820: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
9830: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
9840: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69  ..** Only if nLi
9850: 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65  mit>=0 or nOffse
9860: 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  t>0 do the limit
9870: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
9880: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
9890: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
98a0: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
98b0: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
98c0: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
98d0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
98e0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
98f0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
9900: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
9910: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
9920: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
9930: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
9940: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
9950: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20  elect *p){.  /* 
9960: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  .  ** If the com
9970: 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c  parison is p->nL
9980: 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d  imit>0 then "LIM
9990: 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a  IT 0" shows.  **
99a0: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69   all rows.  It i
99b0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f  s the same as no
99c0: 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63   limit. If the c
99d0: 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20  omparision is.  
99e0: 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  ** p->nLimit>=0 
99f0: 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73  then "LIMIT 0" s
9a00: 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61  how no rows at a
9a10: 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  ll..  ** "LIMIT 
9a20: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
9a30: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
9a40: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
9a50: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
9a60: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
9a70: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
9a80: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
9a90: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
9aa0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
9ab0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
9ac0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
9ad0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
9ae0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
9af0: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
9b00: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56  e->nMem++;.    V
9b10: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9b20: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9b30: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
9b40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
9b50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9b60: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e  OP_Integer, -p->
9b70: 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  nLimit, 0);.    
9b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9b90: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
9ba0: 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70   iMem, 1);.    p
9bb0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b  ->iLimit = iMem;
9bc0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  .  }.  if( p->nO
9bd0: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69  ffset>0 ){.    i
9be0: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
9bf0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
9c00: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9c10: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9c20: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
9c30: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
9c40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9c50: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
9c60: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
9c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9c80: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
9c90: 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70   iMem, 1);.    p
9ca0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d  ->iOffset = iMem
9cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
9cc0: 65 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e 73  enerate VDBE ins
9cd0: 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77  tructions that w
9ce0: 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73  ill open a trans
9cf0: 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a  ient table that.
9d00: 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ** will be used 
9d10: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  for an index or 
9d20: 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72  to store keyed r
9d30: 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d  esults for a com
9d40: 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e  pound.** select.
9d50: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9d60: 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65  , open a transie
9d70: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65  nt table that ne
9d80: 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f  eds a.** KeyInfo
9d90: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
9da0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
9db0: 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66  ns in the KeyInf
9dc0: 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  o is determined.
9dd0: 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c 74  ** by the result
9de0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
9df0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
9e00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
9e10: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ent..**.** Speci
9e20: 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  fically, this ro
9e30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9e40: 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78  to open an index
9e50: 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49   table for.** DI
9e60: 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49  STINCT, UNION, I
9e70: 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43  NTERSECT and EXC
9e80: 45 50 54 20 73 65 6c 65 63 74 20 73 74 61 74 65  EPT select state
9e90: 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a  ments (but not .
9ea0: 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a  ** UNION ALL)..*
9eb0: 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65  *.** Make the ne
9ec0: 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44  w table a KeyAsD
9ed0: 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79  ata table if key
9ee0: 41 73 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a  AsData is true..
9ef0: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
9f00: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
9f10: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
9f20: 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72  P_OpenTemp instr
9f30: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
9f40: 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e  c int openTempIn
9f50: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
9f60: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
9f70: 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41  t iTab, int keyA
9f80: 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66  sData){.  KeyInf
9f90: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
9fa0: 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71  nt nColumn;.  sq
9fb0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
9fc0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
9fd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9fe0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
9ff0: 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 66 69   addr;..  if( fi
a000: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
a010: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
a020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a030: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45   nColumn = p->pE
a040: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
a050: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
a060: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
a070: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d  pKeyInfo)+nColum
a080: 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  n*sizeof(CollSeq
a090: 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  *) );.  if( pKey
a0a0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
a0b0: 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e   0;.  pKeyInfo->
a0c0: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
a0d0: 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66  ->enc;.  pKeyInf
a0e0: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
a0f0: 75 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  umn;.  for(i=0; 
a100: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
a110: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  .    pKeyInfo->a
a120: 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
a130: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
a140: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
a150: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
a160: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e   if( !pKeyInfo->
a170: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
a180: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
a190: 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74  l[i] = db->pDflt
a1a0: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Coll;.    }.  }.
a1b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
a1c0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
a1d0: 65 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c  enTemp, iTab, 0,
a1e0: 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 70   .      (char*)p
a1f0: 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
a200: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
a210: 69 66 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b  if( keyAsData ){
a220: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
a240: 73 44 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b  sData, iTab, 1);
a250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
a260: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 49 58  dr;.}../*.** FIX
a270: 20 4d 45 3a 0a 2a 2a 20 20 20 20 2b 20 20 4f 6d   ME:.**    +  Om
a280: 69 74 20 74 68 65 20 70 70 4f 70 65 6e 54 65 6d  it the ppOpenTem
a290: 70 20 70 61 72 61 6d 65 74 65 72 20 66 72 6f 6d  p parameter from
a2a0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
a2b0: 54 65 6d 70 41 64 64 72 28 29 2e 0a 2a 2a 20 20  TempAddr()..**  
a2c0: 20 20 2b 20 20 41 74 74 61 63 68 20 70 4f 70 65    +  Attach pOpe
a2d0: 6e 4c 69 73 74 20 74 6f 20 74 68 65 20 72 69 67  nList to the rig
a2e0: 68 74 2d 6d 6f 73 74 20 74 65 72 6d 20 61 6c 77  ht-most term alw
a2f0: 61 79 73 2e 0a 2a 2a 20 20 20 20 2b 20 20 4d 61  ays..**    +  Ma
a300: 6b 65 20 73 75 72 65 20 53 65 6c 65 63 74 2e 70  ke sure Select.p
a310: 70 4f 70 65 6e 54 65 6d 70 20 69 73 20 69 6e 69  pOpenTemp is ini
a320: 74 69 61 6c 69 7a 65 64 20 74 6f 20 4e 55 4c 4c  tialized to NULL
a330: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  .*/../*.** Add t
a340: 68 65 20 61 64 64 72 65 73 73 20 22 61 64 64 72  he address "addr
a350: 22 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  " to the set of 
a360: 61 6c 6c 20 6f 70 63 6f 64 65 20 61 64 64 72 65  all opcode addre
a370: 73 73 65 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  sses contained.*
a380: 2a 20 69 6e 20 74 68 65 20 70 4f 70 65 6e 54 65  * in the pOpenTe
a390: 6d 70 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  mp list for the 
a3a0: 77 68 6f 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 73  whole compound s
a3b0: 65 6c 65 63 74 2e 20 20 49 66 20 6e 6f 20 70 4f  elect.  If no pO
a3c0: 70 65 6e 54 65 6d 70 0a 2a 2a 20 6c 69 73 74 20  penTemp.** list 
a3d0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
a3e0: 20 79 65 74 2c 20 74 68 65 6e 20 63 72 65 61 74   yet, then creat
a3f0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 61 6e 64 20  e a new one and 
a400: 6d 61 6b 65 20 2a 70 70 4f 70 65 6e 54 65 6d 70  make *ppOpenTemp
a410: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 69 74 2e  .** point to it.
a420: 20 20 49 66 20 74 68 65 20 70 4f 70 65 6e 54 65    If the pOpenTe
a430: 6d 70 20 6c 69 73 74 20 61 6c 72 65 61 64 79 20  mp list already 
a440: 65 78 69 73 74 73 2c 20 6c 65 61 76 65 20 2a 70  exists, leave *p
a450: 70 4f 70 65 6e 54 65 6d 70 0a 2a 2a 20 75 6e 63  pOpenTemp.** unc
a460: 68 61 6e 67 65 64 20 61 6e 64 20 6a 75 73 74 20  hanged and just 
a470: 61 64 64 20 74 68 65 20 6e 65 77 20 61 64 64 72  add the new addr
a480: 65 73 73 20 74 6f 20 74 68 65 20 65 78 69 73 74  ess to the exist
a490: 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ing list..*/.sta
a4a0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
a4b0: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
a4c0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 61  Select *p, int a
a4d0: 64 64 72 2c 20 49 64 4c 69 73 74 20 2a 2a 70 70  ddr, IdList **pp
a4e0: 4f 70 65 6e 54 65 6d 70 29 7b 0a 20 20 49 64 4c  OpenTemp){.  IdL
a4f0: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 66  ist *pList;.  if
a500: 28 20 21 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  ( !p->ppOpenTemp
a510: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
a520: 65 20 61 20 6e 65 77 20 6c 69 73 74 20 2a 2f 0a  e a new list */.
a530: 20 20 20 20 2a 70 70 4f 70 65 6e 54 65 6d 70 20      *ppOpenTemp 
a540: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  = sqlite3IdListA
a550: 70 70 65 6e 64 28 30 2c 20 30 29 3b 0a 20 20 20  ppend(0, 0);.   
a560: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d   p->ppOpenTemp =
a570: 20 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d   ppOpenTemp;.  }
a580: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64 64  else{.    /* Add
a590: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 6f   a new element o
a5a0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
a5b0: 68 65 20 65 78 69 73 74 69 6e 67 20 6c 69 73 74  he existing list
a5c0: 20 2a 2f 0a 20 20 20 20 2a 70 2d 3e 70 70 4f 70   */.    *p->ppOp
a5d0: 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33  enTemp = sqlite3
a5e0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d  IdListAppend(*p-
a5f0: 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b  >ppOpenTemp, 0);
a600: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 2a  .  }.  pList = *
a610: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20  p->ppOpenTemp;. 
a620: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
a630: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a640: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
a650: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
a660: 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61 64 64  nId-1].idx = add
a670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
a680: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a690: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
a6a0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
a6b0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
a6c0: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
a6d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
a6e0: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
a6f0: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
a700: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
a710: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
a720: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
a730: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
a740: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
a750: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
a760: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
a770: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
a780: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
a790: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
a7a0: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
a7b0: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
a7c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
a7d0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
a7e0: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
a7f0: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
a800: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a810: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
a820: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
a830: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
a840: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
a850: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
a860: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
a870: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
a880: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
a890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74  ;.  }.  if( pRet
a8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ==0 ){.    pRet 
a8b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a8c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
a8d0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
a8e0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
a8f0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
a900: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a910: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
a920: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
a930: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
a940: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
a950: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
a960: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
a970: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  e queries..**.**
a980: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
a990: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
a9a0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
a9b0: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
a9c0: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
a9d0: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
a9e0: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
a9f0: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
aa00: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
aa10: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
aa20: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
aa30: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
aa40: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
aa50: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
aa60: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
aa70: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
aa80: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
aa90: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
aaa0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
aab0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
aac0: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
aad0: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
aae0: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
aaf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
ab00: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
ab10: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
ab20: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
ab30: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
ab40: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
ab50: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
ab60: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
ab70: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
ab80: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
ab90: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
aba0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
abb0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
abc0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
abd0: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
abe0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
abf0: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
ac00: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
ac10: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
ac20: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
ac30: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
ac40: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
ac50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
ac60: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
ac70: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
ac80: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
ac90: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
aca0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
acb0: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
acc0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
acd0: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
ace0: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
acf0: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
ad00: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
ad10: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
ad20: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
ad30: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
ad40: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
ad50: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
ad60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ad70: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
ad80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ad90: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
ada0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
adb0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
adc0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
add0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c              /* \
adf0: 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79  ___  Store query
ae00: 20 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63   results as spec
ae10: 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ified */.  int i
ae20: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
ae30: 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65   /* /     by the
ae40: 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72  se two parameter
ae50: 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s.         */.  
ae60: 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
ae70: 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
ae80: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
ae90: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
aea0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
aeb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
aec0: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
aed0: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
aee0: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
aef0: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
af00: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
af10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
af20: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
af30: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
af40: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
af50: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
af60: 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  E */.  IdList *p
af70: 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20  OpenTemp = 0;/* 
af80: 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f  OP_OpenTemp opco
af90: 64 65 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  des that need a 
afa0: 4b 65 79 49 6e 66 6f 20 2a 2f 0a 0a 20 20 2f 2a  KeyInfo */..  /*
afb0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
afc0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
afd0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
afe0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
aff0: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
b000: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
b010: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
b020: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
b030: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
b040: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
b050: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
b060: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
b070: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
b080: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b090: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
b0a0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
b0b0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
b0c0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
b0d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b0e0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
b0f0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
b100: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
b110: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
b120: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
b130: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
b140: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
b150: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
b160: 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d  pPrior->nLimit>=
b170: 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66  0 || pPrior->nOf
b180: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
b190: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b1a0: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
b1b0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
b1c0: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
b1d0: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
b1e0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
b1f0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
b200: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b210: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
b220: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
b230: 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72  ave a valid quer
b240: 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f  y engine.  If no
b250: 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  t, create a new 
b260: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  one..  */.  v = 
b270: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b280: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
b290: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
b2a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
b2b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
b2c0: 0a 0a 20 20 2f 2a 20 50 41 52 54 20 4f 46 20 46  ..  /* PART OF F
b2d0: 49 58 3a 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IX:.  */.  if( p
b2e0: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3d 3d 30 20  ->ppOpenTemp==0 
b2f0: 29 7b 0a 20 20 20 20 70 2d 3e 70 70 4f 70 65 6e  ){.    p->ppOpen
b300: 54 65 6d 70 20 3d 20 26 70 4f 70 65 6e 54 65 6d  Temp = &pOpenTem
b310: 70 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 2d  p;.  }.  pPrior-
b320: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
b330: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 0a 20 20  >ppOpenTemp;..  
b340: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
b350: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
b360: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
b370: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
b380: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
b390: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73  pTable ){.    as
b3a0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
b3b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b3c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
b3d0: 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
b3e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 49 58 20 4d  );..    /* FIX M
b3f0: 45 3a 0a 20 20 20 20 2a 2a 20 70 2d 3e 70 45 4c  E:.    ** p->pEL
b400: 69 73 74 2d 3e 6e 45 78 70 72 20 6d 69 67 68 74  ist->nExpr might
b410: 20 63 6f 6e 74 61 69 6e 20 61 20 22 2a 22 20 61   contain a "*" a
b420: 6e 64 20 73 6f 20 6d 69 67 68 74 20 6e 6f 74 20  nd so might not 
b430: 62 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  be the .    ** c
b440: 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 2e 20 20  orrect number.  
b450: 47 6f 20 61 68 65 61 64 20 61 6e 64 20 63 6f 64  Go ahead and cod
b460: 65 20 74 68 65 20 53 65 74 4e 75 6d 43 6f 6c 75  e the SetNumColu
b470: 6d 6e 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  mns instruction.
b480: 20 20 20 20 2a 2a 20 68 65 72 65 2c 20 62 75 74      ** here, but
b490: 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
b4a0: 20 61 64 64 72 65 73 73 2e 20 20 20 43 68 61 6e   address.   Chan
b4b0: 67 65 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ge the P2 value 
b4c0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e  of the.    ** in
b4d0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
b4e0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
b4f0: 6e 73 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  ns after sqlite3
b500: 53 65 6c 65 63 74 28 29 20 68 61 73 0a 20 20 20  Select() has.   
b510: 20 2a 2a 20 62 65 65 6e 20 63 61 6c 6c 65 64 20   ** been called 
b520: 74 6f 20 63 6f 64 65 20 74 68 65 20 73 75 62 71  to code the subq
b530: 75 65 72 79 20 61 6e 64 20 68 61 73 20 6d 6f 64  uery and has mod
b540: 69 66 69 65 64 20 70 45 4c 69 73 74 2d 3e 6e 45  ified pEList->nE
b550: 78 70 72 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  xpr.    ** to be
b560: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
b570: 75 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ue. */.    sqlit
b580: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b590: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
b5a0: 20 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73   iParm, p->pELis
b5b0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 65  t->nExpr);.    e
b5c0: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
b5d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
b5e0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
b5f0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
b600: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b610: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
b620: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
b630: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
b640: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
b650: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
b660: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69     pPrior->nLimi
b670: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
b680: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e         pPrior->n
b690: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
b6a0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  set;.        /* 
b6b0: 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65  pPrior->ppOpenTe
b6c0: 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65  mp = p->ppOpenTe
b6d0: 6d 70 3b 20 2f 2f 20 46 49 58 20 2a 2f 0a 20 20  mp; // FIX */.  
b6e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b6f0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
b700: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
b710: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
b720: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  aff);.        if
b730: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b740: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b750: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
b760: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
b770: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
b780: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
b790: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
b7a0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
b7b0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
b7c0: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  et;.        p->n
b7d0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
b7e0: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
b7f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
b800: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
b810: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
b820: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c   iParm, 0, 0, 0,
b830: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70   aff);.        p
b840: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
b850: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  r;.        if( r
b860: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
b870: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
b880: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
b890: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
b8b0: 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e  For UNION ALL ..
b8c0: 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20  . ORDER BY fall 
b8d0: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
b8e0: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
b8f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
b900: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
b910: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
b920: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
b930: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
b940: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
b950: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
b960: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
b970: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20    int op = 0;   
b980: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
b990: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
b9a0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
b9b0: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
b9c0: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
b9d0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
b9e0: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
b9f0: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
ba00: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c       int nLimit,
ba10: 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76   nOffset; /* Sav
ba20: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
ba30: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
ba40: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45  ffset */.      E
ba50: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
ba60: 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  y;  /* The ORDER
ba70: 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74   BY clause for t
ba80: 68 65 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  he right SELECT 
ba90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
baa0: 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  r;..      priorO
bab0: 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  p = p->op==TK_AL
bac0: 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20  L ? SRT_Table : 
bad0: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
bae0: 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f   if( eDest==prio
baf0: 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72  rOp && p->pOrder
bb00: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d  By==0 && p->nLim
bb10: 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73  it<0 && p->nOffs
bb20: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
bb30: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
bb40: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
bb50: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
bb60: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
bb70: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
bb80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
bb90: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
bba0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
bbb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
bbc0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
bbd0: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
bbe0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
bbf0: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
bc00: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
bc10: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
bc20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
bc30: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
bc40: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
bc50: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
bc60: 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74   .        && mat
bc70: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
bc80: 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  n(pParse, p, p->
bc90: 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54  pOrderBy, unionT
bca0: 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  ab, 1) ){.      
bcb0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bcc0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
bcd0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
bce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
bcf0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bd00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
bd10: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
bd20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
bd30: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29   p->op!=TK_ALL )
bd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bd50: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
bd60: 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72  TempAddr(p, addr
bd70: 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20  , &pOpenTemp);. 
bd80: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
bd90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bda0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
bdb0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bdc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
bdd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bde0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
bdf0: 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61  yAsData, unionTa
be00: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 1);.        }
be10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
be20: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
be30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
be40: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
be50: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
be60: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
be70: 20 20 20 20 20 20 2f 2a 20 70 50 72 69 6f 72 2d        /* pPrior-
be80: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
be90: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 20 2f 2f 20  >ppOpenTemp; // 
bea0: 46 49 58 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  FIX */.      rc 
beb0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
bec0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
bed0: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
bee0: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
bef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
bf00: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
bf10: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bf20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bf30: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  f( p->op==TK_ALL
bf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bf50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bf60: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
bf70: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 50 72 69  , unionTab, pPri
bf80: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
bf90: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  r);.      }..   
bfa0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
bfb0: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
bfc0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
bfd0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
bfe0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
bff0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
c000: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
c010: 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
c020: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
c030: 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
c040: 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
c050: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
c060: 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
c070: 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
c080: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c090: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
c0a0: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
c0b0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
c0c0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
c0d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d   = 0;.      nLim
c0e0: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
c0f0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
c100: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66  = -1;.      nOff
c110: 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74  set = p->nOffset
c120: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73  ;.      p->nOffs
c130: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
c140: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c150: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
c160: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
c170: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
c180: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
c190: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
c1a0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
c1b0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
c1c0: 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
c1d0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f   p->nOffset = nO
c1e0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
c1f0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c200: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c210: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
c220: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
c230: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
c240: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c250: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
c260: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
c270: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
c280: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
c290: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
c2a0: 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72  if( eDest!=prior
c2b0: 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
c2c0: 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  iParm ){.       
c2d0: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
c2e0: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
c2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c300: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
c310: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
c320: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
c330: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
c340: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
c350: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
c360: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c370: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
c380: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
c390: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
c3a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
c3b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
c3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c3d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
c3e0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
c3f0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
c400: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
c410: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
c420: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
c430: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
c440: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
c450: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
c460: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
c470: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
c480: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
c490: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
c4c0: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
c4d0: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
c500: 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
c510: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c520: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c530: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c540: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c550: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c560: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c570: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
c580: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
c590: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c5a0: 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
c5b0: 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
c5c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
c5d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
c5e0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
c5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c600: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
c610: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
c620: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c630: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c640: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
c650: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
c660: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
c670: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
c680: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  Start;.      int
c690: 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74   nLimit, nOffset
c6a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
c6b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
c6c0: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
c6d0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
c6e0: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
c6f0: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
c700: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
c710: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
c720: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
c730: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
c740: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
c750: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
c760: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
c770: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
c780: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
c790: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
c7a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
c7b0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
c7c0: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
c7d0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
c7e0: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
c7f0: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
c800: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
c810: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c820: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
c830: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
c840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c850: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
c860: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b1, 0);.      rc
c870: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
c880: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
c890: 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29 3b  dr, &pOpenTemp);
c8a0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
c8b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c8c0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c8d0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c8e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
c8f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c900: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c  KeyAsData, tab1,
c910: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
c920: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
c930: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c940: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
c950: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
c960: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
c970: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
c980: 20 20 20 2f 2a 20 70 50 72 69 6f 72 2d 3e 70 70     /* pPrior->pp
c990: 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70  OpenTemp = p->pp
c9a0: 4f 70 65 6e 54 65 6d 70 3b 20 2f 2f 20 46 49 58  OpenTemp; // FIX
c9b0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
c9c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c9d0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
c9e0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
c9f0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
ca00: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ca10: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ca20: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ca30: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ca40: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
ca50: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
ca60: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
ca70: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
ca80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ca90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
caa0: 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 30  penTemp, tab2, 0
cab0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75  );.      rc = mu
cac0: 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d  ltiSelectOpenTem
cad0: 70 41 64 64 72 28 70 2c 20 61 64 64 72 2c 20 26  pAddr(p, addr, &
cae0: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 20 20  pOpenTemp);.    
caf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cb00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
cb10: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
cb20: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
cb30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
cb50: 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Data, tab2, 1);.
cb60: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
cb70: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69  = 0;.      nLimi
cb80: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
cb90: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
cba0: 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73   -1;.      nOffs
cbb0: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
cbc0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
cbd0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
cbe0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
cbf0: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
cc00: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
cc10: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
cc20: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
cc30: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  ior;.      p->nL
cc40: 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  imit = nLimit;. 
cc50: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
cc60: 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = nOffset;.     
cc70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cc80: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
cc90: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
cca0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
ccb0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
ccc0: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
ccd0: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
cce0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
ccf0: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
cd00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
cd10: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
cd20: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
cd30: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
cd40: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
cd50: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
cd60: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
cd70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cd80: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
cd90: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cda0: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
cdb0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cdc0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
cdd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cde0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
cdf0: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
ce00: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
ce10: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
ce20: 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  p);.      iStart
ce30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ce40: 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65  dOp(v, OP_FullKe
ce50: 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  y, tab1, 0);.   
ce60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce70: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
ce80: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
ce90: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
cea0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
ceb0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
cec0: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
ced0: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
cf00: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
cf10: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
cf40: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
cf50: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
cf60: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
cf70: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cf80: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
cf90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cfa0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
cfb0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
cfc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cfd0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
cfe0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
cff0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d000: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
d010: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
d020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d030: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
d040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d050: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d060: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
d070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d080: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
d090: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
d0a0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
d0b0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
d0c0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
d0d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
d0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d0f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
d100: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
d110: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
d120: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
d130: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
d140: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
d150: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
d160: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
d170: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
d180: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d190: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
d1a0: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
d1b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
d1c0: 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65  ed by either the
d1d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d1e0: 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20   or.  ** by any 
d1f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
d200: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
d210: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
d220: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
d230: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
d240: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
d250: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
d260: 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  les.  Invoke the
d270: 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70  .  ** ORDER BY p
d280: 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68 65  rocessing if the
d290: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
d2a0: 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  Y clause..  */. 
d2b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
d2c0: 20 7c 7c 20 28 70 4f 70 65 6e 54 65 6d 70 20 26   || (pOpenTemp &
d2d0: 26 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64  & pOpenTemp->nId
d2e0: 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  >0) ){.    int n
d2f0: 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
d300: 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62  >nExpr;  /* Numb
d310: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d320: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d330: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d360: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
d370: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
d380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
d390: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
d3a0: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
d3b0: 65 74 20 2a 2f 0a 0a 20 20 20 20 70 4b 65 79 49  et */..    pKeyI
d3c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
d3d0: 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49  oc(sizeof(*pKeyI
d3e0: 6e 66 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66  nfo)+nCol*sizeof
d3f0: 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20  (CollSeq*));.   
d400: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
d410: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
d420: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
d430: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d440: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
d450: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
d460: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
d470: 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  nc;.    pKeyInfo
d480: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
d490: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
d4a0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
d4b0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
d4c0: 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
d4d0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
d4e0: 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
d4f0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61  if( !pKeyInfo->a
d500: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
d510: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
d520: 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  ll[i] = pParse->
d530: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
d540: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d550: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65 6e    for(i=0; pOpen
d560: 54 65 6d 70 20 26 26 20 69 3c 70 4f 70 65 6e 54  Temp && i<pOpenT
d570: 65 6d 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  emp->nId; i++){.
d580: 20 20 20 20 20 20 69 6e 74 20 70 33 74 79 70 65        int p3type
d590: 20 3d 20 28 69 3d 3d 30 3f 50 33 5f 4b 45 59 49   = (i==0?P3_KEYI
d5a0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 50 33 5f 4b  NFO_HANDOFF:P3_K
d5b0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 69  EYINFO);.      i
d5c0: 6e 74 20 61 64 64 72 20 3d 20 70 4f 70 65 6e 54  nt addr = pOpenT
d5d0: 65 6d 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20  emp->a[i].idx;. 
d5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d5f0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
d600: 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
d610: 66 6f 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 20  fo, p3type);.   
d620: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   }..    if( p->p
d630: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
d640: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d650: 5f 69 74 65 6d 20 2a 70 4f 72 64 65 72 42 79 54  _item *pOrderByT
d660: 65 72 6d 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  erm = p->pOrderB
d670: 79 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  y->a;.      for(
d680: 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65 72  i=0; i<p->pOrder
d690: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
d6a0: 70 4f 72 64 65 72 42 79 54 65 72 6d 2b 2b 29 7b  pOrderByTerm++){
d6b0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
d6c0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 54  Expr = pOrderByT
d6d0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
d6e0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
d6f0: 3d 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e  = pOrderByTerm->
d700: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
d710: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
d720: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
d730: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43  Expr->iColumn<nC
d740: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ol );.        as
d750: 73 65 72 74 28 20 21 70 45 78 70 72 2d 3e 70 43  sert( !pExpr->pC
d760: 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  oll );.        i
d770: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
d780: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
d790: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
d7a0: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
d7b0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  , zName, -1);.  
d7c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d7d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
d7e0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
d7f0: 61 43 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  aColl[pExpr->iCo
d800: 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
d810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
d820: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
d830: 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d  pParse, p, v, p-
d840: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
d850: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
d860: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
d870: 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20  OpenTemp ){.    
d880: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
d890: 73 20 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  s for UNION ALL 
d8a0: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ... ORDER BY */.
d8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
d8c0: 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  (pKeyInfo);.    
d8d0: 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  }.  }..multi_sel
d8e0: 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20 70  ect_end:.  if( p
d8f0: 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20  OpenTemp ){.    
d900: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
d910: 65 74 65 28 70 4f 70 65 6e 54 65 6d 70 29 3b 0a  ete(pOpenTemp);.
d920: 20 20 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e 54    }.  p->ppOpenT
d930: 65 6d 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  emp = 0;.  retur
d940: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
d950: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
d960: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
d970: 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
d980: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
d990: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
d9a0: 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
d9b0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
d9c0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
d9d0: 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
d9e0: 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
d9f0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
da00: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
da10: 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
da20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
da30: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
da40: 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
da50: 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
da60: 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
da70: 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
da80: 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
da90: 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
daa0: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
dab0: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
dac0: 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
dad0: 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
dae0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
daf0: 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
db00: 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
db10: 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
db20: 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
db30: 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
db40: 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
db50: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
db60: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
db70: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
db80: 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
db90: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
dba0: 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
dbb0: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
dbc0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69  List(ExprList*,i
dbd0: 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20  nt,ExprList*);  
dbe0: 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
dbf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
dc00: 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
dc10: 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
dc20: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
dc30: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
dc40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
dc50: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
dc60: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
dc70: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
dc80: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
dc90: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
dca0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
dcb0: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
dcc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
dcd0: 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
dce0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
dcf0: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
dd00: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
dd10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dd20: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
dd30: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
dd40: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
dd50: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
dd60: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
dd70: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
dd80: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
dd90: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
dda0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
ddb0: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
ddc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
ddd0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
dde0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
ddf0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
de00: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
de10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
de20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
de30: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
de40: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
de50: 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
de60: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
de70: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
de80: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
de90: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
dea0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
deb0: 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pNew->pList);. 
dec0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
ded0: 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
dee0: 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
def0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
df00: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
df10: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
df20: 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
df30: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
df40: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
df50: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
df60: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
df70: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
df80: 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
df90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
dfa0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
dfb0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
dfc0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
dfd0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
dfe0: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
dff0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
e000: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78  ubstExprList(pEx
e010: 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c  pr->pList, iTabl
e020: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
e030: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73  }.static void .s
e040: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
e050: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
e060: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
e070: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
e080: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
e090: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
e0a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e0b0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e0c0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
e0d0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
e0e0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
e0f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
e100: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
e110: 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
e120: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
e130: 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
e140: 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
e150: 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
e160: 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
e170: 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
e180: 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
e190: 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
e1a0: 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
e1b0: 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
e1c0: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
e1d0: 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
e1e0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
e1f0: 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
e200: 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
e210: 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
e220: 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
e230: 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
e240: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
e250: 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
e260: 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
e270: 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
e280: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
e290: 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
e2a0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
e2b0: 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
e2c0: 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
e2d0: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
e2e0: 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
e2f0: 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
e300: 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
e310: 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
e320: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
e330: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
e340: 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
e350: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
e360: 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
e370: 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
e380: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e390: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
e3a0: 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
e3b0: 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
e3c0: 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
e3d0: 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
e3e0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
e3f0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
e400: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
e410: 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
e420: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
e430: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
e440: 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
e450: 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
e460: 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
e470: 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
e480: 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
e490: 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
e4a0: 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
e4b0: 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
e4c0: 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
e4d0: 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
e4e0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
e4f0: 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
e500: 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
e510: 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
e520: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e530: 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
e540: 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
e550: 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
e560: 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
e570: 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
e580: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
e590: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
e5a0: 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
e5b0: 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
e5c0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
e5d0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
e5e0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
e5f0: 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
e600: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
e610: 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
e620: 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
e630: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
e640: 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
e650: 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
e660: 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
e670: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
e680: 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
e690: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
e6a0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
e6b0: 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
e6c0: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
e6d0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
e6e0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
e6f0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
e700: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
e710: 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
e720: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
e730: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
e740: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
e750: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
e760: 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
e770: 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
e780: 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
e790: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
e7a0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
e7b0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
e7c0: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
e7d0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
e7e0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
e7f0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
e800: 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
e810: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
e820: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
e830: 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
e840: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
e850: 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
e860: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
e870: 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
e880: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
e890: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
e8a0: 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
e8b0: 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
e8c0: 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
e8d0: 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
e8e0: 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
e8f0: 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
e900: 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
e910: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
e920: 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
e930: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
e940: 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
e950: 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
e960: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
e970: 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
e980: 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e  t #350).**.** In
e990: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
e9a0: 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
e9b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
e9c0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
e9d0: 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
e9e0: 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
e9f0: 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
ea00: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
ea10: 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
ea20: 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
ea30: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
ea40: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
ea50: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
ea60: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
ea70: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
ea80: 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
ea90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
eaa0: 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
eab0: 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
eac0: 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
ead0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
eae0: 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
eaf0: 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
eb00: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
eb10: 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
eb20: 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
eb30: 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
eb40: 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
eb50: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
eb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
eb70: 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
eb80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
eb90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
eba0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ebb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
ebc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ebd0: 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
ebe0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
ebf0: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
ec00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ec10: 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
ec20: 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
ec30: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
ec40: 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
ec50: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
ec60: 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
ec70: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
ec80: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
ec90: 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
eca0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
ecb0: 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
ecc0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
ecd0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
ece0: 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
ecf0: 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
ed00: 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
ed10: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
ed20: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
ed30: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
ed40: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
ed50: 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
ed60: 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
ed70: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
ed80: 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
ed90: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
eda0: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
edb0: 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
edc0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
edd0: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
ede0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
edf0: 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
ee00: 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
ee10: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
ee20: 3b 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  ;.  Expr *pWhere
ee30: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
ee40: 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
ee50: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
ee60: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
ee70: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
ee80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ee90: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
eea0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
eeb0: 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
eec0: 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
eed0: 29 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63  );.  pSub = pSrc
eee0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65  ->a[iFrom].pSele
eef0: 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
ef00: 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
ef10: 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
ef20: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
ef30: 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  ;.  if( subquery
ef40: 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
ef50: 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
ef60: 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ;.  pSubSrc = pS
ef70: 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
ef80: 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
ef90: 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
efa0: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
efb0: 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69  ;.  if( (pSub->i
efc0: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
efd0: 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  b->nLimit>=0) &&
efe0: 20 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20    (pSrc->nSrc>1 
eff0: 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
f000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f010: 20 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74    if( (p->isDist
f020: 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69  inct || p->nLimi
f030: 74 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65 72  t>=0) && subquer
f040: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
f050: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  0;.  if( p->pOrd
f060: 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
f070: 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
f080: 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  0;..  /* Restric
f090: 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
f0a0: 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
f0b0: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
f0c0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
f0d0: 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
f0e0: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
f0f0: 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
f100: 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
f110: 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
f120: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
f130: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
f140: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
f150: 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
f160: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
f170: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
f180: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
f190: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f1a0: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
f1b0: 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
f1c0: 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
f1d0: 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
f1e0: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
f1f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
f200: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69  Src->nSrc>1 && i
f210: 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
f220: 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
f230: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
f240: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
f250: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
f260: 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
f270: 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
f280: 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
f290: 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
f2a0: 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
f2b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
f2c0: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
f2d0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
f2e0: 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
f2f0: 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
f300: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
f310: 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
f320: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
f330: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
f340: 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
f350: 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
f360: 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
f370: 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
f380: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
f390: 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
f3a0: 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
f3b0: 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
f3c0: 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
f3d0: 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
f3e0: 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
f3f0: 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
f400: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
f410: 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
f420: 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
f430: 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
f440: 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  .  if( iFrom>0 &
f450: 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
f460: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
f470: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
f480: 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65     && pSub->pWhe
f490: 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
f4a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
f4b0: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
f4c0: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
f4d0: 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
f4e0: 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
f4f0: 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
f500: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
f510: 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
f520: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
f530: 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
f540: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
f550: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
f560: 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
f570: 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
f580: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
f590: 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
f5a0: 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
f5b0: 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
f5c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
f5d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
f5e0: 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
f5f0: 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
f600: 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
f610: 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
f620: 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
f630: 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
f640: 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
f650: 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
f660: 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
f670: 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
f680: 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
f690: 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
f6a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
f6b0: 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
f6c0: 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
f6d0: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
f6e0: 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
f6f0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
f700: 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  nt = pSrc->a[iFr
f710: 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  om].iCursor;.  {
f720: 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
f730: 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
f740: 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
f750: 70 65 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  pe = pSrc->a[iFr
f760: 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20  om].jointype;.. 
f770: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
f780: 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53  From].pTab && pS
f790: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
f7a0: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
f7b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f7c0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
f7d0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
f7e0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
f7f0: 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61  liteFree(pSrc->a
f800: 5b 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61 73  [iFrom].zDatabas
f810: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
f820: 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  ee(pSrc->a[iFrom
f830: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
f840: 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61  liteFree(pSrc->a
f850: 5b 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b  [iFrom].zAlias);
f860: 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
f870: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
f880: 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
f890: 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
f8a0: 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =1; i<nSubSrc; i
f8b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  ++){.        pSr
f8c0: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
f8d0: 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30  stAppend(pSrc, 0
f8e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f8f0: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
f900: 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
f910: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d  pSrc->nSrc-1; i-
f920: 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d  extra>=iFrom; i-
f930: 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  -){.        pSrc
f940: 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61  ->a[i] = pSrc->a
f950: 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20  [i-extra];.     
f960: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
f970: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
f980: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72   i++){.      pSr
f990: 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
f9a0: 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
f9b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
f9c0: 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
f9d0: 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
f9e0: 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
f9f0: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e   pSrc->a[iFrom+n
fa00: 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79  SubSrc-1].jointy
fa10: 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
fa20: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67   }..  /* Now beg
fa30: 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
fa40: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
fa50: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
fa60: 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  for .  ** refere
fa70: 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
fa80: 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
fa90: 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20   query..  ** .  
faa0: 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
fab0: 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  .  **   SELECT a
fac0: 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
fad0: 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
fae0: 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
faf0: 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
fb00: 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
fb10: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
fb20: 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
fb30: 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
fb40: 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20          /.  **  
fb50: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
fb60: 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
fb70: 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
fb80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
fb90: 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ___/.  **.  ** W
fba0: 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
fbb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
fbc0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
fbd0: 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
fbe0: 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65   see.  ** "a" we
fbf0: 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
fc00: 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
fc10: 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
fc20: 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
fc30: 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45  "..  */.  substE
fc40: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
fc50: 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
fc60: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69  ->pEList);.  pLi
fc70: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
fc80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
fc90: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
fca0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
fcb0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
fcc0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26  >a[i].zName==0 &
fcd0: 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  & (pExpr = pList
fce0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
fcf0: 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  pan.z!=0 ){.    
fd00: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
fd10: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
fd20: 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  Dup(pExpr->span.
fd30: 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
fd40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
fd50: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
fd60: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
fd70: 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
fd80: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
fd90: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
fda0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
fdb0: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
fdc0: 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
fdd0: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
fde0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
fdf0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
fe00: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
fe10: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
fe20: 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
fe30: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
fe40: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
fe50: 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
fe60: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
fe70: 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
fe80: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
fe90: 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
fea0: 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
feb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
fec0: 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
fed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68    }else{.    pWh
fee0: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ere = 0;.  }.  i
fef0: 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
ff00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ff10: 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  p->pHaving==0 );
ff20: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
ff30: 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
ff40: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
ff50: 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ere;.    substEx
ff60: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
ff70: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
ff80: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
ff90: 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  Sub->pHaving ){.
ffa0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76        Expr *pHav
ffb0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
ffc0: 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
ffd0: 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ng);.      if( p
ffe0: 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
fff0: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
10000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
10010 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67  _AND, p->pHaving
10020 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20  , pHaving, 0);. 
10030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10040 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
10050 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20   pHaving;.      
10060 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
10070 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
10080 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
10090 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
100a0 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d  xprListDup(pSub-
100b0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
100c0 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72  lse if( p->pWher
100d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  e==0 ){.    p->p
100e0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
100f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
10100 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
10110 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10120 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
10130 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
10140 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
10150 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
10160 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  , p->pWhere, pWh
10170 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ere, 0);.    }. 
10180 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
10190 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
101a0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
101b0 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
101c0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
101d0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
101e0 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
101f0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
10200 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
10210 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
10220 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
10230 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  limit expression
10240 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
10250 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a  ry to the outer.
10260 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f    ** query..  */
10270 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69  .  if( pSub->nLi
10280 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  mit>=0 ){.    if
10290 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b  ( p->nLimit<0 ){
102a0 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
102b0 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b   = pSub->nLimit;
102c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
102d0 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66  ->nLimit+p->nOff
102e0 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d  set > pSub->nLim
102f0 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  it+pSub->nOffset
10300 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
10310 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
10320 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73  it + pSub->nOffs
10330 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et - p->nOffset;
10340 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
10350 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d  nOffset += pSub-
10360 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20  >nOffset;..  /* 
10370 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
10380 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
10390 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
103a0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
103b0 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
103c0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
103d0 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
103e0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
103f0 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
10400 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
10410 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
10420 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
10430 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
10440 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
10450 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
10460 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
10470 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
10480 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
10490 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
104a0 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
104b0 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
104c0 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
104d0 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
104e0 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e  ELECT and return
104f0 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20   1.  If this is 
10500 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65  not a .** simple
10510 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
10520 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75  query, then retu
10530 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69  rn 0;.**.** A si
10540 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mply min() or ma
10550 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20  x() query looks 
10560 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
10570 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61      SELECT min(a
10580 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
10590 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61      SELECT max(a
105a0 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
105b0 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61  .** The query ma
105c0 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69  y have only a si
105d0 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74  ngle table in it
105e0 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e  s FROM argument.
105f0 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62    There.** can b
10600 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72  e no GROUP BY or
10610 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45   HAVING or WHERE
10620 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72   clauses.  The r
10630 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a  esult set must.*
10640 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f  * be the min() o
10650 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e  r max() of a sin
10660 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  gle column of th
10670 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
10680 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d  lumn.** in the m
10690 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
106a0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69  nction must be i
106b0 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndexed..**.** Th
106c0 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
106d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65  this routine are
106e0 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72   the same as for
106f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
10700 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
10710 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
10720 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
10730 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
10740 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
10750 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d  c int simpleMinM
10760 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70  axQuery(Parse *p
10770 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10780 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
10790 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20   iParm){.  Expr 
107a0 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43  *pExpr;.  int iC
107b0 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ol;.  Table *pTa
107c0 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
107d0 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
107e0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73  Vdbe *v;.  int s
107f0 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e  eekOp;.  int con
10800 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
10810 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65  EList, *pList, e
10820 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45  List;.  struct E
10830 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69  xprList_item eLi
10840 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73  stItem;.  SrcLis
10850 74 20 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20 2f  t *pSrc;.  ..  /
10860 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
10870 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
10880 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
10890 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
108a0 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
108b0 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
108c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
108d0 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
108e0 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
108f0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
10900 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
10910 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
10920 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
10930 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
10940 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
10950 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
10960 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
10970 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
10980 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
10990 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
109a0 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
109b0 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
109c0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
109d0 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
109e0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
109f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10a00 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
10a10 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
10a20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
10a30 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
10a40 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
10a50 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
10a60 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
10a70 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
10a80 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
10a90 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
10aa0 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
10ab0 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
10ac0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
10ad0 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
10ae0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
10af0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
10b00 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
10b10 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
10b20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
10b30 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
10b40 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
10b50 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
10b60 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
10b70 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
10b80 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
10b90 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
10ba0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
10bb0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
10bc0 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
10bd0 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
10be0 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
10bf0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
10c00 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
10c10 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
10c20 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
10c30 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
10c40 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
10c50 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
10c60 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
10c70 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
10c80 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
10c90 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
10ca0 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
10cb0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
10cc0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
10cd0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
10ce0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72   pExpr);.    for
10cf0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
10d00 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10d10 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
10d20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
10d30 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
10d40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
10d50 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
10d60 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66   && pIdx->keyInf
10d70 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c  o.aColl[0]==pCol
10d80 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
10d90 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
10da0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
10db0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
10dc0 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
10dd0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
10de0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
10df0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
10e00 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
10e10 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
10e20 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
10e30 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
10e40 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
10e50 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
10e60 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
10e70 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
10e80 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
10e90 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10ea0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10eb0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
10ec0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
10ed0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
10ee0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
10ef0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
10f00 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
10f10 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
10f20 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
10f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f40 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
10f50 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
10f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f70 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
10f80 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 31  olumns, iParm, 1
10f90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
10fa0 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
10fb0 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
10fc0 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
10fd0 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
10fe0 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
10ff0 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
11000 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
11010 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
11020 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
11030 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
11040 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
11050 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
11060 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
11070 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
11080 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
11090 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
110a0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
110b0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
110c0 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61  pTab->iDb);.  ba
110d0 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  se = pSrc->a[0].
110e0 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75  iCursor;.  compu
110f0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
11100 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
11110 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
11120 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
11130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11140 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11150 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  pTab->iDb, 0);. 
11160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11170 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
11180 61 64 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e  ad, base, pTab->
11190 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
111a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
111b0 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
111c0 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f   base, pTab->nCo
111d0 6c 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d  l);.  }.  cont =
111e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
111f0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
11200 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
11210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11220 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
11230 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
11240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11250 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
11260 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b  , pIdx->iDb, 0);
11270 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11280 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
11290 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78  ad, base+1, pIdx
112a0 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ->tnum,.        
112b0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
112c0 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  *)&pIdx->keyInfo
112d0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
112e0 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f     if( seekOp==O
112f0 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20  P_Rewind ){.    
11300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11310 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
11320 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
11330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11340 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
11350 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65   1, 0);.      se
11360 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74  ekOp = OP_MoveGt
11370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11380 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11390 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20  seekOp, base+1, 
113a0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
113b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
113c0 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c  dxRecno, base+1,
113d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
113e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
113f0 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30  Close, base+1, 0
11400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11410 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
11420 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
11430 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
11440 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
11450 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
11460 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
11470 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
11480 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
11490 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
114a0 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
114b0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
114c0 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
114d0 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
114e0 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
114f0 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
11500 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11510 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
11520 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11530 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
11540 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
11550 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
11560 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
11570 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
11580 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54  ause in a SELECT
11590 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
115a0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
115b0 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
115c0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52  ..**.** An ORDER
115d0 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
115e0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  is a list of exp
115f0 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e  ressions.  If an
11600 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  y expression.** 
11610 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
11620 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61  nstant, then tha
11630 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
11640 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a  replaced by the.
11650 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
11660 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65   entry in the re
11670 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
11680 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
11690 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50  rderGroupBy(.  P
116a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
116b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
116c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
116d0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
116e0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
116f0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
11700 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63  lause to be proc
11710 65 73 73 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69  essed */.  SrcLi
11720 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
11730 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11740 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
11750 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
11760 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
11770 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
11780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11790 72 75 65 20 69 66 20 61 67 67 72 65 67 61 74 65  rue if aggregate
117a0 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69   functions are i
117b0 6e 76 6f 6c 76 65 64 20 2a 2f 0a 20 20 63 6f 6e  nvolved */.  con
117c0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
117d0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
117e0 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
117f0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
11800 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
11810 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
11820 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
11830 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
11840 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
11850 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  .    int iCol;. 
11860 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
11870 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
11880 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
11890 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
118a0 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69  (pE, &iCol) && i
118b0 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
118c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
118d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
118e0 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
118f0 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79     pE = pOrderBy
11900 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
11910 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
11920 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
11930 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
11940 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11950 72 52 65 73 6f 6c 76 65 41 6e 64 43 68 65 63 6b  rResolveAndCheck
11960 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
11970 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 2c 20 69  t, pEList, pE, i
11980 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
11990 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
119a0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
119b0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
119c0 70 45 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pE) ){.      if(
119d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
119e0 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
119f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
11a00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11a10 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
11a20 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d 75   "%s BY terms mu
11a30 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
11a40 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
11a50 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  , zType);.      
11a60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11a70 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
11a80 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
11a90 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11aa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11ab0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
11ac0 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
11ad0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
11ae0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
11af0 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
11b00 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
11b10 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65  1 and %d", zType
11b20 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
11b30 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
11b40 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
11b50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
11b60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11b70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
11b80 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
11b90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
11ba0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
11bb0 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
11bc0 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
11bd0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
11be0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
11bf0 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
11c00 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
11c10 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
11c20 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
11c30 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
11c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c60 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
11c70 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
11c80 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
11c90 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
11ca0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
11cb0 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
11cc0 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
11cd0 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
11ce0 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
11cf0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
11d00 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
11d10 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
11d20 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
11d30 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
11d40 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
11d50 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
11d60 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
11d70 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
11d80 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
11d90 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
11da0 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
11db0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
11dc0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
11dd0 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
11de0 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
11df0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
11e00 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
11e10 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
11e20 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
11e30 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
11e40 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
11e50 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
11e60 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
11e70 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
11e80 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
11e90 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
11ea0 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
11eb0 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
11ec0 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
11ed0 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
11ee0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
11ef0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
11f00 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
11f10 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
11f20 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
11f30 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
11f40 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
11f50 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
11f60 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
11f70 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
11f80 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
11f90 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
11fa0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
11fb0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
11fc0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
11fd0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
11fe0 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
11ff0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
12000 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
12010 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
12020 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
12030 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
12040 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
12050 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
12060 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
12070 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
12080 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
12090 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
120a0 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
120b0 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
120c0 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
120d0 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
120e0 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
120f0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
12100 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
12110 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
12120 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
12130 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
12140 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
12150 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
12160 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
12170 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
12180 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
12190 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
121a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
121b0 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
121c0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
121d0 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
121e0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
121f0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
12200 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
12210 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
12220 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
12260 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
12270 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
12280 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
12290 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
122a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
122b0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
122c0 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
122d0 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
122e0 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
122f0 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
12300 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
12310 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
12320 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
12330 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12340 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
12350 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
12360 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
12370 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
12380 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
12390 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
123a0 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
123b0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
123c0 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
123d0 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
123e0 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
123f0 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
12400 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
12410 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
12420 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
12430 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
12440 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
12450 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12470 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
12480 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
124a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
124b0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
124c0 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
124d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
124e0 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
124f0 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
12500 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
12510 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61         /* A para
12520 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68  meter used by th
12530 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c  e eDest disposal
12540 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c   method */.  Sel
12550 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
12560 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
12570 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
12580 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
12590 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
125a0 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
125b0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
125c0 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
125d0 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
125e0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
125f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
12600 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
12610 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
12620 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
12630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12640 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
12650 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
12660 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
12670 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
12680 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
12690 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
126a0 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  sAgg = 0;       
126b0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
126c0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
126d0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
126e0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
126f0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
12700 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
12710 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
12720 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
12730 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
12740 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
12750 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
12760 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
12770 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
12780 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
12790 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
127a0 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
127b0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
127c0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
127d0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
127e0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
127f0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
12800 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
12810 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
12820 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
12830 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
12840 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
12850 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
12860 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
12870 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
12880 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
12890 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
128a0 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
128b0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
128c0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
128d0 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
128e0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
128f0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
12900 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
12910 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
12920 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
12930 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
12940 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
12950 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
12960 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12970 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12980 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
12990 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
129a0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
129b0 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
129c0 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
129d0 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
129e0 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
129f0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
12a00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
12a10 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
12a20 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
12a30 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 0a 20 20  m, aff);.  }..  
12a40 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
12a50 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
12a60 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
12a70 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
12a80 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
12a90 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
12aa0 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72  pWhere;.  pOrder
12ab0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12ac0 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
12ad0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
12ae0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
12af0 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
12b00 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
12b10 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
12b20 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f   VDBE cursors fo
12b30 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
12b40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
12b50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
12b60 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
12b70 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
12b80 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ist);..  /* .  *
12b90 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
12ba0 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
12bb0 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
12bc0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
12bd0 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
12be0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
12bf0 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
12c00 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12c10 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
12c20 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78  ct_end;..  /* Ex
12c30 70 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72  pand any "*" ter
12c40 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ms in the result
12c50 20 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d   set.  (For exam
12c60 70 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20  ple the "*" in. 
12c70 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52   ** "SELECT * FR
12c80 4f 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c  OM t1")  The fil
12c90 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20  lInColumnlist() 
12ca0 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65  routine also doe
12cb0 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65  s some.  ** othe
12cc0 72 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d  r housekeeping -
12cd0 20 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20   see the header 
12ce0 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61  comment for deta
12cf0 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ils..  */.  if( 
12d00 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
12d10 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
12d20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12d30 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65  nd;.  }.  pWhere
12d40 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
12d50 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
12d60 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
12d70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
12d80 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
12d90 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
12da0 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
12db0 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
12dc0 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
12dd0 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
12de0 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74   */.  if( (eDest
12df0 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
12e00 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
12e10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
12e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12e30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12e40 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
12e50 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
12e60 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
12e70 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
12e80 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
12e90 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
12ea0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
12eb0 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20   /* ORDER BY is 
12ec0 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65  ignored for some
12ed0 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20   destinations.. 
12ee0 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44   */.  switch( eD
12ef0 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
12f00 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63  SRT_Union:.    c
12f10 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a  ase SRT_Except:.
12f20 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
12f30 63 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64  card:.      pOrd
12f40 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
12f50 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
12f60 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt:.      break;
12f70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
12f80 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f  is point, we sho
12f90 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74  uld have allocat
12fa0 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f  ed all the curso
12fb0 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  rs that we.  ** 
12fc0 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73  need to handle s
12fd0 75 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d  ubquerys and tem
12fe0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
12ff0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c  .  **.  ** Resol
13000 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ve the column na
13010 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d  mes and do a sem
13020 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20  antics check on 
13030 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
13040 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
13050 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
13060 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13070 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13080 65 73 6f 6c 76 65 41 6e 64 43 68 65 63 6b 28 70  esolveAndCheck(p
13090 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
130a0 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   0, pEList->a[i]
130b0 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  .pExpr,.        
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 26              1, &
130e0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
130f0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
13100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13110 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
13120 6c 76 65 41 6e 64 43 68 65 63 6b 28 70 50 61 72  lveAndCheck(pPar
13130 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
13140 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c  List, pWhere, 0,
13150 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
13160 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
13170 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
13180 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
13190 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
131a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
131b0 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
131c0 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
131d0 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
131e0 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NG");.      goto
131f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13200 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
13210 65 33 45 78 70 72 52 65 73 6f 6c 76 65 41 6e 64  e3ExprResolveAnd
13220 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54  Check(pParse, pT
13230 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 70  abList, pEList,p
13240 48 61 76 69 6e 67 2c 31 2c 26 69 73 41 67 67 29  Having,1,&isAgg)
13250 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
13260 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13270 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65  .  }.  if( proce
13280 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
13290 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
132a0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
132b0 74 2c 20 69 73 41 67 67 2c 20 22 4f 52 44 45 52  t, isAgg, "ORDER
132c0 22 29 0a 20 20 20 7c 7c 20 70 72 6f 63 65 73 73  ").   || process
132d0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
132e0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  rse, pGroupBy, p
132f0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
13300 20 69 73 41 67 67 2c 20 22 47 52 4f 55 50 22 29   isAgg, "GROUP")
13310 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  .  ){.    goto s
13320 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
13330 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
13340 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
13350 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13360 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13370 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
13380 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
13390 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
133a0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
133b0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
133c0 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e  m in a callback.
133d0 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
133e0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
133f0 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
13400 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ng to some other
13410 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
13420 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
13430 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
13440 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
13450 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
13460 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
13470 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
13480 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
13490 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
134a0 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65  en set the numbe
134b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a  r of columns in.
134c0 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 73    ** the records
134d0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
134e0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
134f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
13500 20 54 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   The caller.  **
13510 20 63 6f 75 6c 64 6e 27 74 20 64 6f 20 74 68 69   couldn't do thi
13520 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
13530 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
13540 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a  is of the form .
13550 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46    ** "SELECT * F
13560 52 4f 4d 20 2e 2e 2e 2e 22 2e 20 0a 20 20 2a 2a  ROM ....". .  **
13570 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f  .  ** We need to
13580 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
13590 77 65 20 73 74 61 72 74 20 69 6e 73 65 72 74 69  we start inserti
135a0 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ng records into 
135b0 74 68 65 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  the .  ** tempor
135c0 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
135d0 20 68 61 73 20 68 61 64 20 4f 50 5f 4b 65 79 41   has had OP_KeyA
135e0 73 44 61 74 61 20 65 78 65 63 75 74 65 64 20 6f  sData executed o
135f0 6e 20 69 74 29 2c 20 62 65 63 61 75 73 65 0a 20  n it), because. 
13600 20 2a 2a 20 69 74 20 69 73 20 72 65 71 75 69 72   ** it is requir
13610 65 64 20 62 79 20 74 68 65 20 6b 65 79 20 63 6f  ed by the key co
13620 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
13630 6e 2e 20 53 6f 20 64 6f 20 69 74 20 6e 6f 77 2c  n. So do it now,
13640 20 65 76 65 6e 0a 20 20 2a 2a 20 74 68 6f 75 67   even.  ** thoug
13650 68 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  h this means tha
13660 74 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  t OP_SetNumColum
13670 6e 73 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ns may be execut
13680 65 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 20  ed on the same. 
13690 20 2a 2a 20 63 75 72 73 6f 72 20 6d 6f 72 65 20   ** cursor more 
136a0 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 2a 2f 0a  than once..  */.
136b0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
136c0 5f 55 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71  _Union ){.    sq
136d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
136e0 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
136f0 6e 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73  ns, iParm, pELis
13700 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
13710 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13720 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
13730 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
13740 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
13750 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
13760 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
13770 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
13780 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
13790 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
137a0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
137b0 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  ext;..    if( pT
137c0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
137d0 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
137e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ue;.    if( pTab
137f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
13800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
13810 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
13820 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
13830 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
13840 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
13850 74 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  t = pTabList->a[
13860 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
13870 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
13880 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
13890 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
138a0 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
138b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
138c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
138d0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
138e0 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d  pSelect, SRT_Tem
138f0 70 54 61 62 6c 65 2c 20 0a 20 20 20 20 20 20 20  pTable, .       
13900 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
13910 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
13920 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20  , p, i, &isAgg, 
13930 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  0);.    if( need
13940 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29  RestoreContext )
13950 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
13960 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
13970 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
13980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
13990 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
139a0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
139b0 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
139c0 65 44 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f 6e  eDest!=SRT_Union
139d0 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
139e0 78 63 65 70 74 20 26 26 20 65 44 65 73 74 21 3d  xcept && eDest!=
139f0 53 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a 20  SRT_Discard ){. 
13a00 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
13a10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
13a20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20   }.    pGroupBy 
13a30 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
13a40 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e     pHaving = p->
13a50 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44  pHaving;.    isD
13a60 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
13a70 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20  istinct;.  }..  
13a80 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
13a90 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
13aa0 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
13ab0 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74  ) function by it
13ac0 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65  self.  ** in the
13ad0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
13ae0 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  /.  if( simpleMi
13af0 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
13b00 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
13b10 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  m) ){.    rc = 0
13b20 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
13b30 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
13b40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
13b50 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
13b60 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
13b70 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
13b80 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
13b90 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
13ba0 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
13bb0 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
13bc0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
13bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
13be0 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67  ent && pParentAg
13bf0 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74  g &&.      flatt
13c00 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
13c10 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  e, pParent, pare
13c20 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
13c30 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
13c40 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
13c50 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
13c60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13c70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
13c80 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
13c90 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20  clause, resolve 
13ca0 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
13cb0 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d  quences.  ** nam
13cc0 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
13cd0 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  n explicitly spe
13ce0 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  cified..  */.  i
13cf0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13d00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
13d10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
13d20 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
13d30 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e  OrderBy->a[i].zN
13d40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ame ){.        p
13d50 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
13d60 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20  xpr->pColl = .  
13d70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13d80 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
13d90 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
13da0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29  >a[i].zName, -1)
13db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13dc0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
13dd0 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f  nErr ){.      go
13de0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
13e00 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
13e10 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69    */.  computeLi
13e20 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
13e30 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49  rse, p);..  /* I
13e40 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
13e50 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
13e60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
13e70 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
13e80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
13e90 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
13ea0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13eb0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
13ec0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
13ed0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
13ee0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13ef0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
13f00 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
13f10 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  pr);.  }..  /* D
13f20 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
13f30 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65   aggregate expre
13f40 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73  ssions..  */.  s
13f50 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
13f60 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
13f70 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20  .  if( isAgg || 
13f80 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
13f90 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13fa0 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nAgg==0 );.    i
13fb0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  sAgg = 1;.    fo
13fc0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
13fd0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13fe0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
13ff0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
14000 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c  ates(pParse, pEL
14010 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
14020 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
14030 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
14040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14050 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
14060 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14070 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
14080 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
14090 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
140a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
140b0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
140c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
140d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
140e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
140f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14100 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76    }.    if( pHav
14110 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78  ing && sqlite3Ex
14120 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
14130 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76  tes(pParse, pHav
14140 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
14150 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
14160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72     }.    if( pOr
14170 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66  derBy ){.      f
14180 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
14190 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
141a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
141b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
141c0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
141d0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
141e0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
141f0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
14200 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
14210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14220 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
14230 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
14240 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
14250 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20  .    int addr = 
14260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14270 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c  (v, OP_AggReset,
14280 20 28 70 47 72 6f 75 70 42 79 3f 30 3a 31 29 2c   (pGroupBy?0:1),
14290 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a   pParse->nAgg);.
142a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
142b0 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
142c0 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
142d0 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69   *pFunc;.      i
142e0 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72  f( (pFunc = pPar
142f0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
14300 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e  c)!=0 && pFunc->
14310 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
14320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14330 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  dbeOp3(v, OP_Agg
14340 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61  Init, 0, i, (cha
14350 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e  r*)pFunc, P3_FUN
14360 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  CDEF);.      }. 
14370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
14380 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
14390 6e 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 4b  nt sz = sizeof(K
143a0 65 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f 75 70  eyInfo) + pGroup
143b0 42 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66  By->nExpr*sizeof
143c0 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 20 20  (CollSeq*);.    
143d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
143e0 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
143f0 69 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20  iteMalloc(sz);. 
14400 20 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65 79       if( 0==pKey
14410 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
14420 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
14430 20 20 20 7d 0a 20 20 20 20 20 20 70 4b 65 79 2d     }.      pKey-
14440 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64  >enc = pParse->d
14450 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 70 4b  b->enc;.      pK
14460 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 47 72  ey->nField = pGr
14470 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
14480 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14490 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
144a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
144b0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
144c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
144d0 71 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  q(pParse, pGroup
144e0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
144f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4b  .        if( !pK
14500 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  ey->aColl[i] ){.
14510 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e            pKey->
14520 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73  aColl[i] = pPars
14530 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
14540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14550 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14560 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
14570 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29 70   addr, (char *)p
14580 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  Key, P3_KEYINFO_
14590 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a  HANDOFF);.    }.
145a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
145b0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
145c0 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a  cell to NULL.  *
145d0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
145e0 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  RT_Mem ){.    sq
145f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14600 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
14610 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14620 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14630 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
14640 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f   1);.  }..  /* O
14650 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
14660 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  table to use for
14670 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
14680 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
14690 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
146a0 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
146b0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 6f  e->nTab++;.    o
146c0 70 65 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61  penTempIndex(pPa
146d0 72 73 65 2c 20 70 2c 20 64 69 73 74 69 6e 63 74  rse, p, distinct
146e0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
146f0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
14700 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
14710 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
14720 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  can.  */.  pWInf
14730 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
14740 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
14750 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
14760 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20 26  pGroupBy ? 0 : &
14790 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
147a0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
147b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
147c0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
147d0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20  dard inner loop 
147e0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65  if we are not de
147f0 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20  aling with.  ** 
14800 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a  aggregates.  */.
14810 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a    if( !isAgg ){.
14820 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
14830 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
14840 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
14850 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
14860 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69  iParm, pWInfo->i
14890 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
148a0 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29  ->iBreak, aff) )
148b0 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
148c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
148d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
148e0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
148f0 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65   aggregates, the
14900 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c  n do the special
14910 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20   aggregate.  ** 
14920 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20  processing.  .  
14930 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 41  */.  else{.    A
14940 67 67 45 78 70 72 20 2a 70 41 67 67 3b 0a 20 20  ggExpr *pAgg;.  
14950 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
14960 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31  {.      int lbl1
14970 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
14980 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
14990 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
149a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
149b0 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
149c0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
149d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
149e0 2a 20 4e 6f 20 61 66 66 69 6e 69 74 79 20 73 74  * No affinity st
149f0 72 69 6e 67 20 69 73 20 61 74 74 61 63 68 65 64  ring is attached
14a00 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
14a10 67 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  g OP_MakeRecord 
14a20 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73  .      ** becaus
14a30 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
14a40 20 74 6f 20 64 6f 20 61 6e 79 20 63 6f 65 72 63   to do any coerc
14a50 69 6f 6e 20 6f 66 20 64 61 74 61 74 79 70 65 73  ion of datatypes
14a60 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
14a70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14a80 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 47  P_MakeRecord, pG
14a90 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30  roupBy->nExpr, 0
14aa0 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
14ab0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14ac0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
14ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14ae0 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
14af0 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  0, lbl1);.      
14b00 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
14b10 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
14b20 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
14b30 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
14b40 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67    if( pAgg->isAg
14b50 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
14b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14b70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 41  rCode(pParse, pA
14b80 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  gg->pExpr);.    
14b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65  ddOp(v, OP_AggSe
14bb0 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
14bc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14bd0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14be0 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a  v, lbl1);.    }.
14bf0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67      for(i=0, pAg
14c00 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20  g=pParse->aAgg; 
14c10 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
14c20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20  i++, pAgg++){.  
14c30 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
14c40 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
14c50 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
14c60 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ef;.      if( !p
14c70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e  Agg->isAgg ) con
14c80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
14c90 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63  ert( pAgg->pFunc
14ca0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
14cb0 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63  ert( pAgg->pFunc
14cc0 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20  ->xStep!=0 );.  
14cd0 20 20 20 20 70 44 65 66 20 3d 20 70 41 67 67 2d      pDef = pAgg-
14ce0 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 45  >pFunc;.      pE
14cf0 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a   = pAgg->pExpr;.
14d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14d10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
14d20 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pE->op==TK_
14d30 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
14d40 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71        nExpr = sq
14d50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
14d60 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
14d70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
14d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14d90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14da0 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  i, 0);.      if(
14db0 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
14dc0 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  eq ){.        Co
14dd0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
14de0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
14df0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
14e00 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45  ; !pColl && j<nE
14e10 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
14e20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
14e30 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
14e40 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
14e50 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a  t->a[j].pExpr);.
14e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14e70 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
14e80 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
14e90 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
14ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14eb0 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  eOp3(v, OP_CollS
14ec0 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  eq, 0, 0, (char 
14ed0 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c  *)pColl, P3_COLL
14ee0 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
14ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
14f00 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63  p3(v, OP_AggFunc
14f10 2c 20 30 2c 20 6e 45 78 70 72 2c 20 28 63 68 61  , 0, nExpr, (cha
14f20 72 2a 29 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e  r*)pDef, P3_POIN
14f30 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TER);.    }.  }.
14f40 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61  .  /* End the da
14f50 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
14f60 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14f70 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
14f80 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
14f90 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
14fa0 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
14fb0 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
14fc0 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
14fd0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
14fe0 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
14ff0 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
15000 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
15010 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
15020 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62  agg = sqlite3Vdb
15030 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15040 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b     int startagg;
15050 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20  .    startagg = 
15060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15070 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20  (v, OP_AggNext, 
15080 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20  0, endagg);.    
15090 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
150a0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76   1;.    if( pHav
150b0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
150c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
150d0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
150e0 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20   startagg, 1);. 
150f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c     }.    if( sel
15100 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15110 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
15120 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
15130 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
15140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15150 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72       iParm, star
15160 74 61 67 67 2c 20 65 6e 64 61 67 67 2c 20 61 66  tagg, endagg, af
15170 66 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  f) ){.      goto
15180 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
15190 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
151a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
151b0 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29  to, 0, startagg)
151c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
151d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
151e0 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
151f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15200 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
15210 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
15220 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  eAgg = 0;.  }.. 
15230 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
15240 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15250 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
15260 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
15270 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
15280 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
15290 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
152a0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
152b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
152c0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
152d0 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45  pParse, p, v, pE
152e0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
152f0 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a  st, iParm);.  }.
15300 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61  .  /* If this wa
15310 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65  s a subquery, we
15320 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72   have now conver
15330 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79  ted the subquery
15340 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d   into a.  ** tem
15350 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53  porary table.  S
15360 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  o delete the sub
15370 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20  query structure 
15380 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a  from the parent.
15390 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20    ** to prevent 
153a0 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72  this subquery fr
153b0 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  om being evaluat
153c0 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20  ed again and to 
153d0 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74  force the.  ** t
153e0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 74 65  he use of the te
153f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20  mporary table.. 
15400 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
15410 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
15420 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
15430 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29  nSrc>parentTab )
15440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
15450 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
15460 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
15470 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==p );.    sqli
15480 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
15490 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d  p);.    pParent-
154a0 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
154b0 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  ab].pSelect = 0;
154c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53  .  }..  /* The S
154d0 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
154e0 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
154f0 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
15500 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
15510 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
15520 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
15530 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
15540 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
15550 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
15560 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
15570 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
15580 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
15590 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
155a0 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
155b0 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
155c0 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
155d0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  se);.  return rc
155e0 3b 0a 7d 0a                                      ;.}.