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

Artifact d01c03462d57b9d1ea25eea297bbd2c1b1c70e47:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 36 39  select.c,v 1.169
0200: 20 32 30 30 34 2f 30 35 2f 31 39 20 31 34 3a 35   2004/05/19 14:5
0210: 36 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a 2a  6:56 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
0440: 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20  nt nLimit,      
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  lue.  -1 means n
0470: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
0480: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
0490: 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c     /* OFFSET val
04a0: 75 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20  ue.  0 means no 
04b0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
04c0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70  elect *pNew;.  p
04d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
04e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
04f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0500: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0510: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0520: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
0530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
0540: 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  e(pSrc);.    sql
0550: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0580: 65 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e(pGroupBy);.   
0590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
05a0: 74 65 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  te(pHaving);.   
05b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
05c0: 44 65 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29  Delete(pOrderBy)
05d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
05e0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
05f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73        pEList = s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0610: 70 65 6e 64 28 30 2c 20 73 71 6c 69 74 65 33 45  pend(0, sqlite3E
0620: 78 70 72 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  xpr(TK_ALL,0,0,0
0630: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
0640: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0650: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  pEList;.    pNew
0660: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0670: 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20     pNew->pWhere 
0680: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 70 4e  = pWhere;.    pN
0690: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
06a0: 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4e 65  GroupBy;.    pNe
06b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
06c0: 76 69 6e 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ving;.    pNew->
06d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
06e0: 72 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  rBy;.    pNew->i
06f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69  sDistinct = isDi
0700: 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77  stinct;.    pNew
0710: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0720: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  ;.    pNew->nLim
0730: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
0740: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
0750: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 4e   nOffset;.    pN
0760: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
0770: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
0780: 65 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  et = -1;.  }.  r
0790: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
07a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
07b0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
07c0: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
07d0: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
07e0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
07f0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0800: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0810: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0820: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0830: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0850: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0860: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0870: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0880: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0890: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
08a0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
08b0: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
08c0: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
08d0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
08e0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
08f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0900: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0910: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0920: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0930: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0940: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0950: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0960: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0980: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
09a0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
09b0: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
09c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
09d0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
09e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
09f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0a00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0a10: 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20 69 6e 74  Keyword;.    int
0a20: 20 6e 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20   nChar;.    int 
0a30: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0a40: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0a50: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0a60: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0a70: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0a80: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0a90: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0aa0: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0ab0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ac0: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0ad0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0ae0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0af0: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0b00: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0b10: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0b20: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0b30: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0b40: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d   JT_INNER },.  }
0b50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
0b60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
0b70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
0b80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
0b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
0ba0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
0bb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
0bc0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
0bd0: 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ; j<sizeof(keywo
0be0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0bf0: 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a  ords[0]); j++){.
0c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
0c10: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
0c20: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
0c30: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
0c40: 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a  p->z, keywords[j
0c50: 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e  ].zKeyword, p->n
0c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
0c70: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77  jointype |= keyw
0c80: 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  ords[j].code;.  
0c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0ca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0cb0: 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79  f( j>=sizeof(key
0cc0: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
0cd0: 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20  ywords[0]) ){.  
0ce0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0cf0: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
0d00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0d10: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
0d20: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
0d30: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
0d40: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0d50: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
0d60: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
0d70: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 73 74 61 74  =0.  ){.    stat
0d80: 69 63 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 20 3d  ic Token dummy =
0d90: 20 7b 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 63   { 0, 0 };.    c
0da0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 2c  har *zSp1 = " ",
0db0: 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20   *zSp2 = " ";.  
0dc0: 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 70    if( pB==0 ){ p
0dd0: 42 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 31  B = &dummy; zSp1
0de0: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 69 66 28 20   = 0; }.    if( 
0df0: 70 43 3d 3d 30 20 29 7b 20 70 43 20 3d 20 26 64  pC==0 ){ pC = &d
0e00: 75 6d 6d 79 3b 20 7a 53 70 32 20 3d 20 30 3b 20  ummy; zSp2 = 0; 
0e10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  }.    sqlite3Set
0e20: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
0e30: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
0e40: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
0e50: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 2c 20  d join type: ", 
0e60: 30 2c 0a 20 20 20 20 20 20 20 70 41 2d 3e 7a 2c  0,.       pA->z,
0e70: 20 70 41 2d 3e 6e 2c 20 7a 53 70 31 2c 20 31 2c   pA->n, zSp1, 1,
0e80: 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e 6e 2c 20 7a   pB->z, pB->n, z
0e90: 53 70 32 2c 20 31 2c 20 70 43 2d 3e 7a 2c 20 70  Sp2, 1, pC->z, p
0ea0: 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  C->n, 0);.    pP
0eb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0ec0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0ed0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
0ee0: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
0ef0: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
0f00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0f10: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
0f20: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
0f30: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
0f40: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
0f50: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
0f60: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
0f80: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
0f90: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
0fa0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
0fb0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
0fc0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
0fd0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
0fe0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
0ff0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1000: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1010: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1020: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1050: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1060: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1070: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1080: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1090: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
10a0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
10b0: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
10c0: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
10d0: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
10e0: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
10f0: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
1100: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
1110: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
1120: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
1130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1140: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63  ddWhereTerm(.  c
1150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1180: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1190: 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46  pTab1,      /* F
11a0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
11b0: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
11c0: 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  b2,      /* Seco
11d0: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  nd table */.  Ex
11e0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
11f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1200: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1210: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1220: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  on */.){.  Token
1230: 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a   dummy;.  Expr *
1240: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1250: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1260: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1270: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 64    Expr *pE;..  d
1280: 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b 0a 20  ummy.z = zCol;. 
1290: 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65   dummy.n = strle
12a0: 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d 6d 79  n(zCol);.  dummy
12b0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45 31 61  .dyn = 0;.  pE1a
12c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
12d0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
12e0: 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71  my);.  pE2a = sq
12f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1300: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1310: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1320: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1330: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1340: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1350: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1360: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1370: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
1380: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
1390: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
13a0: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
13b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
13c0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
13d0: 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  y);.  pE1c = sql
13e0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
13f0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1400: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1410: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1420: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1430: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1440: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1450: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1460: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1470: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66  _FromJoin);.  if
1480: 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20  ( *ppExpr ){.   
1490: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
14a0: 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a  e3Expr(TK_AND, *
14b0: 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a  ppExpr, pE, 0);.
14c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
14d0: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d  Expr = pE;.  }.}
14e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1500: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
1510: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
1520: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1530: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1540: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1550: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1560: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1570: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1580: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1590: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
15a0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
15b0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
15c0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
15d0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
15e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
15f0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1600: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1610: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
1620: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
1630: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
1640: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
1650: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
1660: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
1670: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1680: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1690: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
16a0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
16b0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  NG clause..*/.st
16c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
16d0: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  nExpr(Expr *p){.
16e0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
16f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1700: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
1710: 29 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  );.    setJoinEx
1720: 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
1730: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
1740: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
1750: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
1760: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
1770: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
1780: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1790: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
17a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
17b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
17c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
17d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
17e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
17f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
1800: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
1810: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  erms..**.** This
1820: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1830: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1840: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
1850: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1860: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1870: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
1880: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1890: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
18a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72   int i, j;.  pSr
18b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  c = p->pSrc;.  f
18c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
18d0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  nSrc-1; i++){.  
18e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18f0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26  _item *pTerm = &
1900: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
1910: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1920: 74 65 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  tem *pOther = &p
1930: 53 72 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20  Src->a[i+1];..  
1940: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61    if( pTerm->pTa
1950: 62 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  b==0 || pOther->
1960: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
1970: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
1980: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
1990: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
19a0: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
19b0: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
19c0: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
19d0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
19e0: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
19f0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1a00: 66 28 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79  f( pTerm->jointy
1a10: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
1a20: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1a30: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1a40: 70 54 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54  pTerm->pOn || pT
1a50: 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  erm->pUsing ){. 
1a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a80: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
1a90: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
1aa0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
1ab0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
1ac0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
1ad0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1ae0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 65        pTab = pTe
1af0: 72 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  rm->pTab;.      
1b00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1b10: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1b20: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
1b30: 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61  ndex(pOther->pTa
1b40: 62 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  b, pTab->aCol[j]
1b50: 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20  .zName)>=0 ){.  
1b60: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
1b70: 54 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  Term(pTab->aCol[
1b80: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20  j].zName, pTab, 
1b90: 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70  pOther->pTab, &p
1ba0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
1bb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
1bd0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
1be0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
1bf0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
1c00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1c10: 65 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72  erm->pOn && pTer
1c20: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1c30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c40: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1c50: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
1c60: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
1c70: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
1c80: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
1c90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1cb0: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
1cc0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1cd0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
1ce0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
1cf0: 20 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65    ** and AND ope
1d00: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
1d10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1d20: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
1d30: 6e 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e  nExpr(pTerm->pOn
1d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1d50: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
1d60: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
1d70: 20 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20   pTerm->pOn;.   
1d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d90: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
1da0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1db0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65  , p->pWhere, pTe
1dc0: 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20  rm->pOn, 0);.   
1dd0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
1de0: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
1df0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1e00: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
1e10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
1e30: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
1e40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
1e50: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
1e60: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
1e70: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
1e80: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
1e90: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
1ea0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
1eb0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
1ec0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
1ee0: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
1ef0: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
1f00: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
1f10: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
1f20: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
1f30: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
1f40: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
1f50: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1f60: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
1f70: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
1f80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1f90: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
1fa0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b    IdList *pList;
1fb0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1fc0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 53      assert( i<pS
1fd0: 72 63 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20  rc->nSrc-1 );.  
1fe0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72      pList = pTer
1ff0: 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  m->pUsing;.     
2000: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
2010: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
2020: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
2030: 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61  Index(pTerm->pTa
2040: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  b, pList->a[j].z
2050: 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20  Name)<0 ||.     
2060: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
2070: 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c  ex(pOther->pTab,
2080: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
2090: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
20a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20b0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
20c0: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
20d0: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
20e0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
20f0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2100: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 70 4c 69  oth tables", pLi
2110: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  st->a[j].zName);
2120: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2130: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2140: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2150: 65 72 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  erm(pList->a[j].
2160: 7a 4e 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54  zName, pTerm->pT
2170: 61 62 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62  ab, pOther->pTab
2180: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21b0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
21c0: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
21d0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
21e0: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
21f0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2200: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2210: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
2220: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2230: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  n;.  sqlite3Expr
2240: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2250: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2260: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2270: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
2280: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2290: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
22a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
22b0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
22c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
22d0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22f0: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
2300: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
2310: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
2320: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  rior);.  sqliteF
2330: 72 65 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b  ree(p->zSelect);
2340: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
2350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2360: 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2370: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2380: 20 74 68 65 20 70 61 72 73 65 20 73 74 72 75 63   the parse struc
2390: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
23a0: 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72 65  void sqliteAggre
23b0: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61  gateInfoReset(Pa
23c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23d0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73  sqliteFree(pPars
23e0: 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72  e->aAgg);.  pPar
23f0: 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20  se->aAgg = 0;.  
2400: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
2410: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41  ;.  pParse->useA
2420: 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
2430: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2440: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2450: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2460: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2470: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2480: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a  the sorter..**.*
2490: 2a 20 46 49 58 20 4d 45 3a 20 20 43 68 61 6e 67  * FIX ME:  Chang
24a0: 65 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 69  e this so that i
24b0: 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f 4d 61  t uses the OP_Ma
24c0: 6b 65 4b 65 79 20 6f 70 63 6f 64 65 0a 2a 2a 20  keKey opcode.** 
24d0: 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 53 6f  instead of OP_So
24e0: 72 74 4d 61 6b 65 4b 65 79 2e 20 20 44 65 6c 65  rtMakeKey.  Dele
24f0: 74 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 4d 61  te the OP_SortMa
2500: 6b 65 4b 65 79 20 6f 70 63 6f 64 65 2e 0a 2a 2a  keKey opcode..**
2510: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 73 20 73 68 6f   All columns sho
2520: 75 6c 64 20 68 61 76 65 20 61 66 66 69 6e 69 74  uld have affinit
2530: 79 20 4e 4f 4e 45 2e 20 20 48 61 6e 64 6c 65 20  y NONE.  Handle 
2540: 41 53 43 20 76 65 72 73 75 73 0a 2a 2a 20 44 45  ASC versus.** DE
2550: 53 43 20 73 6f 72 74 20 6f 72 64 65 72 20 62 79  SC sort order by
2560: 20 64 65 66 69 6e 69 6e 67 20 61 20 6c 69 73 74   defining a list
2570: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   of comparison f
2580: 75 6e 63 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 62  unctions to.** b
2590: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  e used by the OP
25a0: 5f 53 6f 72 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f  _Sort opcode..*/
25b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
25c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73  hOntoSorter(Pars
25d0: 65 20 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20  e *pParse, Vdbe 
25e0: 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *v, ExprList *pO
25f0: 72 64 65 72 42 79 29 7b 0a 20 20 63 68 61 72 20  rderBy){.  char 
2600: 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 69  *zSortOrder;.  i
2610: 6e 74 20 69 3b 0a 20 20 7a 53 6f 72 74 4f 72 64  nt i;.  zSortOrd
2620: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
2630: 63 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  c( pOrderBy->nEx
2640: 70 72 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  pr + 1 );.  if( 
2650: 7a 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20  zSortOrder==0 ) 
2660: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2670: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
2680: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2690: 69 6e 74 20 6f 72 64 65 72 20 3d 20 70 4f 72 64  int order = pOrd
26a0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
26b0: 72 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 74 79  rder;.    int ty
26c0: 70 65 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  pe;.    int c;. 
26d0: 20 20 20 69 66 28 20 28 6f 72 64 65 72 20 26 20     if( (order & 
26e0: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
26f0: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  SK)==SQLITE_SO_T
2700: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 74 79 70  EXT ){.      typ
2710: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  e = SQLITE_SO_TE
2720: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
2730: 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54  ( (order & SQLIT
2740: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d  E_SO_TYPEMASK)==
2750: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b  SQLITE_SO_NUM ){
2760: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51  .      type = SQ
2770: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
2780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 79   }else{.      ty
2790: 70 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pe = sqlite3Expr
27a0: 54 79 70 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  Type(pOrderBy->a
27b0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
27c0: 7d 0a 20 20 20 20 69 66 28 20 28 6f 72 64 65 72  }.    if( (order
27d0: 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 49 52   & SQLITE_SO_DIR
27e0: 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  MASK)==SQLITE_SO
27f0: 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 63 20  _ASC ){.      c 
2800: 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53  = type==SQLITE_S
2810: 4f 5f 54 45 58 54 20 3f 20 27 41 27 20 3a 20 27  O_TEXT ? 'A' : '
2820: 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +';.    }else{. 
2830: 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d 53       c = type==S
2840: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f 20  QLITE_SO_TEXT ? 
2850: 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 7d  'D' : '-';.    }
2860: 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b  .    zSortOrder[
2870: 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69  i] = c;.    sqli
2880: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2890: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
28a0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  i].pExpr);.  }. 
28b0: 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64   zSortOrder[pOrd
28c0: 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30  erBy->nExpr] = 0
28d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  ;.  sqlite3VdbeO
28e0: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  p3(v, OP_SortMak
28f0: 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e  eKey, pOrderBy->
2900: 6e 45 78 70 72 2c 20 30 2c 20 7a 53 6f 72 74 4f  nExpr, 0, zSortO
2910: 72 64 65 72 2c 20 50 33 5f 44 59 4e 41 4d 49 43  rder, P3_DYNAMIC
2920: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2940: 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Put, 0, 0);.}../
2950: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2960: 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67 75  e adds a P3 argu
2970: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74  ment to the last
2980: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61   VDBE opcode tha
2990: 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65  t was.** inserte
29a0: 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d 65  d. The P3 argume
29b0: 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73 74  nt added is a st
29c0: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
29d0: 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b  r the .** OP_Mak
29e0: 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49  eKey or OP_MakeI
29f0: 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20  dxKey opcodes.  
2a00: 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  The string consi
2a10: 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  sts of.** charac
2a20: 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20  ters 't' or 'n' 
2a30: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
2a40: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2a50: 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64  various.** field
2a60: 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20  s of the key to 
2a70: 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f  be generated sho
2a80: 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61  uld be treated a
2a90: 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20  s numeric.** or 
2aa0: 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74 68  as text.  See th
2ab0: 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64  e OP_MakeKey and
2ac0: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f   OP_MakeIdxKey o
2ad0: 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e  pcode.** documen
2ae0: 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  tation for addit
2af0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2b00: 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20 73  n about the P3 s
2b10: 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c  tring..** See al
2b20: 73 6f 20 74 68 65 20 73 71 6c 69 74 65 33 41 64  so the sqlite3Ad
2b30: 64 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f  dIdxKeyType() ro
2b40: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
2b50: 71 6c 69 74 65 33 41 64 64 4b 65 79 54 79 70 65  qlite3AddKeyType
2b60: 28 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69  (Vdbe *v, ExprLi
2b70: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
2b80: 6e 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c  nt nColumn = pEL
2b90: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68  ist->nExpr;.  ch
2ba0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69  ar *zType = sqli
2bb0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d  teMalloc( nColum
2bc0: 6e 2b 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  n+1 );.  int i;.
2bd0: 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29    if( zType==0 )
2be0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
2bf0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
2c00: 2b 2b 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69  ++){.    zType[i
2c10: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54  ] = sqlite3ExprT
2c20: 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ype(pEList->a[i]
2c30: 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f  .pExpr)==SQLITE_
2c40: 53 4f 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27  SO_NUM ? 'n' : '
2c50: 74 27 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b  t';.  }.  zType[
2c60: 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
2c70: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
2c80: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f 44   -1, zType, P3_D
2c90: 59 4e 41 4d 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  YNAMIC);.}../*.*
2ca0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
2cb0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
2cc0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
2cd0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
2ce0: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
2cf0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
2d00: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
2d10: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
2d20: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
2d30: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
2d40: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
2d50: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
2d60: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
2d70: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
2d80: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
2d90: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
2da0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
2db0: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
2dc0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
2dd0: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
2de0: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mn..*/.static in
2df0: 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  t selectInnerLoo
2e00: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
2e10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2e20: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2e30: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2e40: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2e50: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
2e60: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
2e70: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
2e80: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2e90: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
2ea0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
2eb0: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
2ec0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
2ee0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
2ef0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
2f00: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
2f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
2f30: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
2f40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2f50: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
2f60: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
2f70: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
2f80: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
2f90: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
2fa0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
2fb0: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
2fc0: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
2fd0: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
2fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
2ff0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
3000: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
3010: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
3020: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67         /* An arg
3030: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73  ument to the dis
3040: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
3050: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
3070: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
3080: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
3090: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
30a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
30b0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
30c0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
30d0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
30e0: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
30f0: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
3100: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
3110: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
3120: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3130: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3140: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
3150: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
3160: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
3170: 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  st!=0 );..  /* I
3180: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49  f there was a LI
3190: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  MIT clause on th
31a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
31b0: 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  nt, then do the 
31c0: 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  check.  ** to se
31d0: 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68  e if this row sh
31e0: 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a  ould be output..
31f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
3200: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  rBy==0 ){.    if
3210: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
3220: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
3230: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
3240: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
3250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3260: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
3270: 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  ncr, p->iOffset,
3280: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
3290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32a0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
32b0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
32c0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69  }.    if( p->iLi
32d0: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit>=0 ){.      
32e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32f0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
3300: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
3310: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  k);.    }.  }.. 
3320: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
3330: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
3340: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75    */.  if( nColu
3350: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
3360: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
3370: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
3380: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3390: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
33a0: 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  b, i);.    }.  }
33b0: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  else{.    nColum
33c0: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
33d0: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
33e0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
33f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3400: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
3410: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
3420: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
3430: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
3440: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
3450: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
3460: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3470: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
3480: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
3490: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
34a0: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
34b0: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
34c0: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
34d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74  .  */.  if( dist
34e0: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
34f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
3500: 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c  pr>0 ){.#if NULL
3510: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3520: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
3540: 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78  ll, -pEList->nEx
3550: 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  pr, sqlite3VdbeC
3560: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29  urrentAddr(v)+7)
3570: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
3580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3590: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c   OP_MakeKey, pEL
35a0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
35b0: 20 20 20 20 73 71 6c 69 74 65 33 41 64 64 4b 65      sqlite3AddKe
35c0: 79 54 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29  yType(v, pEList)
35d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
35e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73  eAddOp(v, OP_Dis
35f0: 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c  tinct, distinct,
3600: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
3610: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
3620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3630: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70  dOp(v, OP_Pop, p
3640: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20  EList->nExpr+1, 
3650: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
3660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
3670: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
3680: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
3690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
36a0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
36b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
36d0: 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29  ey, distinct, 0)
36e0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
36f0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
3700: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
3710: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
3720: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
3730: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
3740: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
3750: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
3760: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
3770: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3780: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3790: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
37a0: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
37b0: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
37c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
37d0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66  angeP3(v, -1, af
37e0: 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  f, P3_STATIC);. 
37f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3800: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
3810: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
3820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3830: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
3840: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
3850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3860: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
3870: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
3880: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
3890: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
38a0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
38b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
38c0: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
38d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
38e0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
38f0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
3900: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3910: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
3920: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3930: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3940: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
3950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3960: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3970: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
3980: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
39a0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
39b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
39c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
39d0: 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d  PutIntKey, iParm
39e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
39f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3a00: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
3a10: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
3a20: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
3a30: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
3a40: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
3a50: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
3a60: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
3a70: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
3a80: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
3a90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
3aa0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
3ab0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
3ac0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
3ad0: 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
3ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3af0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3b00: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
3b10: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3b20: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3b30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
3b40: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
3b50: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
3b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3b70: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50   OP_NotFound, iP
3b80: 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  arm, addr+3);.  
3b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3ba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
3bb0: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
3bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3bd0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
3be0: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
3bf0: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
3c00: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
3c10: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
3c20: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
3c30: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
3c40: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
3c50: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
3c60: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
3c70: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
3c80: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
3c90: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3ca0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
3cb0: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
3cc0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3cd0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  dr(v);.      int
3ce0: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
3cf0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
3d00: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
3d10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3d20: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
3d30: 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73  ddr1+3);.      s
3d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3d50: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
3d60: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
3d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d80: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
3d90: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3da0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3db0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3dc0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3dd0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3de0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
3df0: 20 63 6f 6e 73 74 20 2a 61 66 66 53 74 72 3b 0a   const *affStr;.
3e00: 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
3e10: 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30   = (iParm>>16)&0
3e20: 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66  xFF;.        aff
3e30: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
3e40: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
3e50: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66  ->a[0].pExpr, af
3e60: 66 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 53  f);.        affS
3e70: 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  tr = sqlite3Affi
3e80: 6e 69 74 79 53 74 72 69 6e 67 28 61 66 66 29 3b  nityString(aff);
3e90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3ea0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
3eb0: 6b 65 4b 65 79 2c 20 31 2c 20 30 2c 20 61 66 66  keKey, 1, 0, aff
3ec0: 53 74 72 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  Str, P3_STATIC);
3ed0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3ee0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3ef0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
3f00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3f10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3f20: 74 53 74 72 4b 65 79 2c 20 28 69 50 61 72 6d 26  tStrKey, (iParm&
3f30: 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b  0x0000FFFF), 0);
3f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
3f50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3f60: 50 32 28 76 2c 20 61 64 64 72 32 2c 20 73 71 6c  P2(v, addr2, sql
3f70: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3f80: 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 62  ddr(v));.      b
3f90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3fa0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
3fb0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
3fc0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
3fd0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
3fe0: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
3ff0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
4000: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
4010: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
4020: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
4030: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
4040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4050: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
4060: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4070: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
4080: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4090: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
40a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
40b0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
40c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
40d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
40e0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
40f0: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
4100: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
4120: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4140: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4150: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
4160: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
4170: 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
4180: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4190: 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20  lback:.    case 
41a0: 53 52 54 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20  SRT_Sorter: {.  
41b0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
41c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
41d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
41e0: 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65 63 2c 20  OP_SortMakeRec, 
41f0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4200: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4210: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
4220: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
4230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
4240: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
4250: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  T_Callback );.  
4260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4270: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
4280: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
4290: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
42a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
42b0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 20      /* Invoke a 
42c0: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 68 61  subroutine to ha
42d0: 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c 74 73  ndle the results
42e0: 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  .  The subroutin
42f0: 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20  e itself.    ** 
4300: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
4310: 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65 20 72  or popping the r
4320: 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20 74 68  esults off of th
4330: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  e stack..    */.
4340: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62      case SRT_Sub
4350: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
4360: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4380: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4390: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
43a0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  umn, 0);.       
43b0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
43c0: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
43d0: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
43e0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
43f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4400: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4410: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4430: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
4440: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
4450: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
4460: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
4470: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
4480: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
4490: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
44a0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
44b0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
44c0: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
44d0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
44e0: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
44f0: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4500: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4510: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4520: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
4530: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
4540: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
4550: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
4560: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
4570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4580: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43  Op(v, OP_Pop, nC
4590: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
45a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
45b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
45c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
45d0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
45e0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
45f0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
4600: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
4610: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
4620: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
4630: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
4640: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
4650: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
4660: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
4670: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
4680: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
4690: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
46a0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
46b0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
46c0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
46d0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
46e0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65  teSortTail(.  Se
46f0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f  lect *p,       /
4700: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
4710: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
4720: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *v,         /* 
4730: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
4740: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
4750: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
4760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4770: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
4780: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
4790: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
47a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
47b0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
47c0: 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  iParm        /* 
47d0: 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74  Optional paramet
47e0: 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
47f0: 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20  th eDest */.){. 
4800: 20 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69   int end1 = sqli
4810: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
4820: 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20  (v);.  int end2 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
4850: 20 61 64 64 72 3b 0a 20 20 69 66 28 20 65 44 65   addr;.  if( eDe
4860: 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29  st==SRT_Sorter )
4870: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
4880: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4890: 50 5f 53 6f 72 74 2c 20 30 2c 20 30 29 3b 0a 20  P_Sort, 0, 0);. 
48a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
48b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
48c0: 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31  ortNext, 0, end1
48d0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  );.  if( p->iOff
48e0: 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  set>=0 ){.    sq
48f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4900: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d  , OP_MemIncr, p-
4910: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 34  >iOffset, addr+4
4920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4930: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4940: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
4950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4960: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
4970: 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dr);.  }.  if( p
4980: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
4990: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
49a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
49b0: 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 65 6e  r, p->iLimit, en
49c0: 64 32 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  d2);.  }.  switc
49d0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
49e0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
49f0: 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k: {.      sqlit
4a00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a10: 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20  P_SortCallback, 
4a20: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4a30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4a40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
4a50: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
4a60: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
4a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4a80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
4a90: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
4aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
4ac0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
4ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ae0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
4af0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4b10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
4b20: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
4b30: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4b40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4b50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
4b60: 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65  Null, -1, sqlite
4b70: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
4b80: 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  (v)+3);.      sq
4b90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4ba0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4bc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4bd0: 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  to, 0, sqlite3Vd
4be0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4bf0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4c00: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
4c10: 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 31 2c 20 22  MakeKey, 1, 1, "
4c20: 6e 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  n", P3_STATIC);.
4c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4c40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
4c50: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
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 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
4c80: 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  ey, (iParm&0x000
4c90: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4cb0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
4cc0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4cd0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
4ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
4d00: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
4d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4d30: 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20  to, 0, end1);.  
4d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4d50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
4d60: 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  broutine: {.    
4d70: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
4d80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4d90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
4da0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
4db0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4dc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4dd0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
4de0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4df0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
4e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4e10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4e20: 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a  lumn, -1-i, i);.
4e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4e50: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
4e60: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Parm);.      sql
4e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4e80: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
4e90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ea0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4eb0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
4ec0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
4ed0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4ee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ef0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4f00: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
4f10: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4f20: 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73  el(v, end2);.  s
4f30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f40: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4f50: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
4f60: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
4f70: 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nd1);.  sqlite3V
4f80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4f90: 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b  ortReset, 0, 0);
4fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
4fb0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
4fc0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
4fd0: 74 68 65 20 64 61 74 61 74 79 70 65 73 20 6f 66  the datatypes of
4fe0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  .** columns in t
4ff0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
5000: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5010: 65 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 73  e only generates
5020: 20 63 6f 64 65 20 69 66 20 74 68 65 20 22 50 52   code if the "PR
5030: 41 47 4d 41 20 73 68 6f 77 5f 64 61 74 61 74 79  AGMA show_dataty
5040: 70 65 73 3d 6f 6e 22 0a 2a 2a 20 68 61 73 20 62  pes=on".** has b
5050: 65 65 6e 20 65 78 65 63 75 74 65 64 2e 20 20 54  een executed.  T
5060: 68 65 20 64 61 74 61 74 79 70 65 73 20 61 72 65  he datatypes are
5070: 20 72 65 70 6f 72 74 65 64 20 6f 75 74 20 69 6e   reported out in
5080: 20 74 68 65 20 61 7a 43 6f 6c 0a 2a 2a 20 70 61   the azCol.** pa
5090: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 63  rameter to the c
50a0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
50b0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 4e 20 61  .  The first N a
50c0: 7a 43 6f 6c 5b 5d 20 65 6e 74 72 69 65 73 0a 2a  zCol[] entries.*
50d0: 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  * are the names 
50e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 2c 20  of the columns, 
50f0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 4e  and the second N
5100: 20 65 6e 74 72 69 65 73 20 61 72 65 20 74 68 65   entries are the
5110: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
5120: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  r the columns..*
5130: 2a 0a 2a 2a 20 54 68 65 20 22 64 61 74 61 74 79  *.** The "dataty
5140: 70 65 22 20 66 6f 72 20 61 20 72 65 73 75 6c 74  pe" for a result
5150: 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
5160: 6e 20 6f 66 20 61 20 74 79 70 65 20 69 73 20 74  n of a type is t
5170: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 20 64  he.** datatype d
5180: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
5190: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 43 52 45  ted from the CRE
51a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
51b0: 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 61 74 61  ent..** The data
51c0: 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70 72  type for an expr
51d0: 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65 72  ession is either
51e0: 20 54 45 58 54 20 6f 72 20 4e 55 4d 45 52 49 43   TEXT or NUMERIC
51f0: 2e 20 20 54 68 65 0a 2a 2a 20 64 61 74 61 74 79  .  The.** dataty
5200: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
5210: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
5220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5230: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
5240: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
5250: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
5260: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5270: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
5280: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
5290: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
52a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
52b0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
52c0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
52d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
52e0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
52f0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
5300: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
5310: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
5320: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
5330: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
5340: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 68 61  ].pExpr;.    cha
5350: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
5360: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e    if( p==0 ) con
5370: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
5380: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
5390: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
53a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
53b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
53c0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
53d0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
53e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
53f0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
5400: 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61  .iCursor!=p->iTa
5410: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
5420: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
5430: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
5440: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
5450: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
5460: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5470: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
5480: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
5490: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
54a0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
54b0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
54c0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
54d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
54e0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
54f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5500: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
5510: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5520: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
5530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5540: 28 20 73 71 6c 69 74 65 33 45 78 70 72 54 79 70  ( sqlite3ExprTyp
5550: 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  e(p)==SQLITE_SO_
5560: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
5570: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
5580: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5590: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 4e 55       zType = "NU
55a0: 4d 45 52 49 43 22 3b 0a 20 20 20 20 20 20 7d 0a  MERIC";.      }.
55b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
55c0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
55d0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b 20 70  olumnName, i + p
55e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
55f0: 20 7a 54 79 70 65 2c 20 30 29 3b 0a 20 20 7d 0a   zType, 0);.  }.
5600: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5610: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5620: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5630: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5640: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5650: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
5660: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
5670: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
5680: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
5690: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
56a0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
56b0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
56c0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
56d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
56e0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
56f0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
5700: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
5710: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
5720: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5730: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
5740: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5750: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5760: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5770: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5780: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
5790: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
57a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
57b0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
57c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  ;..  assert( v!=
57d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  0 );.  if( pPars
57e0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
57f0: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5800: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5810: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
5820: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5830: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
5840: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
5850: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
5860: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
5870: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
5880: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
5890: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
58a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
58b0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
58c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
58d0: 20 20 69 6e 74 20 70 32 20 3d 20 69 3d 3d 70 45    int p2 = i==pE
58e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  List->nExpr-1;. 
58f0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
5900: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
5910: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
5920: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
5930: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
5940: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
5950: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
5960: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
5970: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
5980: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5990: 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30   i, p2, zName, 0
59a0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
59b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
59c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
59d0: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
59e0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
59f0: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
5a00: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
5a10: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
5a20: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
5a30: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
5a40: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
5a50: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
5a60: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
5a70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
5a80: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
5a90: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
5aa0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
5ab0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
5ac0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
5ad0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
5ae0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
5af0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
5b00: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5b10: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
5b20: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
5b30: 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f   zCol = "_ROWID_
5b40: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
5b50: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
5b60: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5b70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
5b80: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
5b90: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
5ba0: 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20  es && p->span.z 
5bb0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5bc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
5bd0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
5be0: 65 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e  eOp3(v,OP_Column
5bf0: 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 70 2d 3e  Name, i, p2, p->
5c00: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
5c10: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5c20: 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53  te3VdbeCompressS
5c30: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
5c40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
5c50: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
5c60: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
5c70: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
5c80: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5c90: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
5ca0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
5cb0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5cc0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
5cd0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
5ce0: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
5cf0: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
5d00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
5d10: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
5d20: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
5d30: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
5d40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5d50: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
5d60: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70  ColumnName, i, p
5d70: 32 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e  2, zName, P3_DYN
5d80: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
5d90: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5da0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
5db0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5dc0: 70 32 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  p2, zCol, 0);.  
5dd0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
5de0: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
5df0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
5e00: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
5e10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  = sqlite3VdbeOp3
5e20: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
5e30: 2c 20 69 2c 20 70 32 2c 20 70 2d 3e 73 70 61 6e  , i, p2, p->span
5e40: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
5e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5e60: 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76  eCompressSpace(v
5e70: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c  , addr);.    }el
5e80: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
5e90: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
5ea0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
5eb0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
5ec0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
5ed0: 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20   sprintf(zName, 
5ee0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
5ef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5f00: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
5f10: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20  umnName, i, p2, 
5f20: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
5f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  .  }.}../*.** Na
5f40: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
5f50: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
5f60: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
5f70: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
5f80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
5f90: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
5fa0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
5fb0: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
5fc0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
5fd0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
5fe0: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
5ff0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
6000: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
6010: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
6020: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
6030: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
6040: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
6050: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
6060: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
6070: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
6080: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
6090: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  z;.}../*.** Forw
60a0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
60b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
60c0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
60d0: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
60e0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
60f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6100: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
6110: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
6120: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
6130: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6140: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
6150: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
6160: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
6170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6180: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
6190: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
61a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
61b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
61c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
61d0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b  .  Column *aCol;
61e0: 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  ..  if( fillInCo
61f0: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
6200: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
6210: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6220: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61   pTab = sqliteMa
6230: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
6240: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
6250: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
6260: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
6270: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
6280: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
6290: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
62a0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
62b0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
62c0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
62d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
62e0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
62f0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
6300: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
6310: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
6320: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
6330: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
6340: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
6350: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6360: 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20  Expr *p, *pR;.  
6370: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
6380: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
6390: 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20    aCol[i].zName 
63a0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
63b0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
63c0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
63d0: 28 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61 5b 69  ( (p=pEList->a[i
63e0: 5d 2e 70 45 78 70 72 29 2d 3e 6f 70 3d 3d 54 4b  ].pExpr)->op==TK
63f0: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
6400: 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70       && (pR=p->p
6410: 52 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d  Right)!=0 && pR-
6420: 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e  >token.z && pR->
6430: 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  token.z[0] ){.  
6440: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
6450: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
6460: 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e  ring(&aCol[i].zN
6470: 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  ame, pR->token.z
6480: 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  , pR->token.n, 0
6490: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 63  );.      for(j=c
64a0: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
64b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
64c0: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
64d0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b  [j].zName, aCol[
64e0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
64f0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
6500: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
6510: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
6520: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
6530: 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20  ,"_%d",++cnt);. 
6540: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72           n = str
6550: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  len(zBuf);.     
6560: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e       sqlite3SetN
6570: 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e  String(&aCol[i].
6580: 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e  zName, pR->token
6590: 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c  .z, pR->token.n,
65a0: 20 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20 20   zBuf,n,0);.    
65b0: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
65c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
65d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
65e0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
65f0: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
6600: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
6610: 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  ng(&pTab->aCol[i
6620: 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e  ].zName, p->span
6630: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30  .z, p->span.n, 0
6640: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6650: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
6660: 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ];.      sprintf
6670: 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64  (zBuf, "column%d
6680: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70  ", i+1);.      p
6690: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
66a0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
66b0: 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  p(zBuf);.    }. 
66c0: 20 20 20 0a 20 20 20 20 2f 2a 20 41 66 66 69 6e     .    /* Affin
66d0: 69 74 79 20 69 73 20 61 6c 77 61 79 73 20 4e 4f  ity is always NO
66e0: 4e 45 2c 20 61 73 20 74 68 65 72 65 20 69 73 20  NE, as there is 
66f0: 6e 6f 20 74 79 70 65 20 6e 61 6d 65 2e 20 2a 2f  no type name. */
6700: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
6710: 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  i].affinity = SQ
6720: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
6730: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
6740: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
6750: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pTab;.}../*.** F
6760: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
6770: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 64  ECT statement, d
6780: 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e 0a  o three things..
6790: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69  **.**    (1)  Fi
67a0: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
67b0: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
67c0: 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
67d0: 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
67e0: 20 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20      defines the 
67f0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
6800: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61  at should be sca
6810: 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69 65 77 73  nned.  For views
6820: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
6830: 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
6840: 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
6850: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
6860: 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
6870: 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
6880: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
6890: 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
68a0: 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
68b0: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
68c0: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
68d0: 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
68e0: 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
68f0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
6900: 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
6910: 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
6920: 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
6930: 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
6940: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
6950: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
6960: 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  ew..**.**    (2)
6970: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
6980: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6990: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
69a0: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
69b0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
69c0: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
69d0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
69e0: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
69f0: 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74  *    (3)  Scan t
6a00: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
6a10: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
6a20: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
6a30: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
6a40: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
6a50: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
6a60: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
6a70: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
6a80: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
6a90: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
6aa0: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
6ab0: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
6ac0: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
6ad0: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
6ae0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
6af0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
6b00: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
6b10: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
6b20: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
6b30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6b40: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
6b50: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
6b60: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
6b70: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
6b80: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6b90: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
6ba0: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
6bb0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
6bc0: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
6bd0: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
6be0: 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70   *pTab;..  if( p
6bf0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
6c00: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6c10: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
6c20: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
6c30: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
6c40: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
6c50: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
6c60: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
6c70: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
6c80: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
6c90: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6ca0: 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20  >a[i].pTab ){.  
6cb0: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
6cc0: 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
6cd0: 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  re!  No need to 
6ce0: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20  continue */.    
6cf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6d00: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
6d10: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
6d20: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
6d30: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
6d40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
6d50: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
6d60: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
6d70: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6d80: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
6d90: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6da0: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
6db0: 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e       char zFakeN
6dc0: 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20  ame[60];.       
6dd0: 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61   sprintf(zFakeNa
6de0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  me, "sqlite_subq
6df0: 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20  uery_%p_",.     
6e00: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61        (void*)pTa
6e10: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6e20: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ect);.        sq
6e30: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
6e40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6e50: 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65  Alias, zFakeName
6e60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6e70: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
6e80: 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  i].pTab = pTab =
6e90: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
6ea0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
6eb0: 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
6ec0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
6ed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
6f00: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6f10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
6f20: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
6f30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6f40: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
6f50: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
6f60: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
6f70: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
6f80: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
6f90: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
6fa0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
6fb0: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
6fc0: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
6fd0: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
6fe0: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
6ff0: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
7000: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
7010: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
7020: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
7030: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
7040: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
7050: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
7060: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7070: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
7080: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
7090: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
70a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
70b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
70c0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
70d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
70e0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
70f0: 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ,pTabList->a[i].
7100: 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e  zName,pTabList->
7110: 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[i].zDatabase);
7120: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
7130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
7140: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7150: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
7160: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
7170: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
7180: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
7190: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
71a0: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
71b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
71c0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
71d0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
71e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
71f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
7200: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
7210: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7220: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
7230: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
7240: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
7250: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
7260: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
7270: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
7280: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
7290: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
72a0: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
72b0: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
72c0: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
72d0: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
72e0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
72f0: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
7300: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
7310: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
7320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7330: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
7340: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7350: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
7360: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
7370: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7380: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
7390: 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
73a0: 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
73b0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
73c0: 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
73d0: 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65   if( sqliteProce
73e0: 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
73f0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
7400: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
7410: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
7420: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
7430: 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
7440: 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
7450: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
7460: 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
7470: 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
7480: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
7490: 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
74a0: 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
74b0: 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
74c0: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
74d0: 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
74e0: 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
74f0: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
7500: 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
7510: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
7520: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
7530: 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
7540: 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
7550: 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
7560: 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
7570: 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
7580: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
7590: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
75a0: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
75b0: 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
75c0: 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
75d0: 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
75e0: 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
75f0: 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
7600: 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
7610: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
7620: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
7630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7640: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
7650: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
7660: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
7670: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
7680: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
7690: 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70   pE->pRight && p
76a0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
76b0: 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26  K_ALL.         &
76c0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70  & pE->pLeft && p
76d0: 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
76e0: 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _ID ) break;.  }
76f0: 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  .  rc = 0;.  if(
7700: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
7710: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
7720: 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
7730: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
7740: 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
7750: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
7760: 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
7770: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
7780: 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
7790: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
77a0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
77b0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
77c0: 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
77d0: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
77e0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
77f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7800: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
7810: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
7820: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
7830: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
7840: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
7850: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
7860: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
7870: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
7880: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
7890: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
78a0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
78b0: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
78c0: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
78d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
78e0: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
78f0: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
7900: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
7910: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
7920: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
7930: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
7940: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
7950: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
7960: 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
7970: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
7980: 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
7990: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
79a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
79b0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
79c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
79d0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
79e0: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
79f0: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
7a00: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
7a10: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
7a20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7a30: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
7a40: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
7a50: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
7a60: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f  es */.        To
7a70: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20  ken *pName;     
7a80: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
7a90: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
7aa0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
7ab0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
7ac0: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
7ad0: 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 26         pName = &
7ae0: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
7af0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7b00: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65  .          pName
7b10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7b20: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7b30: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
7b40: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
7b50: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
7b60: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
7b70: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
7b80: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
7b90: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
7ba0: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
7bb0: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
7bc0: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
7bd0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
7be0: 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
7bf0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
7c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7c10: 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 28    if( pName && (
7c20: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
7c30: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  TabName[0]==0 ||
7c40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7c50: 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43     sqlite3StrNIC
7c60: 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61  mp(pName->z, zTa
7c70: 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29  bName, pName->n)
7c80: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
7c90: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
7ca0: 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29  [pName->n]!=0) )
7cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7cc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7cd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
7ce0: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
7cf0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7d00: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
7d10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7d20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
7d30: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
7d40: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7d50: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
7d60: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
7d70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7d80: 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  0 && (pTabList->
7d90: 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  a[i-1].jointype 
7da0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
7db0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
7dc0: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
7dd0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
7de0: 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  .pTab, zName)>=0
7df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7e00: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
7e10: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
7e20: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
7e30: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
7e40: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
7e50: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7e70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7e80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7e90: 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69   if( i>0 && sqli
7ea0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
7eb0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7ec0: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
7ed0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7ee0: 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
7ef0: 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
7f00: 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
7f10: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
7f20: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
7f30: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
7f40: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
7f50: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
7f60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7f70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7f80: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
7f90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
7fa0: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7fc0: 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
7fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
7fe0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  ight->token.z = 
7ff0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
8000: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
8010: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  .n = strlen(zNam
8020: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
8030: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79  pRight->token.dy
8040: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
8050: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
8060: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8070: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
8080: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
8090: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
80a0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
80b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
80c0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
80d0: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
80e0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
80f0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
8100: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
8110: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
8120: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61  token.z = zTabNa
8130: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
8140: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e    pLeft->token.n
8150: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61   = strlen(zTabNa
8160: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
8170: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
8180: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
8190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
81a0: 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a 29  tString((char**)
81b0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  &pExpr->span.z, 
81c0: 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a  zTabName, ".", z
81d0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
81e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
81f0: 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  pan.n = strlen(p
8200: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  Expr->span.z);. 
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8220: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
8230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8240: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
8250: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
8260: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
8270: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8280: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
8290: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
82a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
82b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
82c0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
82d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
82e0: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
82f0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
8300: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
8310: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
8320: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
8330: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
8340: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8350: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
8360: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
8370: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
8380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8390: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
83a0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
83b0: 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61   table: %T", pNa
83c0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
83d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
83e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
83f0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
8400: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
8410: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8420: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
8430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8440: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8450: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8460: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
8470: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
8480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
84a0: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
84b0: 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  ely unlinks the 
84c0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
84d0: 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  pTab pointers.**
84e0: 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72   in a select str
84f0: 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74  ucture.  It just
8500: 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65   sets the pointe
8510: 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  rs to NULL.  Thi
8520: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
8530: 72 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65  recursive in the
8540: 20 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74   sense that if t
8550: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
8560: 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f  [].pSelect.** po
8570: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
8580: 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  L, this routine 
8590: 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
85a0: 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f  ively on that po
85b0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
85c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
85d0: 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63  led on the Selec
85e0: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
85f0: 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49   defines a.** VI
8600: 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75  EW in order to u
8610: 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73  ndo any bindings
8620: 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69   to tables.  Thi
8630: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a  s is necessary.*
8640: 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  * because those 
8650: 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20  tables might be 
8660: 44 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73  DROPed by a subs
8670: 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61  equent SQL comma
8680: 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69  nd..** If the bi
8690: 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72  ndings are not r
86a0: 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65  emoved, then the
86b0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b   Select.pSrc->a[
86c0: 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20  ].pTab field.** 
86d0: 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
86e0: 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c  nting to a deall
86f0: 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72  ocated Table str
8700: 75 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65  ucture after the
8710: 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63  .** DROP and a c
8720: 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63  oredump will occ
8730: 75 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ur the next time
8740: 20 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65   the VIEW is use
8750: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8760: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53  e3SelectUnbind(S
8770: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
8780: 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
8790: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
87a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
87b0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
87c0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
87d0: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
87e0: 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20  {.    if( (pTab 
87f0: 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  = pSrc->a[i].pTa
8800: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  b)!=0 ){.      i
8810: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
8820: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ient ){.        
8830: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
8840: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
8850: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d     }.      pSrc-
8860: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a  >a[i].pTab = 0;.
8870: 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e        if( pSrc->
8880: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a  a[i].pSelect ){.
8890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
88a0: 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 72 63  electUnbind(pSrc
88b0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
88c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
88d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
88e0: 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61   routine associa
88f0: 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61  tes entries in a
8900: 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  n ORDER BY expre
8910: 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a  ssion list with.
8920: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20  ** columns in a 
8930: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63  result.  For eac
8940: 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  h ORDER BY expre
8950: 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64  ssion, the opcod
8960: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
8970: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68  level node is ch
8980: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
8990: 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75  MN and the iColu
89a0: 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  mn value of.** t
89b0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
89c0: 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  e is filled in w
89d0: 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ith column numbe
89e0: 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65  r and the iTable
89f0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
8a00: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8a10: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  is filled with i
8a20: 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e  Table parameter.
8a30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
8a40: 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54  are prior SELECT
8a50: 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61   clauses, they a
8a60: 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72  re processed fir
8a70: 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20  st.  A match.** 
8a80: 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45  in an earlier SE
8a90: 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65  LECT takes prece
8aa0: 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74  dence over a lat
8ab0: 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a  er SELECT..**.**
8ac0: 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20   Any entry that 
8ad0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69  does not match i
8ae0: 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20  s flagged as an 
8af0: 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62  error.  The numb
8b00: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20  er.** of errors 
8b10: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8b20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8b30: 64 6f 65 73 20 4e 4f 54 20 63 6f 72 72 65 63 74  does NOT correct
8b40: 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ly initialize th
8b50: 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65 20  e Expr.dataType 
8b60: 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65   field.** of the
8b70: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
8b80: 73 69 6f 6e 73 2e 20 20 54 68 65 20 6d 75 6c 74  sions.  The mult
8b90: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
8ba0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  () routine.** mu
8bb0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  st be called to 
8bc0: 64 6f 20 74 68 61 74 20 61 66 74 65 72 20 74 68  do that after th
8bd0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  e individual sel
8be0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ect statements.*
8bf0: 2a 20 68 61 76 65 20 61 6c 6c 20 62 65 65 6e 20  * have all been 
8c00: 61 6e 61 6c 79 7a 65 64 2e 20 20 54 68 69 73 20  analyzed.  This 
8c10: 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 61 62 6c  routine is unabl
8c20: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 45 78 70  e to compute Exp
8c30: 72 2e 64 61 74 61 54 79 70 65 0a 2a 2a 20 62 65  r.dataType.** be
8c40: 63 61 75 73 65 20 69 74 20 6d 75 73 74 20 62 65  cause it must be
8c50: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74   called before t
8c60: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  he individual se
8c70: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a  lect statements.
8c80: 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 6e 61  ** have been ana
8c90: 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  lyzed..*/.static
8ca0: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
8cb0: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
8cc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8cd0: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
8ce0: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
8cf0: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
8d00: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
8d10: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
8d20: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
8d30: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
8d40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
8d50: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
8d60: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
8d70: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
8d80: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
8d90: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
8da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
8db0: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
8dc0: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
8dd0: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
8de0: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
8df0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
8e00: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
8e10: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
8e20: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
8e30: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
8e40: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
8e50: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
8e60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
8e70: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
8e80: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8e90: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
8ea0: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
8eb0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
8ec0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c   }.  }.  if( fil
8ed0: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
8ee0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
8ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
8f00: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
8f10: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
8f20: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
8f30: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
8f40: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
8f50: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
8f60: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
8f70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8f80: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
8f90: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
8fa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
8fb0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8fc0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8fd0: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
8fe0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
8ff0: 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  t iCol = -1;.   
9000: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
9010: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
9020: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
9030: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9040: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
9050: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d        if( iCol<=
9060: 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
9070: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
9080: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9090: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
90a0: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70       "ORDER BY p
90b0: 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c  osition %d shoul
90c0: 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  d be between 1 a
90d0: 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
90e0: 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e    iCol, pEList->
90f0: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
9100: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
9110: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9120: 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f       if( !mustCo
9130: 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75  mplete ) continu
9140: 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b  e;.      iCol--;
9150: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
9160: 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c  =0; iCol<0 && j<
9170: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
9180: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9190: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
91a0: 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b  e && (pE->op==TK
91b0: 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54  _ID || pE->op==T
91c0: 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20  K_STRING) ){.   
91d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
91e0: 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20  , *zLabel;.     
91f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73     zName = pELis
9200: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
9210: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9220: 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20  E->token.z );.  
9230: 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73        zLabel = s
9240: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d  qliteStrNDup(pE-
9250: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f  >token.z, pE->to
9260: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  ken.n);.        
9270: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
9280: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
9290: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
92a0: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
92b0: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
92c0: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
92d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
92e0: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
92f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9300: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
9310: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9320: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
9330: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
9340: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
9350: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9360: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
9370: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
9380: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
9390: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
93a0: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
93b0: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
93c0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
93d0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
93e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
93f0: 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65  <0 && mustComple
9400: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
9410: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9420: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44  se,.        "ORD
9430: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
9440: 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  r %d does not ma
9450: 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63  tch any result c
9460: 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20  olumn", i+1);.  
9470: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
9480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9490: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
94a0: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ;  .}../*.** Get
94b0: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
94c0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
94d0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
94e0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
94f0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
9500: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9510: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
9520: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
9530: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
9540: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
9550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
9560: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9570: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
9580: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
9590: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
95a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
95b0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
95c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
95d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
95e0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 45  utine sets the E
95f0: 78 70 72 2e 64 61 74 61 54 79 70 65 20 66 69 65  xpr.dataType fie
9600: 6c 64 20 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e  ld on all elemen
9610: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72  ts of.** the pOr
9620: 64 65 72 42 79 20 65 78 70 72 65 73 73 69 6f 6e  derBy expression
9630: 20 6c 69 73 74 2e 20 20 54 68 65 20 70 4f 72 64   list.  The pOrd
9640: 65 72 42 79 20 6c 69 73 74 20 77 69 6c 6c 20 68  erBy list will h
9650: 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20  ave been.** set 
9660: 75 70 20 62 79 20 6d 61 74 63 68 4f 72 64 65 72  up by matchOrder
9670: 62 79 54 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48  byToColumn().  H
9680: 65 6e 63 65 20 65 61 63 68 20 65 78 70 72 65 73  ence each expres
9690: 73 69 6f 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b  sion has.** a TK
96a0: 5f 43 4f 4c 55 4d 4e 20 61 73 20 69 74 73 20 72  _COLUMN as its r
96b0: 6f 6f 74 20 6e 6f 64 65 2e 20 20 54 68 65 20 45  oot node.  The E
96c0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65  xpr.iColumn refe
96d0: 72 73 20 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75  rs to a .** colu
96e0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
96f0: 20 73 65 74 2e 20 20 20 54 68 65 20 64 61 74 61   set.   The data
9700: 74 79 70 65 20 69 73 20 73 65 74 20 74 6f 20 53  type is set to S
9710: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a  QLITE_SO_TEXT.**
9720: 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   if the correspo
9730: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  nding column in 
9740: 70 20 61 6e 64 20 65 76 65 72 79 20 53 45 4c 45  p and every SELE
9750: 43 54 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  CT to the left o
9760: 66 0a 2a 2a 20 70 20 68 61 73 20 61 20 64 61 74  f.** p has a dat
9770: 61 74 79 70 65 20 6f 66 20 53 51 4c 49 54 45 5f  atype of SQLITE_
9780: 53 4f 5f 54 45 58 54 2e 20 20 49 66 20 74 68 65  SO_TEXT.  If the
9790: 20 63 6f 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20   cooressponding 
97a0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f  column.** in p o
97b0: 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6c 65 66  r any of the lef
97c0: 74 20 53 45 4c 45 43 54 73 20 69 73 20 53 51 4c  t SELECTs is SQL
97d0: 49 54 45 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e  ITE_SO_NUM, then
97e0: 20 74 68 65 20 64 61 74 61 74 79 70 65 0a 2a 2a   the datatype.**
97f0: 20 6f 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   of the order-by
9800: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73   expression is s
9810: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f  et to SQLITE_SO_
9820: 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  NUM..**.** Examp
9830: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  les:.**.**     C
9840: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
9850: 61 20 49 4e 54 45 47 45 52 2c 20 62 20 54 45 58  a INTEGER, b TEX
9860: 54 29 3b 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  T);.**     CREAT
9870: 45 20 54 41 42 4c 45 20 74 77 6f 28 63 20 56 41  E TABLE two(c VA
9880: 52 43 48 41 52 28 35 29 2c 20 64 20 46 4c 4f 41  RCHAR(5), d FLOA
9890: 54 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  T);.**.**     SE
98a0: 4c 45 43 54 20 62 2c 20 62 20 46 52 4f 4d 20 6f  LECT b, b FROM o
98b0: 6e 65 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  ne UNION SELECT 
98c0: 64 2c 20 63 20 46 52 4f 4d 20 74 77 6f 20 4f 52  d, c FROM two OR
98d0: 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a  DER BY 1, 2;.**.
98e0: 2a 2a 20 54 68 65 20 70 72 69 6d 61 72 79 20 73  ** The primary s
98f0: 6f 72 74 20 6b 65 79 20 77 69 6c 6c 20 75 73 65  ort key will use
9900: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 62   SQLITE_SO_NUM b
9910: 65 63 61 75 73 65 20 74 68 65 20 22 64 22 20 69  ecause the "d" i
9920: 6e 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  n.** the second 
9930: 53 45 4c 45 43 54 20 69 73 20 6e 75 6d 65 72 69  SELECT is numeri
9940: 63 2e 20 20 54 68 65 20 31 73 74 20 63 6f 6c 75  c.  The 1st colu
9950: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
9960: 53 45 4c 45 43 54 0a 2a 2a 20 69 73 20 74 65 78  SELECT.** is tex
9970: 74 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  t but that does 
9980: 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
9990: 73 65 20 61 20 6e 75 6d 65 72 69 63 20 61 6c 77  se a numeric alw
99a0: 61 79 73 20 6f 76 65 72 72 69 64 65 73 0a 2a 2a  ays overrides.**
99b0: 20 61 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54   a text..**.** T
99c0: 68 65 20 73 65 63 6f 6e 64 61 72 79 20 6b 65 79  he secondary key
99d0: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 53 51   will use the SQ
99e0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 73 6f 72  LITE_SO_TEXT sor
99f0: 74 20 6f 72 64 65 72 20 62 65 63 61 75 73 65 0a  t order because.
9a00: 2a 2a 20 62 6f 74 68 20 74 68 65 20 28 73 65 63  ** both the (sec
9a10: 6f 6e 64 29 20 22 62 22 20 69 6e 20 74 68 65 20  ond) "b" in the 
9a20: 66 69 72 73 74 20 53 45 4c 45 43 54 20 61 6e 64  first SELECT and
9a30: 20 74 68 65 20 22 63 22 20 69 6e 20 74 68 65 20   the "c" in the 
9a40: 73 65 63 6f 6e 64 0a 2a 2a 20 53 45 4c 45 43 54  second.** SELECT
9a50: 20 68 61 76 65 20 61 20 64 61 74 61 74 79 70 65   have a datatype
9a60: 20 6f 66 20 74 65 78 74 2e 0a 2a 2f 20 0a 73 74   of text..*/ .st
9a70: 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 53  atic void multiS
9a80: 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 53  electSortOrder(S
9a90: 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69  elect *p, ExprLi
9aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
9ab0: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
9ac0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 69 66  st *pEList;.  if
9ad0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
9ae0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 3d  return;.  if( p=
9af0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
9b00: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9b10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9b20: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9b30: 2e 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65  .pExpr->dataType
9b40: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
9b50: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  T;.    }.    ret
9b60: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69  urn;.  }.  multi
9b70: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
9b80: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  p->pPrior, pOrde
9b90: 72 42 79 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rBy);.  pEList =
9ba0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
9bb0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
9bc0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9bd0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9be0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9bf0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
9c00: 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54  >dataType==SQLIT
9c10: 45 5f 53 4f 5f 4e 55 4d 20 29 20 63 6f 6e 74 69  E_SO_NUM ) conti
9c20: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
9c30: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   pE->iColumn>=0 
9c40: 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
9c50: 74 2d 3e 6e 45 78 70 72 3e 70 45 2d 3e 69 43 6f  t->nExpr>pE->iCo
9c60: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 45  lumn ){.      pE
9c70: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 73 71 6c  ->dataType = sql
9c80: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 45 4c  ite3ExprType(pEL
9c90: 69 73 74 2d 3e 61 5b 70 45 2d 3e 69 43 6f 6c 75  ist->a[pE->iColu
9ca0: 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  mn].pExpr);.    
9cb0: 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
9cc0: 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74  void multiSelect
9cd0: 41 66 66 69 6e 69 74 79 28 53 65 6c 65 63 74 20  Affinity(Select 
9ce0: 2a 70 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b  *p, char *zAff){
9cf0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
9d00: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
9d10: 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66 69 6e  multiSelectAffin
9d20: 69 74 79 28 70 2d 3e 70 50 72 69 6f 72 2c 20 7a  ity(p->pPrior, z
9d30: 41 66 66 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Aff);..  for(i=0
9d40: 3b 20 69 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ; i<p->pEList->n
9d50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9d60: 69 66 28 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c 30  if( zAff[i]=='\0
9d70: 27 20 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b  ' ){.      zAff[
9d80: 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
9d90: 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
9da0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
9db0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9dc0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
9dd0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9de0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
9df0: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
9e00: 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74 20 61   the.** nLimit a
9e10: 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65 6c 64  nd nOffset field
9e20: 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e  s.  nLimit and n
9e30: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
9e40: 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68 61 74  integers.** that
9e50: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
9e60: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
9e70: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
9e80: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
9e90: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
9ea0: 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31 20 61  r that hold -1 a
9eb0: 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20 6b 65  nd 0 if those ke
9ec0: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
9ed0: 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  ed..** iLimit an
9ee0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 74 68  d iOffset are th
9ef0: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
9f00: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
9f10: 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74 65 72  s for.** counter
9f20: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
9f30: 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  e the limit and 
9f40: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
9f50: 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d 69 74  e is no.** limit
9f60: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
9f70: 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e 64 20  then iLimit and 
9f80: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
9f90: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
9fa0: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
9fb0: 20 74 68 65 20 76 61 6c 75 65 73 20 69 66 20 69   the values if i
9fc0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
9fd0: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
9fe0: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
9ff0: 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c 69  s defined by nLi
a000: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e  mit and nOffset.
a010: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
a020: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
a030: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
a040: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
a050: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a  efault values.**
a060: 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f   (usually but no
a070: 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69  t always -1) pri
a080: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
a090: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f  is routine..** O
a0a0: 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30  nly if nLimit>=0
a0b0: 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f   or nOffset>0 do
a0c0: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
a0d0: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
a0e0: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
a0f0: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
a100: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
a110: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
a120: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
a130: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
a140: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
a150: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
a160: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
a170: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
a180: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
a190: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
a1a0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a1b0: 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  *p){.  /* .  ** 
a1c0: 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  If the compariso
a1d0: 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74 3e 30  n is p->nLimit>0
a1e0: 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20   then "LIMIT 0" 
a1f0: 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c 20 72  shows.  ** all r
a200: 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68 65 20  ows.  It is the 
a210: 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d 69 74  same as no limit
a220: 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  . If the compari
a230: 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 2d 3e  sion is.  ** p->
a240: 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e 20 22  nLimit>=0 then "
a250: 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20 6e 6f  LIMIT 0" show no
a260: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a 20 20   rows at all..  
a270: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
a280: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
a290: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
a2a0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
a2b0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
a2c0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
a2d0: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
a2e0: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
a2f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
a300: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
a310: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
a320: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
a330: 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e    if( p->nLimit>
a340: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  =0 ){.    int iM
a350: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
a360: 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  m++;.    Vdbe *v
a370: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a380: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
a390: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a3a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a3b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a3c0: 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74  eger, -p->nLimit
a3d0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a3e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a3f0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
a400: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d   1);.    p->iLim
a410: 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20  it = iMem;.  }. 
a420: 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e   if( p->nOffset>
a430: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65  0 ){.    int iMe
a440: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
a450: 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  ++;.    Vdbe *v 
a460: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
a470: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
a480: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
a490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a4a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
a4b0: 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74  ger, -p->nOffset
a4c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a4d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a4e0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
a4f0: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66   1);.    p->iOff
a500: 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a  set = iMem;.  }.
a510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a520: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a530: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
a540: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
a550: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
a560: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
a570: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
a580: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
a590: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
a5a0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
a5b0: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
a5c0: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
a5d0: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
a5e0: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
a5f0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
a600: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
a610: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
a620: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
a630: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a640: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
a650: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
a660: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
a670: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
a680: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
a690: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
a6a0: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
a6b0: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
a6c0: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
a6d0: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
a6e0: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
a6f0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
a700: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
a710: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
a720: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
a730: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
a740: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
a750: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
a760: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
a770: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
a780: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
a790: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
a7a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
a7b0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
a7c0: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
a7d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
a7f0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
a800: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
a810: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
a820: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
a830: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
a840: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
a850: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
a860: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a870: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
a880: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
a890: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
a8a0: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
a8b0: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
a8c0: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
a8d0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
a8e0: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
a8f0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
a900: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
a910: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
a920: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
a930: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
a940: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
a950: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
a960: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
a970: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
a980: 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
a990: 74 20 2a 70 2c 20 0a 20 20 69 6e 74 20 65 44 65  t *p, .  int eDe
a9a0: 73 74 2c 20 0a 20 20 69 6e 74 20 69 50 61 72 6d  st, .  int iParm
a9b0: 2c 20 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  , .  char *aff  
a9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
a9d0: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
a9e0: 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
a9f0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
aa00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aa10: 4b 3b 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  K;  /* Success c
aa20: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
aa30: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
aa40: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 2f  t *pPrior;     /
aa50: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
aa60: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
aa70: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
aa80: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
aa90: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
aaa0: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
aab0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 53 74  */.  char *affSt
aac0: 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21 61  r = 0;..  if( !a
aad0: 66 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65  ff ){.    int le
aae0: 6e 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  n;.    rc = fill
aaf0: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
ab00: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
ab10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ab20: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  {.      goto mul
ab30: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ab40: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 70     }.    len = p
ab50: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  ->pEList->nExpr+
ab60: 31 3b 0a 20 20 20 20 61 66 66 53 74 72 20 3d 20  1;.    affStr = 
ab70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
ab80: 6c 6c 6f 63 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  lloc(p->pEList->
ab90: 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 69 66  nExpr+1);.    if
aba0: 28 20 21 61 66 66 53 74 72 20 29 7b 0a 20 20 20  ( !affStr ){.   
abb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
abc0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
abd0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
abe0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  d;.    }.    mem
abf0: 73 65 74 28 61 66 66 53 74 72 2c 20 28 69 6e 74  set(affStr, (int
ac00: 29 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  )SQLITE_AFF_NUME
ac10: 52 49 43 2c 20 6c 65 6e 2d 31 29 3b 0a 20 20 20  RIC, len-1);.   
ac20: 20 61 66 66 20 3d 20 61 66 66 53 74 72 3b 0a 20   aff = affStr;. 
ac30: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
ac40: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
ac50: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
ac60: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
ac70: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
ac80: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 53 45    ** the last SE
ac90: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
aca0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
acb0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
acc0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
acd0: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
ace0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
acf0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
ad00: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
ad10: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
ad20: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
ad30: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
ad40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ad50: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
ad60: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
ad70: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
ad80: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
ad90: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
ada0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
adb0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
adc0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
add0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
ade0: 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20  r->nLimit>=0 || 
adf0: 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e  pPrior->nOffset>
ae00: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
ae10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ae20: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
ae30: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
ae40: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
ae50: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
ae60: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
ae70: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
ae80: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ae90: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
aea0: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
aeb0: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
aec0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
aed0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
aee0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
aef0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
af00: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
af10: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
af20: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
af30: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
af40: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
af50: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
af60: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
af70: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
af80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
af90: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73 73  Table ){.    ass
afa0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
afb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
afc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
afd0: 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
afe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aff0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
b000: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72  NumColumns, iPar
b010: 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
b020: 78 70 72 29 3b 0a 20 20 20 20 65 44 65 73 74 20  xpr);.    eDest 
b030: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
b040: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
b050: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
b060: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
b070: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
b080: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
b090: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
b0a0: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
b0b0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
b0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  =0 ){.        pP
b0d0: 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70  rior->nLimit = p
b0e0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->nLimit;.      
b0f0: 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65    pPrior->nOffse
b100: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
b110: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b120: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b130: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
b140: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
b150: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
b160: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
b170: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
b180: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
b190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
b1a0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
b1b0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
b1c0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
b1d0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
b1e0: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
b1f0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  fset;.        p-
b200: 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >nLimit = -1;.  
b210: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
b230: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b240: 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
b250: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
b260: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
b270: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
b280: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
b290: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
b2a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b2b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
b2c0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
b2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
b2e0: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
b2f0: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
b300: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
b310: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
b320: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b330: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
b340: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
b350: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
b360: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
b370: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
b380: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
b390: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
b3a0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
b3b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
b3c0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
b3d0: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
b3e0: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
b3f0: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
b400: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
b410: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
b420: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
b430: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
b440: 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53  t, nOffset; /* S
b450: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
b460: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
b470: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
b480: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
b490: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
b4a0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
b4b0: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
b4c0: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  T */..      prio
b4d0: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
b4e0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
b4f0: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
b500: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
b510: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
b520: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c  erBy==0 && p->nL
b530: 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66  imit<0 && p->nOf
b540: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
b550: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
b560: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
b570: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
b580: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
b590: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
b5a0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
b5b0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
b5c0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
b5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
b5e0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
b5f0: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
b600: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b610: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
b620: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
b630: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
b640: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b650: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
b660: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
b670: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
b680: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
b690: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
b6a0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
b6b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
b6c0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
b6d0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
b6e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
b6f0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b710: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41   if( p->op!=TK_A
b720: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
b730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b740: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b750: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
b760: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b770: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b780: 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e  KeyAsData, union
b790: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
b7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b7c0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
b7d0: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  p, unionTab, 0);
b7e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b7f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
b800: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
b810: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
b820: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
b830: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
b840: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b850: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
b860: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
b870: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
b880: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
b890: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
b8a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
b8b0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b8c0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
b8d0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
b8e0: 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ALL ){.        s
b8f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b900: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
b910: 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  mns, unionTab, p
b920: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
b930: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Expr);.      }..
b940: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b950: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
b960: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
b970: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
b980: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
b990: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
b9a0: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
b9b0: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
b9c0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
b9d0: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
b9e0: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
b9f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
ba00: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
ba10: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ba30: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
ba40: 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   0;.      pOrder
ba50: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
ba60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
ba70: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  rBy = 0;.      n
ba80: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
ba90: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
baa0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
bab0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
bac0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
bad0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
bae0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
baf0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
bb00: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
bb10: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
bb20: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
bb30: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
bb40: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
bb50: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  By;.      p->nLi
bb60: 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  mit = nLimit;.  
bb70: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
bb80: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   nOffset;.      
bb90: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
bba0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
bbb0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
bbc0: 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
bbd0: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
bbe0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
bbf0: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
bc00: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
bc10: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
bc20: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
bc30: 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
bc40: 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72     if( eDest!=pr
bc50: 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
bc60: 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  b!=iParm ){.    
bc70: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
bc80: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
bc90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bca0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
bcb0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
bcc0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
bcd0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
bce0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
bcf0: 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  rse, 0, p->pELis
bd00: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  t);.          ge
bd10: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
bd20: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
bd30: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
bd40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bd50: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
bd60: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
bd70: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
bd80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bd90: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bda0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bdb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
bdc0: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
bdd0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  eak);.        co
bde0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
bdf0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ers(pParse, p);.
be00: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
be10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
be20: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
be30: 20 20 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53      multiSelectS
be40: 6f 72 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70  ortOrder(p, p->p
be50: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
be60: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
be70: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
be80: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
be90: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
bea0: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
bed0: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
bee0: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
bf10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
bf20: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
bf30: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
bf40: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bf50: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
bf60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
bf70: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bf80: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
bf90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bfa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
bfb0: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
bfc0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
bfd0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
bfe0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
bff0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
c000: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c010: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
c020: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
c030: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
c040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
c050: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
c060: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
c070: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
c080: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rm);.        }. 
c090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c0a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c0b0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
c0c0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
c0d0: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
c0e0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
c0f0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
c100: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
c110: 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  set;..      /* I
c120: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
c130: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
c140: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
c150: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
c160: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
c170: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
c180: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
c190: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
c1a0: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
c1b0: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
c1c0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
c1d0: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
c1e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
c1f0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
c200: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
c210: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
c220: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
c230: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
c240: 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c  e,p,p->pOrderBy,
c250: 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20  tab1,1) ){.     
c260: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
c270: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c280: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c290: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
c2a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
c2b0: 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31  penTemp, tab1, 1
c2c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c2d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c2e0: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c  KeyAsData, tab1,
c2f0: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
c300: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
c310: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c320: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
c330: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
c340: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
c350: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
c360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c370: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
c380: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
c390: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20   tab1, 0, 0, 0, 
c3a0: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
c3b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c3c0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c3d0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
c3e0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
c3f0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
c400: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
c410: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
c420: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
c430: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c440: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c  _OpenTemp, tab2,
c450: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
c460: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c470: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
c480: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  2, 1);.      p->
c490: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
c4a0: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
c4b0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
c4c0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
c4d0: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
c4e0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
c4f0: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
c500: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c510: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c520: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
c530: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  2, 0, 0, 0, aff)
c540: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
c550: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
c560: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
c570: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
c580: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
c590: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c5a0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c5b0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c5c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c5d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
c5e0: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
c5f0: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
c600: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
c610: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
c620: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
c630: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c640: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
c650: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
c660: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  k ){.        gen
c670: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
c680: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
c690: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
c6a0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
c6b0: 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  pes(pParse, p->p
c6c0: 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  Src, p->pEList);
c6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c6e0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
c6f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c700: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
c710: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
c720: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
c730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c740: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
c750: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
c760: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
c770: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
c780: 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  p);.      iStart
c790: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c7a0: 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65  dOp(v, OP_FullKe
c7b0: 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  y, tab1, 0);.   
c7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c7d0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
c7e0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
c7f0: 3b 0a 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c  ;.      multiSel
c800: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20  ectSortOrder(p, 
c810: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
c820: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
c830: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
c840: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
c850: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
c860: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
c890: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
c8a0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
c8d0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
c8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c8f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
c900: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c910: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c920: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c930: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
c940: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c950: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c960: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
c970: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
c980: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
c990: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
c9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c9b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c9c0: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
c9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c9e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c9f0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
ca00: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
ca10: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  y ){.        gen
ca20: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
ca30: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
ca40: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
ca50: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ca60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ca70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
ca80: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
ca90: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
caa0: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
cab0: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
cac0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
cad0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
cae0: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
caf0: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
cb00: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
cb10: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
cb20: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
cb30: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
cb40: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
cb50: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
cb60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
cb70: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cb80: 65 6e 64 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  end;.  }..multi_
cb90: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66  select_end:.  if
cba0: 28 20 61 66 66 53 74 72 20 29 7b 0a 20 20 20 20  ( affStr ){.    
cbb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cbc0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
cbd0: 65 46 72 65 65 28 61 66 66 53 74 72 29 3b 0a 20  eFree(affStr);. 
cbe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cbf0: 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66 69 6e  multiSelectAffin
cc00: 69 74 79 28 70 2c 20 61 66 66 53 74 72 29 3b 0a  ity(p, affStr);.
cc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc20: 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  eOp3(v, OP_Noop,
cc30: 20 30 2c 20 30 2c 20 61 66 66 53 74 72 2c 20 50   0, 0, affStr, P
cc40: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
cc50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
cc60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  c;.}../*.** Scan
cc70: 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
cc80: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
cc90: 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
cca0: 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
ccb0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
ccc0: 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
ccd0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
cce0: 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
ccf0: 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
cd00: 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
cd10: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
cd20: 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
cd30: 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
cd40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
cd50: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
cd60: 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
cd70: 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
cd80: 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
cd90: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
cda0: 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
cdb0: 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
cdc0: 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
cdd0: 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
cde0: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
cdf0: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
ce00: 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
ce10: 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
ce20: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
ce30: 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
ce40: 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
ce50: 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
ce60: 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
ce70: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
ce80: 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
ce90: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
cea0: 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
ceb0: 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
cec0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
ced0: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
cee0: 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c  t(ExprList*,int,
cef0: 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20  ExprList*);  /* 
cf00: 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a  Forward Decl */.
cf10: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
cf20: 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70  tExpr(Expr *pExp
cf30: 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  r, int iTable, E
cf40: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
cf50: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
cf60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
cf70: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
cf80: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
cf90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
cfa0: 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
cfb0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
cfc0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
cfd0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
cfe0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
cff0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
d000: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
d010: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
d020: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
d030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d040: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
d050: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
d060: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
d070: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
d080: 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  New = pEList->a[
d090: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
d0a0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d0b0: 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a  ert( pNew!=0 );.
d0c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
d0d0: 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20  = pNew->op;.    
d0e0: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
d0f0: 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74 61 54 79  e = pNew->dataTy
d100: 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
d110: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
d120: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
d130: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
d140: 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
d150: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Left);.      ass
d160: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
d170: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
d180: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
d190: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e  qlite3ExprDup(pN
d1a0: 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  ew->pRight);.   
d1b0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
d1c0: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
d1d0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
d1e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d1f0: 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73  stDup(pNew->pLis
d200: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
d210: 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
d220: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
d230: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
d240: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
d250: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
d260: 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20  = pNew->iAgg;.  
d270: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
d280: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Copy(&pExpr->tok
d290: 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
d2a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d2b0: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72  TokenCopy(&pExpr
d2c0: 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73  ->span, &pNew->s
d2d0: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pan);.    }.  }e
d2e0: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
d2f0: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
d300: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
d310: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
d320: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
d330: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
d340: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
d350: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
d360: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
d370: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
d380: 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73  id .substExprLis
d390: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
d3a0: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
d3b0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
d3c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
d3d0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
d3e0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d3f0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d400: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
d410: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
d420: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
d430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
d440: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d450: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
d460: 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
d470: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
d480: 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
d490: 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
d4a0: 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
d4b0: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
d4c0: 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
d4d0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
d4e0: 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
d4f0: 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
d500: 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
d510: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
d520: 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
d530: 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
d540: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
d550: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
d560: 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
d570: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
d580: 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
d590: 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
d5a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
d5b0: 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
d5c0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
d5d0: 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
d5e0: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
d5f0: 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
d600: 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
d610: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d620: 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
d630: 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
d640: 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
d650: 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
d660: 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
d670: 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
d680: 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
d690: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
d6a0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
d6b0: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
d6c0: 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
d6d0: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
d6e0: 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
d6f0: 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
d700: 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
d710: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
d720: 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
d730: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
d740: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
d750: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
d760: 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
d770: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
d780: 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
d790: 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
d7a0: 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
d7b0: 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
d7c0: 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
d7d0: 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
d7e0: 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
d7f0: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
d800: 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
d810: 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
d820: 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
d830: 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
d840: 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
d850: 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
d860: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
d870: 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
d880: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
d890: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
d8a0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
d8b0: 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
d8c0: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
d8d0: 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
d8e0: 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
d8f0: 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
d900: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
d910: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
d920: 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
d930: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
d940: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
d950: 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
d960: 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  n, or.**        
d970: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
d980: 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69  not itself a joi
d990: 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36  n.  (Ticket #306
d9a0: 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
d9b0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
d9c0: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
d9d0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
d9e0: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
d9f0: 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
da00: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
da10: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
da20: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
da30: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
da40: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
da50: 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
da60: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
da70: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
da80: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
da90: 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
daa0: 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
dab0: 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
dac0: 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
dad0: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
dae0: 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
daf0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
db00: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
db10: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
db20: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
db30: 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
db40: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
db50: 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
db60: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
db70: 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
db80: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
db90: 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
dba0: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
dbb0: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
dbc0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
dbd0: 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
dbe0: 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
dbf0: 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
dc00: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
dc10: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
dc20: 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
dc30: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
dc40: 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68  .**.**  (12)  Th
dc50: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
dc60: 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  t the right term
dc70: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
dc80: 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20   JOIN or the.** 
dc90: 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
dca0: 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
dcb0: 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20  use.  (added by 
dcc0: 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a  ticket #350).**.
dcd0: 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
dce0: 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
dcf0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
dd00: 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
dd10: 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
dd20: 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
dd30: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
dd40: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
dd50: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
dd60: 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
dd70: 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
dd80: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
dd90: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
dda0: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
ddb0: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
ddc0: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
ddd0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
dde0: 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
ddf0: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
de00: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
de10: 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
de20: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
de30: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
de40: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
de50: 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
de60: 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
de70: 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
de80: 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
de90: 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
dea0: 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
deb0: 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
dec0: 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
ded0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
dee0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
def0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
df00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
df10: 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
df20: 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
df30: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
df40: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
df50: 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
df60: 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
df70: 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
df80: 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
df90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
dfa0: 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
dfb0: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
dfc0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
dfd0: 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
dfe0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
dff0: 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
e000: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
e010: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ons */.){.  Sele
e020: 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
e030: 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
e040: 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
e050: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
e060: 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
e070: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e080: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
e090: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
e0a0: 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
e0b0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
e0c0: 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
e0d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e0e0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
e0f0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
e100: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
e110: 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
e120: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
e130: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
e140: 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
e150: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
e160: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
e170: 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  Where;..  /* Che
e180: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
e190: 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
e1a0: 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
e1b0: 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  if not..  */.  i
e1c0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
e1d0: 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
e1e0: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
e1f0: 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
e200: 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
e210: 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d  nSrc );.  pSub =
e220: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
e230: 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
e240: 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
e250: 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
e260: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
e270: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62  urn 0;.  if( sub
e280: 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
e290: 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
e2a0: 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63  urn 0;.  pSubSrc
e2b0: 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
e2c0: 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
e2d0: 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72   );.  if( pSubSr
e2e0: 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
e2f0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53  urn 0;.  if( (pS
e300: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
e310: 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d  | pSub->nLimit>=
e320: 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53  0) &&  (pSrc->nS
e330: 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
e340: 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
e350: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69  .  }.  if( (p->i
e360: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e  sDistinct || p->
e370: 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75  nLimit>=0) && su
e380: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
e390: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
e3a0: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
e3b0: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
e3c0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65  turn 0;..  /* Re
e3d0: 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
e3e0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
e3f0: 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
e400: 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
e410: 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
e420: 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
e430: 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
e440: 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
e450: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
e460: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
e470: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e480: 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
e490: 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
e4a0: 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
e4b0: 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
e4c0: 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
e4d0: 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
e4e0: 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
e4f0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
e500: 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
e510: 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
e520: 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
e530: 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
e540: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
e550: 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28   && iFrom>0 && (
e560: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d  pSrc->a[iFrom-1]
e570: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
e580: 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
e590: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
e5a0: 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
e5b0: 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
e5c0: 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
e5d0: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
e5e0: 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
e5f0: 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
e600: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
e610: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
e620: 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
e630: 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
e640: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
e650: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
e660: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
e670: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
e680: 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
e690: 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
e6a0: 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
e6b0: 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
e6c0: 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
e6d0: 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
e6e0: 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
e6f0: 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
e700: 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
e710: 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
e720: 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
e730: 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
e740: 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
e750: 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
e760: 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
e770: 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
e780: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f  .  */.  if( iFro
e790: 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b  m>0 && (pSrc->a[
e7a0: 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70  iFrom-1].jointyp
e7b0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
e7c0: 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d   .      && pSub-
e7d0: 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
e7e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e7f0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
e800: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
e810: 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
e820: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
e830: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
e840: 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
e850: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
e860: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
e870: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
e880: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
e890: 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
e8a0: 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
e8b0: 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
e8c0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
e8d0: 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
e8e0: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
e8f0: 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
e900: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
e910: 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
e920: 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
e930: 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
e940: 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
e950: 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
e960: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
e970: 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
e980: 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
e990: 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
e9a0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
e9b0: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
e9c0: 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
e9d0: 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
e9e0: 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
e9f0: 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
ea00: 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
ea10: 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
ea20: 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
ea30: 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
ea40: 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  iParent = pSrc->
ea50: 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  a[iFrom].iCursor
ea60: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
ea70: 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
ea80: 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
ea90: 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63 2d 3e  ointype = pSrc->
eaa0: 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
eab0: 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  e;..    if( pSrc
eac0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20  ->a[iFrom].pTab 
ead0: 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  && pSrc->a[iFrom
eae0: 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
eaf0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
eb00: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
eb10: 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  0, pSrc->a[iFrom
eb20: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
eb30: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
eb40: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61  rc->a[iFrom].zDa
eb50: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
eb60: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
eb70: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iFrom].zName);. 
eb80: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
eb90: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c  rc->a[iFrom].zAl
eba0: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
ebb0: 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
ebc0: 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
ebd0: 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
ebe0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
ebf0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
ec00: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
ec10: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
ec20: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
ec30: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
ec40: 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
ec50: 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
ec60: 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
ec70: 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
ec80: 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
ec90: 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
eca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ecb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
ecc0: 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
ecd0: 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
ece0: 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
ecf0: 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
ed00: 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
ed10: 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
ed20: 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
ed30: 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
ed40: 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a  rom+nSubSrc-1].j
ed50: 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
ed60: 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
ed70: 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
ed80: 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
ed90: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
eda0: 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
edb0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
edc0: 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
edd0: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
ede0: 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
edf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
ee00: 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
ee10: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
ee20: 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
ee30: 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
ee40: 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
ee70: 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
ee80: 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
ee90: 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
eea0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
eeb0: 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
eec0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
eed0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
eee0: 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
eef0: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
ef00: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
ef10: 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
ef20: 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
ef30: 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
ef40: 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
ef50: 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
ef60: 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
ef70: 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73  "y+10"..  */.  s
ef80: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
ef90: 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
efa0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
efb0: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
efc0: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
efd0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
efe0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
eff0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
f000: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
f010: 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
f020: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f030: 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
f040: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
f050: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
f060: 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
f070: 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
f080: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
f090: 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
f0a0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
f0b0: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
f0c0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
f0d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
f0e0: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
f0f0: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
f100: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
f110: 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
f120: 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
f130: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
f140: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
f150: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
f160: 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
f170: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
f180: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
f190: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
f1a0: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
f1b0: 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
f1c0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
f1d0: 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
f1e0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
f1f0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
f200: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
f210: 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
f220: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
f230: 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
f240: 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
f250: 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
f260: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
f270: 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
f280: 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
f290: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
f2a0: 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
f2b0: 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
f2c0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
f2d0: 69 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  if( pSub->pHavin
f2e0: 67 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  g ){.      Expr 
f2f0: 2a 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  *pHaving = sqlit
f300: 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
f310: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20  pHaving);.      
f320: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
f330: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
f340: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
f350: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48  pr(TK_AND, p->pH
f360: 61 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20  aving, pHaving, 
f370: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
f380: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76  .        p->pHav
f390: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
f3a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f3b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
f3c0: 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  upBy==0 );.    p
f3d0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
f3e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
f3f0: 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b  pSub->pGroupBy);
f400: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
f410: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
f420: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
f430: 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ere;.  }else{.  
f440: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
f450: 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
f460: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
f470: 20 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b     if( pWhere ){
f480: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
f490: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
f4a0: 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65  K_AND, p->pWhere
f4b0: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
f4c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
f4d0: 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
f4e0: 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
f4f0: 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
f500: 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75  r or the.  ** ou
f510: 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
f520: 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70  tinct. .  */.  p
f530: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
f540: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
f550: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
f560: 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
f570: 20 74 68 65 20 6c 69 6d 69 74 20 65 78 70 72 65   the limit expre
f580: 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73  ssion from the s
f590: 75 62 71 75 65 72 79 20 74 6f 20 74 68 65 20 6f  ubquery to the o
f5a0: 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 2e  uter.  ** query.
f5b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
f5c0: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
f5d0: 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74     if( p->nLimit
f5e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  <0 ){.      p->n
f5f0: 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c  Limit = pSub->nL
f600: 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  imit;.    }else 
f610: 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d  if( p->nLimit+p-
f620: 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d  >nOffset > pSub-
f630: 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f  >nLimit+pSub->nO
f640: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
f650: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
f660: 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e  >nLimit + pSub->
f670: 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66  nOffset - p->nOf
f680: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
f690: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20    p->nOffset += 
f6a0: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a  pSub->nOffset;..
f6b0: 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
f6c0: 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
f6d0: 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
f6e0: 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
f6f0: 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
f700: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
f710: 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
f720: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
f730: 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
f740: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
f750: 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
f760: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
f770: 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
f780: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
f790: 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
f7a0: 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
f7b0: 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
f7c0: 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
f7d0: 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
f7e0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
f7f0: 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
f800: 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
f810: 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
f820: 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
f830: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
f840: 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
f850: 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
f860: 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
f870: 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
f880: 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
f890: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
f8a0: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
f8b0: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
f8c0: 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
f8d0: 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
f8e0: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
f8f0: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
f900: 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
f910: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
f920: 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
f930: 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
f940: 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
f950: 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
f960: 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
f970: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
f980: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
f990: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
f9a0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
f9b0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
f9c0: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
f9d0: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
f9e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
f9f0: 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
fa00: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
fa10: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
fa20: 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
fa30: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
fa40: 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
fa50: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
fa60: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
fa70: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
fa80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
fa90: 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
faa0: 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
fab0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
fac0: 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
fad0: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
fae0: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
faf0: 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
fb00: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
fb10: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
fb20: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
fb30: 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e  int seekOp;.  in
fb40: 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69  t cont;.  ExprLi
fb50: 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69  st *pEList, *pLi
fb60: 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72  st, eList;.  str
fb70: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
fb80: 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53  m eListItem;.  S
fb90: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
fba0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
fbb0: 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
fbc0: 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
fbd0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
fbe0: 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
fbf0: 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
fc00: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
fc10: 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
fc20: 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
fc30: 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
fc40: 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
fc50: 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  Src;.  if( pSrc-
fc60: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
fc70: 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
fc80: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
fc90: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
fca0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
fcb0: 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
fcc0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
fcd0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fce0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
fcf0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74  eturn 0;.  pList
fd00: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
fd10: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
fd20: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  || pList->nExpr!
fd30: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
fd40: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
fd50: 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
fd60: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
fd70: 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
fd80: 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
fd90: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
fda0: 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
fdb0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
fdc0: 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72  e3StrNICmp(pExpr
fdd0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c  ->token.z,"max",
fde0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
fdf0: 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20  kOp = OP_Last;. 
fe00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
fe10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70  rn 0;.  }.  pExp
fe20: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  r = pList->a[0].
fe30: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
fe40: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
fe50: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
fe60: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
fe70: 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20  olumn;.  pTab = 
fe80: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
fe90: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
fea0: 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
feb0: 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
fec0: 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
fed0: 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
fee0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
fef0: 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
ff00: 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
ff10: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
ff20: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
ff30: 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
ff40: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
ff50: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
ff60: 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
ff70: 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
ff80: 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
ff90: 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
ffa0: 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
ffb0: 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
ffc0: 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
ffd0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
ffe0: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
fff0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
10000 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
10010 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
10020 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
10030 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
10040 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
10050 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
10060 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20  lumn[0]==iCol ) 
10070 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10080 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
10090 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
100a0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
100b0 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
100c0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
100d0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
100e0 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
100f0 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
10100 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
10110 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
10120 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
10130 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
10140 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
10150 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
10160 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
10170 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
10180 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
10190 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
101a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
101b0 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
101c0 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
101d0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
101e0 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  pes(pParse, p->p
101f0 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  Src, p->pEList);
10200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
10210 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
10220 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
10230 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
10240 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
10250 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
10260 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
10270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10280 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
10290 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
102a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
102b0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
102c0 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
102d0 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   1);.  }..  /* G
102e0 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
102f0 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
10300 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
10310 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
10320 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10330 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
10340 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
10350 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
10360 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
10370 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
10380 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
10390 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
103a0 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
103b0 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
103c0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
103d0 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
103e0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
103f0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
10400 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
10410 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
10420 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d  ].iCursor;.  com
10430 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10440 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
10450 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
10460 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
10470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10480 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10490 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
104a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
104b0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
104c0 61 64 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e  ad, base, pTab->
104d0 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tnum, pTab->zNam
104e0 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
104f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10500 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
10510 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f   base, pTab->nCo
10520 6c 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d  l);.  }.  cont =
10530 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10540 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
10550 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
10560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10570 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
10580 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
10590 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
105a0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
105b0 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b  , pIdx->iDb, 0);
105c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
105d0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
105e0 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78  ad, base+1, pIdx
105f0 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 7a 4e  ->tnum, pIdx->zN
10600 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
10610 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10620 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
10630 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
10640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10650 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f  p(v, OP_IdxRecno
10660 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
10670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10680 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
10690 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
106a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
106b0 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
106c0 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
106d0 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
106e0 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
106f0 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
10700 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
10710 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
10720 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
10730 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
10740 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
10750 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
10760 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
10770 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
10780 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a  cont, cont, 0);.
10790 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
107a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
107b0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
107c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
107d0 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
107e0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
107f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10800 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
10810 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
10820 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
10830 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
10840 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
10850 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
10860 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
10870 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
10880 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
10890 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
108a0 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
108c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
108f0 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
10900 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
10910 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
10920 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
10930 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
10940 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
10950 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
10960 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
10970 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
10980 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
10990 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
109a0 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72  ys of table iPar
109b0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
109c0 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
109d0 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
109e0 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
109f0 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
10a00 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
10a10 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
10a20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
10a30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10a40 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
10a50 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
10a60 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
10a70 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
10a80 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54  le iParm.**.** T
10a90 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69  he table above i
10aa0 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41  s incomplete.  A
10ab0 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20  dditional eDist 
10ac0 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64  value have be ad
10ad0 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69  ded.** since thi
10ae0 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72  s comment was wr
10af0 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20  itten.  See the 
10b00 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
10b10 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a  ) function for.*
10b20 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73  * a complete lis
10b30 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ting of the allo
10b40 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
10b50 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
10b60 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
10b70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10b80 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
10b90 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
10ba0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
10bb0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
10bc0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10bd0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
10be0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
10bf0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
10c00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10c10 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
10c20 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
10c30 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
10c40 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
10c50 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
10c60 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
10c70 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
10c80 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
10c90 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
10ca0 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
10cb0 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
10cc0 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
10cd0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
10ce0 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
10cf0 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
10d00 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
10d10 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
10d20 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
10d30 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
10d40 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
10d50 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
10d60 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
10d70 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
10d80 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
10d90 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
10da0 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
10db0 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
10dc0 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
10dd0 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
10de0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
10df0 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
10e00 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
10e10 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
10e20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
10e30 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
10e40 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
10e50 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
10e60 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
10e70 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
10e80 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
10e90 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
10ea0 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
10ee0 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
10ef0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
10f00 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
10f10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
10f20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10f30 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
10f40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10f50 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
10f60 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
10f70 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
10f80 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
10f90 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
10fa0 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
10fb0 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
10fc0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
10fd0 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
10fe0 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
10ff0 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
11000 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
11010 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
11020 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
11030 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
11040 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
11050 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
11060 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
11070 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
11080 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
11090 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
110a0 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
110b0 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
110c0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
110d0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
110e0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
110f0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
11100 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
11110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11120 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
11130 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
11140 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
11150 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
11160 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
11170 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
11180 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
11190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
111a0 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
111b0 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
111c0 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
111d0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
111e0 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
111f0 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
11200 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
11210 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
11220 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
11230 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
11240 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
11250 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
11260 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
11270 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
11280 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
11290 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
112a0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
112b0 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
112c0 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
112d0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
112e0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
112f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
11300 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
11310 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
11320 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20  int isAgg = 0;  
11330 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
11340 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
11350 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
11360 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11370 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
11380 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11390 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
113a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
113b0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
113c0 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
113d0 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
113e0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
113f0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11400 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
11410 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
11420 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11430 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
11440 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
11450 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
11460 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
11470 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
11480 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
11490 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
114a0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
114b0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
114c0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
114d0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
114e0 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
114f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
11500 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
11510 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
11520 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
11530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
11540 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
11550 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
11560 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
11570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
11580 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
11590 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
115a0 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
115b0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
115c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
115d0 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72   || p==0 ) retur
115e0 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
115f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11600 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
11610 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
11620 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  turn 1;..  /* If
11630 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
11640 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
11650 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
11660 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
11670 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
11680 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
11690 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
116a0 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
116b0 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20   iParm, aff);.  
116c0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63  }..  /* Make loc
116d0 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  al copies of the
116e0 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20   parameters for 
116f0 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f  this query..  */
11700 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
11710 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20  >pSrc;.  pWhere 
11720 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
11730 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11740 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42  derBy;.  pGroupB
11750 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
11760 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
11770 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
11780 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
11790 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  tinct;..  /* All
117a0 6f 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f  ocate VDBE curso
117b0 72 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  rs for each tabl
117c0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
117d0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ause.  */.  sqli
117e0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
117f0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
11800 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
11810 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
11820 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
11830 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
11840 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
11850 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
11860 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
11870 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
11880 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
11890 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
118a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
118b0 2f 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a  /* Expand any "*
118c0 22 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72  " terms in the r
118d0 65 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72  esult set.  (For
118e0 20 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22   example the "*"
118f0 20 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54   in.  ** "SELECT
11900 20 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68   * FROM t1")  Th
11910 65 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69  e fillInColumnli
11920 73 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73  st() routine als
11930 6f 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a  o does some.  **
11940 20 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70   other housekeep
11950 69 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65  ing - see the he
11960 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72  ader comment for
11970 20 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20   details..  */. 
11980 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
11990 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29  nList(pParse, p)
119a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
119b0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
119c0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
119d0 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  e;.  pEList = p-
119e0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
119f0 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
11a00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
11a10 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
11a20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
11a30 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
11a40 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
11a50 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
11a60 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ut..  */.  if( (
11a70 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
11a80 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
11a90 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ) && pEList->nEx
11aa0 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  pr>1 ){.    sqli
11ab0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11ac0 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
11ad0 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
11ae0 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
11af0 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
11b00 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
11b10 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f  ession");.    go
11b20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11b30 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42   }..  /* ORDER B
11b40 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
11b50 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
11b60 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ns..  */.  switc
11b70 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
11b80 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a  case SRT_Union:.
11b90 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
11ba0 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ept:.    case SR
11bb0 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20  T_Discard:.     
11bc0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
11bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11be0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62  default:.      b
11bf0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
11c00 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
11c10 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  e should have al
11c20 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20  located all the 
11c30 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a  cursors that we.
11c40 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e    ** need to han
11c50 64 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e  dle subquerys an
11c60 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  d temporary tabl
11c70 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  es.  .  **.  ** 
11c80 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75  Resolve the colu
11c90 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20  mn names and do 
11ca0 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63  a semantics chec
11cb0 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  k on all the exp
11cc0 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
11cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
11ce0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
11cf0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11d00 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
11d10 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
11d20 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   0, pEList->a[i]
11d30 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
11d40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11d60 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
11d70 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
11d80 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20  >a[i].pExpr, 1, 
11d90 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20  &isAgg) ){.     
11da0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11dc0 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
11dd0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
11de0 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
11df0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11e00 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20  st, pWhere) ){. 
11e10 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11e20 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
11e30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11e40 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68  heck(pParse, pWh
11e50 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  ere, 0, 0) ){.  
11e60 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11e70 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  end;.    }.  }. 
11e80 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
11e90 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
11ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11eb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11ec0 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59  rse, "a GROUP BY
11ed0 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
11ee0 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e  red before HAVIN
11ef0 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  G");.      goto 
11f00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11f10 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
11f20 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
11f30 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11f40 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e  , pEList, pHavin
11f50 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
11f60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11f70 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11f80 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
11f90 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20  se, pHaving, 1, 
11fa0 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20  &isAgg) ){.     
11fb0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11fc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11fd0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
11fe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
11ff0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
12000 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
12010 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ol;.      Expr *
12020 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
12030 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12040 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12050 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
12060 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26  Col) && iCol>0 &
12070 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
12080 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
12090 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
120a0 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
120b0 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
120c0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
120d0 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73  te3ExprDup(pELis
120e0 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
120f0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
12100 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12110 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
12120 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
12130 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
12140 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12150 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
12160 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12170 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
12180 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
12190 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
121a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
121b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
121c0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
121d0 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
121e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
121f0 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
12200 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  &iCol)==0 ){.   
12210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
12220 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
12230 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44              "ORD
12240 45 52 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74  ER BY terms must
12250 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65   not be non-inte
12260 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b  ger constants");
12270 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12280 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
122a0 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45  ol<=0 || iCol>pE
122b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
122c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
122d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
122e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22   .             "
122f0 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
12300 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66  number %d out of
12310 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
12320 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
12330 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
12340 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69   %d", iCol, pELi
12350 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
12360 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12370 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
12380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12390 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42   }.  if( pGroupB
123a0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
123b0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
123c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
123d0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
123e0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47 72 6f   Expr *pE = pGro
123f0 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
12400 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
12410 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
12420 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69  (pE, &iCol) && i
12430 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
12440 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
12450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12460 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
12470 20 20 20 20 20 20 20 70 45 20 3d 20 70 47 72 6f         pE = pGro
12480 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
12490 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
124a0 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  p(pEList->a[iCol
124b0 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
124c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
124d0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
124e0 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
124f0 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
12500 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
12510 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12520 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12530 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
12540 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
12550 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
12560 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12570 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
12580 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12590 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
125a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
125b0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
125c0 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
125d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
125e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
125f0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
12600 20 20 22 47 52 4f 55 50 20 42 59 20 74 65 72 6d    "GROUP BY term
12610 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
12620 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
12630 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nts");.         
12640 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12650 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12660 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
12670 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
12680 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
12690 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
126a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
126b0 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f      "GROUP BY co
126c0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
126d0 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
126e0 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
126f0 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
12700 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c  1 and %d", iCol,
12710 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
12720 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12730 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12740 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12750 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
12760 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
12770 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
12780 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12790 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
127a0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
127b0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  _end;..  /* Iden
127c0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
127d0 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
127e0 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20  using them in a 
127f0 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
12800 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
12810 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
12820 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73  ut is going to s
12830 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e  ome other destin
12840 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
12850 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
12860 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
12870 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
12880 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
12890 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
128a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73  .  /* If the des
128b0 74 69 6e 61 74 69 6f 6e 20 69 73 20 53 52 54 5f  tination is SRT_
128c0 55 6e 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20  Union, then set 
128d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
128e0 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 74 68  lumns in.  ** th
128f0 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 77  e records that w
12900 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
12910 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
12920 72 79 20 74 61 62 6c 65 2e 20 54 68 65 20 63 61  ry table. The ca
12930 6c 6c 65 72 0a 20 20 2a 2a 20 63 6f 75 6c 64 6e  ller.  ** couldn
12940 27 74 20 64 6f 20 74 68 69 73 2c 20 69 6e 20 63  't do this, in c
12950 61 73 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  ase the select s
12960 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
12970 68 65 20 66 6f 72 6d 20 0a 20 20 2a 2a 20 22 53  he form .  ** "S
12980 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e  ELECT * FROM ...
12990 2e 22 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  .". .  **.  ** W
129a0 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
129b0 73 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  s before we star
129c0 74 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f  t inserting reco
129d0 72 64 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  rds into the .  
129e0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
129f0 6c 65 20 28 77 68 69 63 68 20 68 61 73 20 68 61  le (which has ha
12a00 64 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 20 65  d OP_KeyAsData e
12a10 78 65 63 75 74 65 64 20 6f 6e 20 69 74 29 2c 20  xecuted on it), 
12a20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 69 74 20  because.  ** it 
12a30 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
12a40 68 65 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f  he key compariso
12a50 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 53 6f 20 64  n function. So d
12a60 6f 20 69 74 20 6e 6f 77 2c 20 65 76 65 6e 0a 20  o it now, even. 
12a70 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20   ** though this 
12a80 6d 65 61 6e 73 20 74 68 61 74 20 4f 50 5f 53 65  means that OP_Se
12a90 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6d 61 79 20  tNumColumns may 
12aa0 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 74  be executed on t
12ab0 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 63 75 72  he same.  ** cur
12ac0 73 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sor more than on
12ad0 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ce..  */.  if( e
12ae0 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
12af0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12b00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
12b10 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61  tNumColumns, iPa
12b20 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
12b30 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
12b40 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
12b50 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
12b60 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
12b70 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  se.  */.  for(i=
12b80 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
12b90 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
12ba0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
12bb0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
12bc0 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72    int needRestor
12bd0 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69  eContext;..    i
12be0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
12bf0 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
12c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
12c10 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12c20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  zName!=0 ){.    
12c30 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
12c40 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
12c50 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
12c60 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
12c70 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73  ontext = pTabLis
12c80 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
12c90 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
12ca0 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
12cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
12cc0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
12cd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
12ce0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12cf0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
12d00 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
12d10 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20  T_TempTable, .  
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12d30 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
12d40 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73  ursor, p, i, &is
12d50 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Agg, 0);.    if(
12d60 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
12d70 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
12d80 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
12d90 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
12da0 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
12db0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
12dc0 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
12dd0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
12de0 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
12df0 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d  Union && eDest!=
12e00 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44  SRT_Except && eD
12e10 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64  est!=SRT_Discard
12e20 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
12e30 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
12e50 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
12e60 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
12e70 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
12e80 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
12e90 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
12ea0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
12eb0 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
12ec0 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
12ed0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
12ee0 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
12ef0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
12f00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
12f10 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
12f20 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
12f30 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
12f40 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
12f50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12f60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
12f70 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
12f80 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61  subquery that ca
12f90 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22  n be "flattened"
12fa0 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
12fb0 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65  ..  ** If flatte
12fc0 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62  ning is a possib
12fd0 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20  lity, do so and 
12fe0 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
12ff0 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ly.  .  */.  if(
13000 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72   pParent && pPar
13010 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20  entAgg &&.      
13020 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
13030 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
13040 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61   parentTab, *pPa
13050 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20  rentAgg, isAgg) 
13060 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
13070 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d   ) *pParentAgg =
13080 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
13090 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  c;.  }..  /* Set
130a0 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
130b0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
130c0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
130d0 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  e, p);..  /* Ide
130e0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70  ntify column typ
130f0 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
13100 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 62 61 63   using a callbac
13110 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
13120 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
13130 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
13140 6f 69 6e 67 20 74 6f 20 61 20 64 65 73 74 69 6e  oing to a destin
13150 61 74 69 6f 6e 20 6f 74 68 65 72 0a 20 20 2a 2a  ation other.  **
13160 20 74 68 61 6e 20 61 20 63 61 6c 6c 62 61 63 6b   than a callback
13170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 68  ..  **.  ** We h
13180 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 73  ave to do this s
13190 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d 20 74  eparately from t
131a0 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 63  he creation of c
131b0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
131c0 20 61 62 6f 76 65 20 62 65 63 61 75 73 65 20 69   above because i
131d0 66 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 63  f the pTabList c
131e0 6f 6e 74 61 69 6e 73 20 76 69 65 77 73 20 74 68  ontains views th
131f0 65 6e 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74  en they will not
13200 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
13210 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 77 65 20  resolved and we 
13220 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
13230 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 75  e column types u
13240 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ntil.  ** now.. 
13250 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
13260 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
13270 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
13280 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
13290 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
132a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
132b0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
132c0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
132d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
132e0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
132f0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
13300 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
13310 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13320 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
13330 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
13340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13350 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
13360 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61  tNumColumns, iPa
13370 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
13380 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  r);.  }..  /* Do
13390 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
133a0 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
133b0 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  sions..  */.  sq
133c0 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
133d0 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
133e0 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70    if( isAgg || p
133f0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61  GroupBy ){.    a
13400 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
13410 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73  Agg==0 );.    is
13420 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  Agg = 1;.    for
13430 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13440 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13450 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13460 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
13470 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69  tes(pParse, pELi
13480 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
13490 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
134a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
134b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
134c0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
134d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
134e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
134f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
13500 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
13510 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
13520 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
13530 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
13540 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
13550 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13560 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13570 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
13580 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
13590 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
135a0 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  es(pParse, pHavi
135b0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
135c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
135d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
135e0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
135f0 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
13600 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
13610 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
13620 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
13630 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
13640 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13650 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
13660 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13670 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
13680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13690 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65  ..  /* Reset the
136a0 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f   aggregator.  */
136b0 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
136c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
136d0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
136e0 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
136f0 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
13700 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
13710 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
13720 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
13730 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
13740 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
13750 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
13760 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
13770 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
13780 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13790 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20   OP_AggInit, 0, 
137a0 69 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c  i, (char*)pFunc,
137b0 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
137c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
137d0 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
137e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
137f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13800 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
13810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13820 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
13830 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ocus, 0, 0);.   
13840 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
13850 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
13860 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a  ry cell to NULL.
13870 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
13880 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20  ==SRT_Mem ){.   
13890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
138a0 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
138b0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
138c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
138d0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
138e0 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
138f0 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
13900 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
13910 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
13920 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
13930 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
13940 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
13950 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
13960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13970 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
13980 2c 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a  , distinct, 1);.
13990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
139a0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
139b0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
139c0 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
139d0 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  */.  pWInfo = sq
139e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
139f0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
13a00 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20  , pWhere, 0, .  
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 20 20 20 20 20 20 70 47 72 6f 75 70            pGroup
13a30 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72  By ? 0 : &pOrder
13a40 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  By);.  if( pWInf
13a50 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
13a60 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
13a70 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
13a80 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
13a90 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
13aa0 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
13ab0 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
13ac0 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
13ad0 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
13ae0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
13af0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
13b00 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
13b10 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
13b20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
13b30 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
13b40 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
13b50 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20  ak, aff) ){.    
13b60 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13b70 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
13b80 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65   /* If we are de
13b90 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65  aling with aggre
13ba0 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74  gates, then do t
13bb0 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65  he special aggre
13bc0 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73  gate.  ** proces
13bd0 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65  sing.  .  */.  e
13be0 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72  lse{.    AggExpr
13bf0 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66 28 20   *pAgg;.    if( 
13c00 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
13c10 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20    int lbl1;.    
13c20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
13c30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
13c40 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
13c50 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13c60 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
13c70 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
13c80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13c90 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13ca0 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42  MakeKey, pGroupB
13cb0 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
13cc0 20 20 20 20 73 71 6c 69 74 65 33 41 64 64 4b 65      sqlite3AddKe
13cd0 79 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42  yType(v, pGroupB
13ce0 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  y);.      lbl1 =
13cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13d00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
13d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d20 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
13d30 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20   0, lbl1);.     
13d40 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
13d50 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
13d60 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
13d70 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
13d80 20 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41     if( pAgg->isA
13d90 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
13da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13db0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13dc0 41 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  Agg->pExpr);.   
13dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13de0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53  AddOp(v, OP_AggS
13df0 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20  et, 0, i);.     
13e00 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13e10 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
13e20 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d  (v, lbl1);.    }
13e30 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41  .    for(i=0, pA
13e40 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b  gg=pParse->aAgg;
13e50 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
13e60 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20   i++, pAgg++){. 
13e70 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
13e80 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a       int nExpr;.
13e90 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
13ea0 44 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Def;.      if( !
13eb0 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f  pAgg->isAgg ) co
13ec0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
13ed0 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e  sert( pAgg->pFun
13ee0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
13ef0 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e  sert( pAgg->pFun
13f00 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20  c->xStep!=0 );. 
13f10 20 20 20 20 20 70 44 65 66 20 3d 20 70 41 67 67       pDef = pAgg
13f20 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70  ->pFunc;.      p
13f30 45 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b  E = pAgg->pExpr;
13f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13f50 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  E!=0 );.      as
13f60 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b  sert( pE->op==TK
13f70 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
13f80 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
13f90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
13fa0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
13fb0 45 2d 3e 70 4c 69 73 74 2c 20 70 44 65 66 2d 3e  E->pList, pDef->
13fc0 69 6e 63 6c 75 64 65 54 79 70 65 73 29 3b 0a 20  includeTypes);. 
13fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13fe0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
13ff0 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
14000 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
14010 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20  (v, OP_AggFunc, 
14020 30 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a  0, nExpr, (char*
14030 29 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45  )pDef, P3_POINTE
14040 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
14050 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
14060 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
14070 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68    */.  sqlite3Wh
14080 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
14090 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
140a0 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
140b0 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74  gates, we need t
140c0 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e  o set up a secon
140d0 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72  d loop.  ** over
140e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72   all of the aggr
140f0 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64  egate values and
14100 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20   process them.. 
14110 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
14120 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67  ){.    int endag
14130 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  g = sqlite3VdbeM
14140 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14150 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
14160 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
14170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14180 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
14190 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
141a0 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
141b0 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
141c0 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
141d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
141e0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73  arse, pHaving, s
141f0 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20  tartagg, 1);.   
14200 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63   }.    if( selec
14210 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
14220 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
14230 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
14240 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61     iParm, starta
14270 67 67 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29  gg, endagg, aff)
14280 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
14290 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
142a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
142b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
142c0 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a  , 0, startagg);.
142d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
142e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
142f0 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  ndagg);.    sqli
14300 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14310 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
14320 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
14330 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
14340 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
14350 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14360 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
14370 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
14380 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
14390 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
143a0 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
143b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
143c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
143d0 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
143e0 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
143f0 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
14400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
14410 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65  his was a subque
14420 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20  ry, we have now 
14430 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75  converted the su
14440 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20  bquery into a.  
14450 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
14460 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74  le.  So delete t
14470 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72 75  he subquery stru
14480 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70  cture from the p
14490 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72  arent.  ** to pr
144a0 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71 75  event this subqu
144b0 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
144c0 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
144d0 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a  nd to force the.
144e0 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20    ** the use of 
144f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14500 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
14510 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
14520 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
14530 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
14540 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
14550 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
14560 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
14570 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
14580 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14590 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50  elete(p);.    pP
145a0 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
145b0 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
145c0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
145d0 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
145e0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
145f0 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
14600 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
14610 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
14620 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
14630 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
14640 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
14650 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
14660 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
14670 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
14680 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
14690 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
146a0 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
146b0 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
146c0 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
146d0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
146e0 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.