/ Hex Artifact Content
Login

Artifact 1686f2503c9c7f9de4d564944584015b71c50ac3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 33 30  select.c,v 1.230
0200: 20 32 30 30 35 2f 30 31 2f 32 30 20 31 33 3a 30   2005/01/20 13:0
0210: 33 3a 31 30 20 64 61 6e 69 65 6c 6b 31 39 37 37  3:10 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
0250: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0260: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0270: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0280: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0290: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
02a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
02b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
02c0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
02d0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
02e0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
02f0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0300: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0310: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0320: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0330: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0340: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0350: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0360: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0370: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0380: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0390: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
03a0: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
03b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
03c0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
03d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
03e0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
03f0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0400: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c   int isDistinct,
0410: 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69         /* true i
0420: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0430: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0440: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6d 69  t */.  int nLimi
0450: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
0460: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 2d 31  LIMIT value.  -1
0470: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0480: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74  */.  int nOffset
0490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46             /* OF
04a0: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 30 20 6d  FSET value.  0 m
04b0: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
04c0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
04d0: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
04e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
04f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
0500: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0510: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0520: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
0530: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0540: 69 73 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b  istDelete(pSrc);
0550: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0560: 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a  Delete(pWhere);.
0570: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0580: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0590: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
05a0: 45 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69  ExprDelete(pHavi
05b0: 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
05c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
05d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73  OrderBy);.  }els
05e0: 65 7b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e{.    if( pELis
05f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  t==0 ){.      pE
0600: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
0610: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
0620: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
0630: 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0640: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70     }.    pNew->p
0650: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0660: 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d      pNew->pSrc =
0670: 20 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d   pSrc;.    pNew-
0680: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
0690: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
06a0: 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
06b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  .    pNew->pHavi
06c0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
06d0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
06e0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
06f0: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
0700: 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a  t = isDistinct;.
0710: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54      pNew->op = T
0720: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e  K_SELECT;.    pN
0730: 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69  ew->nLimit = nLi
0740: 6d 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  mit;.    pNew->n
0750: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
0760: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  ;.    pNew->iLim
0770: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65  it = -1;.    pNe
0780: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
0790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
07a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ew;.}../*.** Giv
07b0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
07c0: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
07d0: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
07e0: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
07f0: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0800: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0810: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0820: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0830: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0840: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0850: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0860: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0870: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  ER.**     JT_OUT
0880: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0890: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
08a0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
08b0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
08c0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
08d0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
08e0: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
08f0: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0900: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0910: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0920: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0930: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0940: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0950: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0960: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0970: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0980: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0990: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
09a0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
09b0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
09c0: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
09d0: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
09e0: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
09f0: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *p;.  static co
0a00: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0a10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
0a20: 79 77 6f 72 64 3b 0a 20 20 20 20 75 38 20 6e 43  yword;.    u8 nC
0a30: 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65  har;.    u8 code
0a40: 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d  ;.  } keywords[]
0a50: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75   = {.    { "natu
0a60: 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55  ral", 7, JT_NATU
0a70: 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65  RAL },.    { "le
0a80: 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ft",    4, JT_LE
0a90: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  FT|JT_OUTER },. 
0aa0: 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20     { "right",   
0ab0: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
0ac0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66  UTER },.    { "f
0ad0: 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  ull",    4, JT_L
0ae0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
0af0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0b00: 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  outer",   5, JT_
0b10: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0b20: 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  inner",   5, JT_
0b30: 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  INNER },.    { "
0b40: 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f  cross",   5, JT_
0b50: 49 4e 4e 45 52 20 7d 2c 0a 20 20 7d 3b 0a 20 20  INNER },.  };.  
0b60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0b70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0b80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0b90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0ba0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0bb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0bc0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0bd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0be0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
0bf0: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
0c00: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
0c10: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
0c20: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
0c30: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
0c40: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 2d 3e 7a  te3StrNICmp(p->z
0c50: 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b  , keywords[j].zK
0c60: 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30  eyword, p->n)==0
0c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
0c80: 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73  type |= keywords
0c90: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
0ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
0cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
0cc0: 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  >=sizeof(keyword
0cd0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0ce0: 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ds[0]) ){.      
0cf0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
0d00: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
0d10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
0d20: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
0d30: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
0d40: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
0d50: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
0d60: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
0d70: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
0d80: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
0d90: 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a  ar *zSp1 = " ";.
0da0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0db0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
0dc0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70  if( pB==0 ){ zSp
0dd0: 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  1++; }.    if( p
0de0: 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20  C==0 ){ zSp2++; 
0df0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
0e00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
0e10: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0e20: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0e30: 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25   ".       "%T%s%
0e40: 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31  T%s%T", pA, zSp1
0e50: 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b  , pB, zSp2, pC);
0e60: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
0e70: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
0e80: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
0e90: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
0ea0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0eb0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0ec0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0ed0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0ee0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0ef0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
0f00: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
0f10: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
0f20: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
0f30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
0f40: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
0f50: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
0f60: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
0f70: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
0f80: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
0f90: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0fa0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
0fb0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
0fc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
0fd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0fe0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
0ff0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1000: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1010: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1020: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1030: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1040: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1050: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1060: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
1070: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
1080: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
1090: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
10a0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
10b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
10c0: 20 70 2d 3e 7a 20 3d 20 7a 3b 0a 20 20 70 2d 3e   p->z = z;.  p->
10d0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
10e0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
10f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72  ./*.** Add a ter
1100: 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65  m to the WHERE e
1110: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70  xpression in *pp
1120: 45 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72  Expr that requir
1130: 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63  es the.** zCol c
1140: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61  olumn to be equa
1150: 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62  l in the two tab
1160: 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54  les pTab1 and pT
1170: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
1180: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
1190: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
11a0: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  zCol,        /* 
11b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
11c0: 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  mn */.  const Ta
11d0: 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20  ble *pTab1,     
11e0: 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20   /* First table 
11f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1200: 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a  *zAlias1,     /*
1210: 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74   Alias for first
1220: 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20   table.  May be 
1230: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
1240: 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20  Table *pTab2,   
1250: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62     /* Second tab
1260: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1270: 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20  ar *zAlias2,    
1280: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65   /* Alias for se
1290: 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79  cond table.  May
12a0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
12b0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
12c0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
12d0: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
12e0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
12f0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  on */.){.  Token
1300: 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a   dummy;.  Expr *
1310: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1320: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1330: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1340: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 73    Expr *pE;..  s
1350: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
1360: 7a 43 6f 6c 29 3b 0a 20 20 70 45 31 61 20 3d 20  zCol);.  pE1a = 
1370: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1380: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1390: 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74  ;.  pE2a = sqlit
13a0: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
13b0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 69   0, &dummy);.  i
13c0: 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b  f( zAlias1==0 ){
13d0: 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70  .    zAlias1 = p
13e0: 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d  Tab1->zName;.  }
13f0: 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d  .  setToken(&dum
1400: 6d 79 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20  my, zAlias1);.  
1410: 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 45 78  pE1b = sqlite3Ex
1420: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
1430: 26 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 7a  &dummy);.  if( z
1440: 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20  Alias2==0 ){.   
1450: 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32   zAlias2 = pTab2
1460: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 73  ->zName;.  }.  s
1470: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
1480: 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 32 62  zAlias2);.  pE2b
1490: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
14a0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
14b0: 6d 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71  my);.  pE1c = sq
14c0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
14d0: 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29  , pE1b, pE1a, 0)
14e0: 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74  ;.  pE2c = sqlit
14f0: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
1500: 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20  E2b, pE2a, 0);. 
1510: 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70   pE = sqlite3Exp
1520: 72 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70  r(TK_EQ, pE1c, p
1530: 45 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53  E2c, 0);.  ExprS
1540: 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  etProperty(pE, E
1550: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a  P_FromJoin);.  *
1560: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
1570: 45 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72 2c  ExprAnd(*ppExpr,
1580: 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   pE);.}../*.** S
1590: 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  et the EP_FromJo
15a0: 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61  in property on a
15b0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
15c0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
15d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
15e0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
15f0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
1600: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
1610: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
1620: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
1630: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
1640: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
1650: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
1660: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
1670: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
1680: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1690: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
16a0: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
16b0: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
16c0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
16d0: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
16e0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
16f0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
1700: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
1710: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
1720: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1730: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
1740: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
1750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1770: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
1780: 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  r *p){.  while( 
1790: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
17a0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
17b0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65  romJoin);.    se
17c0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
17d0: 66 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  ft);.    p = p->
17e0: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
17f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1800: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
1810: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
1820: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
1830: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
1840: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1850: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
1860: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
1870: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1880: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
1890: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
18a0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
18b0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
18c0: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
18d0: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
18e0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
18f0: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
1900: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
1910: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
1920: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
1930: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
1940: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
1950: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
1960: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
1970: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
1980: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
1990: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
19a0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
19b0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
19c0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
19d0: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
19e0: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
19f0: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
1a00: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
1a10: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1a20: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
1a30: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
1a40: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
1a50: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
1a60: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1a70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1a80: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
1a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1aa0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
1ab0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ac0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
1ad0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af0: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
1b00: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1b10: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1b40: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
1b50: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b60: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
1b70: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
1b80: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
1b90: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ba0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
1bb0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
1bc0: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
1bd0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
1be0: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
1bf0: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
1c00: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
1c10: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
1c20: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
1c30: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
1c40: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
1c50: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
1c60: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
1c70: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
1c80: 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  Tab;..    if( pL
1c90: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
1ca0: 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ghtTab==0 ) cont
1cb0: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  inue;..    /* Wh
1cc0: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
1cd0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
1ce0: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
1cf0: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
1d00: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
1d10: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
1d20: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
1d30: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
1d40: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e   if( pLeft->join
1d50: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
1d60: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
1d70: 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65  Left->pOn || pLe
1d80: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
1d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1da0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1db0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
1dc0: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
1dd0: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
1de0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
1df0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
1e00: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1e10: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1e20: 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  pLeftTab->nCol; 
1e30: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
1e40: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66  ar *zName = pLef
1e50: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
1e60: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
1e70: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
1e80: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ghtTab, zName)>=
1e90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
1ea0: 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d  ddWhereTerm(zNam
1eb0: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65  e, pLeftTab, pLe
1ec0: 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20  ft->zAlias, .   
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
1ef0: 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41  tTab, pRight->zA
1f00: 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65 72 65  lias, &p->pWhere
1f10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f20: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f30: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
1f40: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1f50: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1f60: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
1f70: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e    if( pLeft->pOn
1f80: 20 26 26 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e   && pLeft->pUsin
1f90: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
1fa0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fb0: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1fc0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1fd0: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1fe0: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1ff0: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
2000: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
2010: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
2020: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
2030: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2040: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
2050: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20  ed by.    ** an 
2060: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
2070: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
2080: 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ft->pOn ){.     
2090: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65   setJoinExpr(pLe
20a0: 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ft->pOn);.      
20b0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
20c0: 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57  te3ExprAnd(p->pW
20d0: 68 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e  here, pLeft->pOn
20e0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 2d 3e  );.      pLeft->
20f0: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
2100: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
2110: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
2120: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
2130: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
2140: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
2150: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
2160: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
2170: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
2180: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
2190: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
21a0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
21b0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
21c0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
21d0: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
21e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
21f0: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
2200: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
2210: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
2220: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
2230: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
2240: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2250: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
2260: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
2270: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
2280: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
2290: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
22a0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
22b0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
22c0: 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  pLeft->pUsing;. 
22d0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22e0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
22f0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2300: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
2310: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2320: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
2330: 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61  ex(pLeftTab, zNa
2340: 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49  me)<0 || columnI
2350: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
2360: 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20  zName)<0 ){.    
2370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2380: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2390: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
23a0: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
23b0: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
23c0: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
23d0: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
23e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
23f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2400: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
2410: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
2420: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2430: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2460: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2470: 73 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  s, &p->pWhere);.
2480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2490: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
24a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
24b0: 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73  e given Select s
24c0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
24d0: 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63   of its substruc
24e0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
24f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2500: 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  te(Select *p){. 
2510: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2520: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  rn;.  sqlite3Exp
2530: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
2540: 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
2550: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
2560: 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  ->pSrc);.  sqlit
2570: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
2580: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
2590: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
25a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
25b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
25c0: 74 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  te(p->pHaving);.
25d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
25e0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65  tDelete(p->pOrde
25f0: 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  rBy);.  sqlite3S
2600: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70  electDelete(p->p
2610: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
2620: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2630: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67 67  * Delete the agg
2640: 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2650: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  on from the pars
2660: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2670: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2680: 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
2690: 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  eset(Parse *pPar
26a0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  se){.  sqliteFre
26b0: 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b  e(pParse->aAgg);
26c0: 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20  .  pParse->aAgg 
26d0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
26e0: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
26f0: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 7d  e->useAgg = 0;.}
2700: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2710: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2720: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2730: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2740: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2750: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2760: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2770: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2780: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2790: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
27a0: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
27b0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27c0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
27d0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
27e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
27f0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2800: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2810: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
2820: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
2830: 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d  ecord, pOrderBy-
2840: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
2850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2860: 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c  , OP_SortPut, 0,
2870: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   0);.}../*.** Ad
2880: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
2890: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 20 61  ent the OFFSET a
28a0: 6e 64 20 4c 49 4d 49 54 0a 2a 2f 0a 73 74 61 74  nd LIMIT.*/.stat
28b0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4c 69 6d 69  ic void codeLimi
28c0: 74 65 72 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ter(.  Vdbe *v, 
28d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
28e0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
28f0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
2900: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
2910: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2920: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2930: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
2940: 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  inue,    /* Jump
2950: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
2960: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
2970: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
2980: 2c 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ,       /* Jump 
2990: 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20  here to end the 
29a0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  loop */.  int nP
29b0: 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  op          /* N
29c0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
29d0: 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e  o pop stack when
29e0: 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20   jumping */.){. 
29f0: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e   if( p->iOffset>
2a00: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
2a10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2a20: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
2a30: 20 32 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70   2;.    if( nPop
2a40: 3e 30 20 29 20 61 64 64 72 2b 2b 3b 0a 20 20 20  >0 ) addr++;.   
2a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a60: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2a70: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
2a80: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70  r);.    if( nPop
2a90: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
2aa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2ab0: 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29  OP_Pop, nPop, 0)
2ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2ae0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2af0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
2b00: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
2b10: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
2b20: 64 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ds"));.  }.  if(
2b30: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
2b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
2b60: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
2b70: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  iBreak);.    Vdb
2b80: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
2b90: 65 78 69 74 20 77 68 65 6e 20 4c 49 4d 49 54 20  exit when LIMIT 
2ba0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a  reached"));.  }.
2bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2bc0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
2bd0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
2be0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
2bf0: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
2c00: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
2c10: 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43  If srcTab and nC
2c20: 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a  olumn are both z
2c30: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ero, then the pE
2c40: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
2c50: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
2c60: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
2c70: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
2c80: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f  his row.  If nCo
2c90: 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64  lumn>0.** then d
2ca0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
2cb0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
2cc0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
2cd0: 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20  y to get the.** 
2ce0: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61  datatypes for ea
2cf0: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
2d00: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
2d10: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
2d20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2d30: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2d40: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2d50: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2d60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2d70: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
2d80: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2d90: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
2da0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
2db0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
2dc0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
2dd0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
2de0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
2df0: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
2e00: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
2e10: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
2e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e30: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2e40: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
2e50: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
2e60: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
2e70: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
2e80: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
2e90: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
2ea0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
2eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
2ec0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
2ed0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
2ee0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
2ef0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2f00: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
2f10: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
2f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f40: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
2f50: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
2f60: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
2f70: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
2f80: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2f90: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
2fa0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
2fb0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
2fc0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2fd0: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
2fe0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
2ff0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
3020: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
3030: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
3040: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
3050: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
3060: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
3070: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
3080: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
3090: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
30a0: 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20  esent */..  if( 
30b0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
30c0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
30d0: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  t!=0 );..  /* If
30e0: 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d   there was a LIM
30f0: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  IT clause on the
3100: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3110: 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63  t, then do the c
3120: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
3130: 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f   if this row sho
3140: 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  uld be output.. 
3150: 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63   */.  hasDistinc
3160: 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  t = distinct>=0 
3170: 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  && pEList && pEL
3180: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20  ist->nExpr>0;.  
3190: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
31a0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
31b0: 29 7b 0a 20 20 20 20 63 6f 64 65 4c 69 6d 69 74  ){.    codeLimit
31c0: 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  er(v, p, iContin
31d0: 75 65 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  ue, iBreak, 0);.
31e0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
31f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
3200: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
3210: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
3220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
3230: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
3240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3250: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
3260: 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20   srcTab, i);.   
3270: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
3280: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74  nColumn = pEList
3290: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
32a0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
32b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
32c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
32d0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
32e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
32f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3300: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
3310: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
3320: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
3330: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
3340: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
3350: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
3360: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
3370: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
3380: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
3390: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
33a0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
33b0: 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  .#if NULL_ALWAYS
33c0: 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 73 71  _DISTINCT.    sq
33d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
33e0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45  , OP_IsNull, -pE
33f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c  List->nExpr, sql
3400: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3410: 64 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69  ddr(v)+7);.#endi
3420: 66 0a 20 20 20 20 2f 2a 20 44 65 6c 69 62 65 72  f.    /* Deliber
3430: 61 74 65 6c 79 20 6c 65 61 76 65 20 74 68 65 20  ately leave the 
3440: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
3450: 6f 66 66 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  off of the follo
3460: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 4f 50 5f 4d  wing.    ** OP_M
3470: 61 6b 65 52 65 63 6f 72 64 20 2a 2f 0a 20 20 20  akeRecord */.   
3480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3490: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
34a0: 72 64 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rd, pEList->nExp
34b0: 72 20 2a 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r * -1, 0);.    
34c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34d0: 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c  (v, OP_Distinct,
34e0: 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69 74   distinct, sqlit
34f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3500: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c  r(v)+3);.    sql
3510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3520: 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d   OP_Pop, pEList-
3530: 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20  >nExpr+1, 0);.  
3540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3550: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
3560: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
3570: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
3580: 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74  , "# skip indist
3590: 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b  inct records"));
35a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
35c0: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
35d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35e0: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
35f0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a  , distinct, 0);.
3600: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
3610: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
3620: 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69  eLimiter(v, p, i
3630: 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b  Continue, iBreak
3640: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
3650: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
3660: 20 65 44 65 73 74 20 29 7b 0a 23 69 66 6e 64 65   eDest ){.#ifnde
3670: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
3680: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
3690: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
36a0: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
36b0: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
36c0: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
36d0: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
36e0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
36f0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  /.    case SRT_U
3700: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71  nion: {.      sq
3710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3720: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3730: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
3740: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
3750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3760: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
3770: 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43  , aff, P3_STATIC
3780: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3790: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
37a0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
37b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
37d0: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
37e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
37f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
3800: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
3810: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
3820: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
3830: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
3840: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
3850: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
3860: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
3870: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
3880: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
3890: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
38a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
38b0: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
38c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
38d0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
38e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
38f0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3900: 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  n, NULL_ALWAYS_D
3910: 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20  ISTINCT);.      
3920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3930: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
3940: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3960: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
3970: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
3980: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
39a0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
39b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
39c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
39d0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
39e0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
39f0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
3a00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3a10: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
3a20: 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61   case SRT_TempTa
3a30: 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ble: {.      sql
3a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3a50: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3a60: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3a70: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3a80: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
3a90: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3aa0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3ab0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ad0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
3ae0: 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b  ecno, iParm, 0);
3af0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3b00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3b10: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
3b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
3b40: 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  ntKey, iParm, 0)
3b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3b60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3b70: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3b80: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3b90: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3ba0: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3bb0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3bc0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3bd0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3be0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3bf0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3c00: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3c10: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3c20: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3c30: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3c40: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3c50: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3c60: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3c70: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
3c80: 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  r2;..      asser
3c90: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
3ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
3cc0: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31  tNull, -1, addr1
3cd0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
3ce0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3cf0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
3d00: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
3d10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3d20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
3d30: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3d40: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3d50: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3d60: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3d70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3d80: 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
3d90: 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30   = (iParm>>16)&0
3da0: 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66  xFF;.        aff
3db0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
3dc0: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
3dd0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66  ->a[0].pExpr, af
3de0: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
3df0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
3e00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
3e10: 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20 20  0, &aff, 1);.   
3e20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3e30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
3e40: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
3e50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3e60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3e70: 72 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30  rKey, (iParm&0x0
3e80: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
3e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3ea0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
3eb0: 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65  v, addr2, sqlite
3ec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ed0: 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  (v));.      brea
3ee0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3ef0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
3f00: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
3f10: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
3f20: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
3f30: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
3f40: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
3f50: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
3f60: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
3f70: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
3f80: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
3f90: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3fa0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
3fb0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
3fc0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
3fd0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
3fe0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3ff0: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4000: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4030: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4040: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4060: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4070: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
4080: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
40a0: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
40b0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
40c0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
40d0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
40e0: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
40f0: 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20 20  _Sorter: {.     
4100: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4120: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4130: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
4140: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  umn, 0);.       
4150: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4160: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
4170: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
4180: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
4190: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  t( eDest==SRT_Ca
41a0: 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
41b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41c0: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
41d0: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
41e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
41f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4200: 2f 2a 20 49 6e 76 6f 6b 65 20 61 20 73 75 62 72  /* Invoke a subr
4210: 6f 75 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65  outine to handle
4220: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
4230: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
4240: 73 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 72  self.    ** is r
4250: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70  esponsible for p
4260: 6f 70 70 69 6e 67 20 74 68 65 20 72 65 73 75 6c  opping the resul
4270: 74 73 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74  ts off of the st
4280: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
4290: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
42a0: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
42b0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
42c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
42d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
42e0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
42f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
4300: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4310: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
4320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4340: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4350: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
4360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4370: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4380: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
4390: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
43a0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
43b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
43c0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
43d0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
43e0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
43f0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
4400: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
4410: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
4420: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
4430: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
4440: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
4450: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
4460: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
4470: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
4480: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
4490: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
44a0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
44b0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71  card );.      sq
44c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
44d0: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d  , OP_Pop, nColum
44e0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
44f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4500: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4510: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
4520: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
4530: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
4540: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
4550: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
4560: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
4570: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
4580: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
4590: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
45a0: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
45b0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
45c0: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
45d0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
45e0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
45f0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
4600: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
4610: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
4620: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
4630: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
4640: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68  *pParse,   /* Th
4650: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
4660: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
4670: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  ,       /* The S
4680: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4690: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
46a0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
46b0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
46c0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
46d0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e  Column,     /* N
46e0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
46f0: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   of data */.  in
4700: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f  t eDest,       /
4710: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
4720: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
4730: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20  */.  int iParm  
4740: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61        /* Optiona
4750: 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f  l parameter asso
4760: 63 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73  ciated with eDes
4770: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  t */.){.  int en
4780: 64 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d1 = sqlite3Vdbe
4790: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
47a0: 69 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c 69 74  int end2 = sqlit
47b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
47c0: 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  v);.  int addr;.
47d0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
47e0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
47f0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 43  rderBy;.  int nC
4800: 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  ol, i;.  sqlite3
4810: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4820: 62 3b 0a 0a 20 20 69 66 28 20 65 44 65 73 74 3d  b;..  if( eDest=
4830: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
4840: 74 75 72 6e 3b 0a 20 20 70 4f 72 64 65 72 42 79  turn;.  pOrderBy
4850: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
4860: 20 20 6e 43 6f 6c 20 3d 20 70 4f 72 64 65 72 42    nCol = pOrderB
4870: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  y->nExpr;.  pInf
4880: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
4890: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  ( sizeof(*pInfo)
48a0: 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28   + nCol*(sizeof(
48b0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
48c0: 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
48d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 66 6f   return;.  pInfo
48e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
48f0: 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43  char*)&pInfo->aC
4900: 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 49 6e  oll[nCol];.  pIn
4910: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  fo->nField = nCo
4920: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
4930: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
4940: 2f 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f  /* If a collatio
4950: 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 73  n sequence was s
4960: 70 65 63 69 66 69 65 64 20 65 78 70 6c 69 63 69  pecified explici
4970: 74 79 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20  ty, then it.    
4980: 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
4990: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a  pOrderBy->a[i].z
49a0: 4e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Name. Otherwise,
49b0: 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   use the default
49c0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  .    ** collatio
49d0: 6e 20 74 79 70 65 20 66 6f 72 20 74 68 65 20 65  n type for the e
49e0: 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2a  xpression..    *
49f0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f  /.    pInfo->aCo
4a00: 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[i] = sqlite3E
4a10: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
4a20: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
4a30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
4a40: 28 20 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  ( !pInfo->aColl[
4a50: 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  i] ){.      pInf
4a60: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62  o->aColl[i] = db
4a70: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
4a80: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53   }.    pInfo->aS
4a90: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
4aa0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
4ab0: 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71  tOrder;.  }.  sq
4ac0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
4ad0: 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c 20 28  OP_Sort, 0, 0, (
4ae0: 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20 50 33 5f  char*)pInfo, P3_
4af0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
4b00: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
4b10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4b20: 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65  P_SortNext, 0, e
4b30: 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c 69 6d 69  nd1);.  codeLimi
4b40: 74 65 72 28 76 2c 20 70 2c 20 61 64 64 72 2c 20  ter(v, p, addr, 
4b50: 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73 77 69 74  end2, 1);.  swit
4b60: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
4b70: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4b80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
4b90: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
4ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bb0: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4bc0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4bd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4be0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
4bf0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
4c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c10: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
4c20: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4c30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4c40: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4c50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4c60: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4c70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c80: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
4c90: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  l, -1, sqlite3Vd
4ca0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4cb0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4cc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4cd0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
4ce0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4cf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4d00: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
4d10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4d20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4d30: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
4d40: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22  eRecord, 1, 0, "
4d50: 6e 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  n", P3_STATIC);.
4d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
4d80: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
4d90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4da0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
4db0: 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30  Key, (iParm&0x00
4dc0: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
4dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4de0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
4df0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
4e00: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4e30: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4e50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4e60: 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20  oto, 0, end1);. 
4e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4e80: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  }.    case SRT_C
4e90: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
4ea0: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
4eb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
4ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4ed0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
4ee0: 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74  teger, p->pEList
4ef0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
4f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f10: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
4f20: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 0);.      for
4f30: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
4f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f60: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31  v, OP_Column, -1
4f70: 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  -i, i);.      }.
4f80: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
4f90: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
4fa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4fb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4fc0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
4fd0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n, 0);.      }el
4fe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5000: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
5010: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
5020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5030: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32  dOp(v, OP_Pop, 2
5040: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
5060: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
5070: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
5080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5090: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
50a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
50b0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
50c0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
50d0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 32  lveLabel(v, end2
50e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
50f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
5100: 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   1, 0);.  sqlite
5110: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
5120: 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73 71  l(v, end1);.  sq
5130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5140: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
5150: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
5160: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
5170: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
5180: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
5190: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
51a0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
51b0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
51c0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
51d0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
51e0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
51f0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 65 63 6c 61  .** If the decla
5200: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
5210: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
5220: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
5230: 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  racted from.** t
5240: 68 65 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  he original CREA
5250: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5260: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
5270: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
5280: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ..** .** The dec
5290: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
52a0: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
52b0: 69 73 20 65 69 74 68 65 72 20 54 45 58 54 2c 20  is either TEXT, 
52c0: 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e 59 2e 0a  NUMERIC or ANY..
52d0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
52e0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
52f0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
5300: 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  EGER..*/.static 
5310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
5320: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
5330: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
5340: 54 61 62 4c 69 73 74 2c 20 45 78 70 72 20 2a 70  TabList, Expr *p
5350: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 63 6f  Expr){.  char co
5360: 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  nst *zType;.  in
5370: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
5380: 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  ==0 || pTabList=
5390: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
53a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
53b0: 6f 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65  olveNames(pParse
53c0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 30  , pTabList, 0, 0
53d0: 2c 20 70 45 78 70 72 2c 20 31 2c 20 30 29 3b 0a  , pExpr, 1, 0);.
53e0: 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20  .  /* The TK_AS 
53f0: 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c  operator can onl
5400: 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52  y occur in ORDER
5410: 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48   BY, GROUP BY, H
5420: 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20  AVING,.  ** and 
5430: 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20  LIMIT clauses.  
5440: 42 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e  But pExpr origin
5450: 61 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ates in the resu
5460: 6c 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a  lt set of a.  **
5470: 20 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78   SELECT.  So pEx
5480: 70 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e  pr can never con
5490: 74 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61  tain an AS opera
54a0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  tor..  */.  asse
54b0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
54c0: 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63  K_AS );..  switc
54d0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
54e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
54f0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c  MN: {.      Tabl
5500: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
5510: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
5520: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
5530: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
5540: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
5550: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
5560: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
5570: 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  le; j++){}.     
5580: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
5590: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
55a0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
55b0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
55c0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
55d0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
55e0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
55f0: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
5600: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
5610: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
5620: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5630: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70   ){.        zTyp
5640: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
5650: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5660: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
5670: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
5680: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
5690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
56a0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
56b0: 54 3a 20 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  T: {.      Selec
56c0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70  t *pS = pExpr->p
56d0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 7a 54  Select;.      zT
56e0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
56f0: 28 70 50 61 72 73 65 2c 20 70 53 2d 3e 70 53 72  (pParse, pS->pSr
5700: 63 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61  c, pS->pEList->a
5710: 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20 20  [0].pExpr); .   
5720: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5730: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
5740: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
5750: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
5760: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
5770: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5780: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5790: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
57a0: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
57b0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
57c0: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
57d0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
57e0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
57f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5800: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
5810: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
5820: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
5830: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
5840: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
5850: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
5860: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5870: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5880: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5890: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
58a0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  e;.  int i;.  fo
58b0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
58c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
58d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
58e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
58f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5900: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
5910: 70 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  pe(pParse, pTabL
5920: 69 73 74 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ist, p);.    if(
5930: 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74   zType==0 ) cont
5940: 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68 65  inue;.    /* The
5950: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
5960: 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66  it's own copy of
5970: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
5980: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a 20  , in case the . 
5990: 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20     ** schema is 
59a0: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
59b0: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
59c0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
59d0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
59e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
59f0: 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  , i+pEList->nExp
5a00: 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e  r, zType, strlen
5a10: 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a  (zType));.  }.}.
5a20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5a30: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
5a40: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
5a50: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
5a60: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
5a70: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
5a80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
5a90: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
5aa0: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
5ab0: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
5ac0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5ad0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
5ae0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
5af0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
5b00: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
5b10: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
5b20: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
5b30: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
5b40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5b50: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5b60: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5b70: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5b80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5b90: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5ba0: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
5bb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5bc0: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
5bd0: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
5be0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5bf0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
5c00: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5c10: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
5c20: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
5c30: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
5c40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
5c50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
5c60: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
5c70: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
5c80: 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20  amesSet || v==0 
5c90: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
5ca0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
5cb0: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
5cc0: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
5cd0: 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d  fullNames = (db-
5ce0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5cf0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
5d00: 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d  ;.  shortNames =
5d10: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
5d20: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
5d30: 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  es)!=0;.  sqlite
5d40: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
5d50: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
5d60: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5d70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
5d80: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
5d90: 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  ;.    p = pEList
5da0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5db0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e    if( p==0 ) con
5dc0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
5dd0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
5de0: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
5df0: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
5e00: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
5e10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5e20: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
5e30: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
5e40: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
5e50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
5e60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
5e70: 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74  LUMN && pTabList
5e80: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
5e90: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
5ea0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
5eb0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
5ec0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
5ed0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
5ee0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
5ef0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
5f00: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
5f10: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
5f20: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5f30: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
5f40: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
5f50: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
5f60: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
5f70: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
5f80: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5f90: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
5fa0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5fb0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
5fc0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
5fd0: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
5fe0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
5ff0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
6000: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
6010: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
6020: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
6030: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
6040: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
6050: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
6060: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6070: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6080: 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e  e(v, i, p->span.
6090: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
60a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
60b0: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
60c0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
60d0: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
60e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
60f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
6100: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
6110: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
6120: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
6130: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
6140: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
6150: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
6160: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
6170: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
6180: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
6190: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
61a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
61b0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
61c0: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33  (v, i, zName, P3
61d0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
61e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6200: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c  lName(v, i, zCol
6210: 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b  , strlen(zCol));
6220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6230: 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a  se if( p->span.z
6240: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
6250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6260: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
6270: 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  v, i, p->span.z,
6280: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
6290: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62     /* sqlite3Vdb
62a0: 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76  eCompressSpace(v
62b0: 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20  , addr); */.    
62c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
62d0: 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20  r zName[30];.   
62e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
62f0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
6300: 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  TabList==0 );.  
6310: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d      sprintf(zNam
6320: 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  e, "column%d", i
6330: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
6340: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
6350: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29  (v, i, zName, 0)
6360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
6370: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
6380: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
6390: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
63a0: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
63b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
63c0: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
63d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
63e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
63f0: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
6400: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
6410: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
6420: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
6430: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
6440: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
6450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6460: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
6470: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
6480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6490: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
64a0: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
64b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
64c0: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
64d0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
64e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
64f0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
6500: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
6510: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
6520: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
6530: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
6540: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
6550: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6560: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6570: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
6580: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
6590: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
65a0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
65b0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
65c0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
65d0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
65e0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
65f0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
6600: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6610: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
6620: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
6630: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
6640: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
6650: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
6660: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
6670: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
6680: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
6690: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
66a0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
66b0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
66c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
66d0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  .  }.  pTab->zNa
66e0: 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20  me = zTabName ? 
66f0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61  sqliteStrDup(zTa
6700: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
6710: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
6720: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
6730: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
6740: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
6750: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6760: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61    pTab->aCol = a
6770: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Col = sqliteMall
6780: 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  oc( sizeof(pTab-
6790: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
67a0: 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nCol );.  for(i=
67b0: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
67c0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
67d0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78   pCol++){.    Ex
67e0: 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20  pr *p, *pR;.    
67f0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
6800: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
6810: 20 20 63 68 61 72 20 2a 7a 42 61 73 65 6e 61 6d    char *zBasenam
6820: 65 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a  e;.    int cnt;.
6830: 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20      .    /* Get 
6840: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
6850: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
6860: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
6870: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
6880: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
6890: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
68a0: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
68b0: 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  en.z==0 || p->pR
68c0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  ight->token.z[0]
68d0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
68e0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
68f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
6900: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
6910: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
6920: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
6930: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
6940: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
6950: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
6960: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e   sqliteStrDup(zN
6970: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
6980: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  if( p->op==TK_DO
6990: 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T .             
69a0: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
69b0: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
69c0: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
69d0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
69e0: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f  /* For columns o
69f0: 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75  f the from A.B u
6a00: 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65  se B as the name
6a10: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
6a20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6a30: 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65  ("%T", &pR->toke
6a40: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
6a50: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
6a60: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
6a70: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
6a80: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
6a90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
6aa0: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
6ab0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6ac0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
6ad0: 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61  tf("%T", &p->spa
6ae0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
6af0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65       /* If all e
6b00: 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20  lse fails, make 
6b10: 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  up a name */.   
6b20: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
6b30: 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d  e3MPrintf("colum
6b40: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
6b50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  }.    sqlite3Deq
6b60: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  uote(zName);..  
6b70: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
6b80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
6b90: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
6ba0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
6bb0: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
6bc0: 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f  end a integer to
6bd0: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
6be0: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
6bf0: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
6c00: 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d  zBasename = zNam
6c10: 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  e;.    for(j=cnt
6c20: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
6c30: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6c40: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
6c50: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
6c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
6c70: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
6c80: 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73  tf("%s:%d", zBas
6c90: 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  ename, ++cnt);. 
6ca0: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
6cb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6cc0: 20 69 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d   if( zBasename!=
6cd0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  zName ){.      s
6ce0: 71 6c 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e  qliteFree(zBasen
6cf0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
6d00: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
6d10: 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  ame;..    /* Get
6d20: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74   the typename, t
6d30: 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e  ype affinity, an
6d40: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
6d50: 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  ence for the.   
6d60: 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20   ** column..    
6d70: 2a 2f 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73  */.    zType = s
6d80: 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75  qliteStrDup(colu
6d90: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20 70  mnType(pParse, p
6da0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 20 2c 70 29  Select->pSrc ,p)
6db0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  );.    pCol->zTy
6dc0: 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20  pe = zType;.    
6dd0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
6de0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
6df0: 52 49 43 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  RIC;.    if( zTy
6e00: 70 65 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  pe ){.      pCol
6e10: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
6e20: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
6e30: 28 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a  (zType, strlen(z
6e40: 54 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Type));.    }.  
6e50: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
6e60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6e70: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
6e80: 20 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43     if( !pCol->pC
6e90: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
6ea0: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
6eb0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
6ec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
6ed0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
6ee0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
6ef0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
6f00: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
6f10: 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
6f20: 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66  g by doing the f
6f30: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e  ollowing.** thin
6f40: 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  gs:.**.**    (1)
6f50: 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
6f60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
6f70: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
6f80: 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
6f90: 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
6fa0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
6fb0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
6fc0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
6fd0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
6fe0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
6ff0: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
7000: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
7010: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
7020: 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
7030: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7040: 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
7050: 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
7060: 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
7070: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
7080: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
7090: 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
70a0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
70b0: 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
70c0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
70d0: 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
70e0: 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
70f0: 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
7100: 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
7110: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
7120: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
7130: 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
7140: 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
7150: 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
7160: 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
7170: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
7180: 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
7190: 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
71a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
71b0: 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
71c0: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
71d0: 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
71e0: 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
71f0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
7200: 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
7210: 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
7220: 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
7230: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
7240: 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
7250: 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
7260: 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
7270: 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
7280: 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
7290: 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
72a0: 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
72b0: 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
72c0: 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
72d0: 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
72e0: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
72f0: 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
7300: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
7310: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65   TABLE..**.** Re
7320: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
7330: 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  s.  If there are
7340: 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65   problems, leave
7350: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7360: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
7370: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
7380: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
7390: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
73a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
73b0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
73c0: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
73d0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
73e0: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
73f0: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
7400: 2a 70 54 61 62 3b 0a 20 20 73 74 72 75 63 74 20  *pTab;.  struct 
7410: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
7420: 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  rom;..  if( p==0
7430: 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29   || p->pSrc==0 )
7440: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61   return 1;.  pTa
7450: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
7460: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
7470: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
7480: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
7490: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
74a0: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
74b0: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
74c0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
74d0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
74e0: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
74f0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
7500: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
7510: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
7520: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
7530: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
7540: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7550: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
7560: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
7570: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
7580: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
7590: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
75a0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
75b0: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
75c0: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
75d0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
75e0: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
75f0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
7600: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
7610: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
7620: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
7630: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pFrom++){.    if
7640: 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
7650: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
7660: 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
7670: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
7680: 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
7690: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
76a0: 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
76b0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
76c0: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
76d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
76e0: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
76f0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
7700: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
7710: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7720: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
7730: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
7740: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
7750: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
7760: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20  From->zAlias==0 
7770: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  ){.        pFrom
7780: 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20  ->zAlias =.     
7790: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
77a0: 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71  ntf("sqlite_subq
77b0: 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
77c0: 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  *)pFrom->pSelect
77d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
77e0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
77f0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
7800: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
7810: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
7820: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70  pFrom->zAlias, p
7830: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
7840: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7850: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7860: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7870: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
7880: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
7890: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
78a0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
78b0: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
78c0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
78d0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
78e0: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
78f0: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
7900: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
7910: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
7920: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
7930: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
7940: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
7950: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
7960: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
7970: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
7980: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20  Transient = 1;. 
7990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
79a0: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
79b0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
79c0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
79d0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 46  ause */.      pF
79e0: 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
79f0: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
7a00: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
7a10: 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61  Parse,pFrom->zNa
7a20: 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62  me,pFrom->zDatab
7a30: 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
7a40: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
7a50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7a60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7a70: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
7a90: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
7aa0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
7ab0: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
7ac0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
7ad0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
7ae0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
7af0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
7b00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7b10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
7b20: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
7b30: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
7b40: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
7b50: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
7b60: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
7b70: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
7b80: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
7b90: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
7ba0: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
7bb0: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
7bc0: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
7bd0: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
7be0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
7bf0: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
7c00: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7c10: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
7c20: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
7c30: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
7c40: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
7c50: 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53  lectDup(pTab->pS
7c60: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7c70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7c80: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
7c90: 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
7ca0: 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
7cb0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
7cc0: 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
7cd0: 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  ( sqliteProcessJ
7ce0: 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
7cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
7d00: 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
7d10: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
7d20: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
7d30: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
7d40: 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
7d50: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
7d60: 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
7d70: 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
7d80: 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
7d90: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
7da0: 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
7db0: 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
7dc0: 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
7dd0: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
7de0: 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
7df0: 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
7e00: 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
7e10: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
7e20: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
7e30: 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
7e40: 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
7e50: 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
7e60: 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
7e70: 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
7e80: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
7e90: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
7ea0: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
7eb0: 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
7ec0: 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
7ed0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
7ee0: 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
7ef0: 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
7f00: 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
7f10: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
7f20: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
7f30: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
7f40: 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
7f50: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
7f60: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
7f70: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  ak;.    if( pE->
7f80: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
7f90: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e  ->pRight && pE->
7fa0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
7fb0: 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  LL.         && p
7fc0: 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e  E->pLeft && pE->
7fd0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
7fe0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
7ff0: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c  rc = 0;.  if( k<
8000: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
8010: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
8020: 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
8030: 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
8040: 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
8050: 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
8060: 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
8070: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
8080: 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
8090: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
80a0: 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
80b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
80c0: 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
80d0: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
80e0: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
80f0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
8100: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
8110: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
8120: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
8130: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
8140: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
8150: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
8160: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
8170: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
8180: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
8190: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
81a0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
81b0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
81c0: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
81d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
81e0: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
81f0: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
8200: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
8210: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8220: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
8230: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
8240: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
8250: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
8260: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
8270: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
8280: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
8290: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
82a0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
82b0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
82c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
82d0: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
82e0: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
82f0: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
8300: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
8310: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
8320: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
8330: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
8340: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
8350: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
8360: 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
8370: 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
8380: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
8390: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
83a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
83b0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
83c0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
83d0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
83e0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
83f0: 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74  en(&pE->pLeft->t
8400: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
8410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8420: 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
8430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
8440: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
8450: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
8460: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
8470: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
8480: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8490: 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
84a0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
84b0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
84c0: 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
84d0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
84e0: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
84f0: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
8500: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
8510: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
8520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8530: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
8540: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
8550: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
8560: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
8570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
8580: 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
8590: 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20  bName)!=0) ){.  
85a0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
85b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
85c0: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
85d0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
85e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
85f0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
8600: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
8610: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
8620: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
8630: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
8640: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
8650: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
8660: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
8670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8680: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
8690: 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
86a0: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
86c0: 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70   (pLeft->jointyp
86d0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
86e0: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
8700: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
8710: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
8720: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8730: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
8740: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
8750: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
8760: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
8770: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
8780: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
8790: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
87a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
87b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
87c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
87d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
87e0: 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c  x(pLeft->pUsing,
87f0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8810: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
8820: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
8830: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
8840: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
8850: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
8860: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
8870: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
8880: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8890: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
88b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
88c0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
88d0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
88e0: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
88f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
8900: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
8910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
8920: 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74  Token(&pRight->t
8930: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
8940: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
8950: 61 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69  abName && pTabLi
8960: 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
8970: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
8980: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
8990: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
89a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
89b0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
89c0: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  pr(TK_DOT, pLeft
89d0: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
89f0: 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b  pExpr==0 ) break
8a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8a10: 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d  setToken(&pLeft-
8a20: 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65  >token, zTabName
8a30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8a40: 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72   setToken(&pExpr
8a50: 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d  ->span, sqlite3M
8a60: 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20  Printf("%s.%s", 
8a70: 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
8a80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8a90: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
8aa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
8ab0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
8ac0: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .z = 0;.        
8ad0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8ae0: 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.n = 0;.      
8af0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8b00: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8b10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8b30: 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8b50: 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72  pr->span = pExpr
8b60: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
8b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b80: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
8b90: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
8ba0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52  pNew, pExpr, &pR
8bb0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
8bc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8bd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
8be0: 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
8bf0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
8c00: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
8c10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8c20: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
8c30: 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
8c40: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
8c50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8c60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8c70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8c80: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
8c90: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
8ca0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
8cb0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
8cd0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
8ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8cf0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8d00: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
8d10: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
8d20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8d30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8d40: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
8d50: 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53  ly unlinks the S
8d60: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
8d70: 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  Tab pointers.** 
8d80: 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75  in a select stru
8d90: 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20  cture.  It just 
8da0: 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  sets the pointer
8db0: 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  s to NULL.  This
8dc0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72  .** routine is r
8dd0: 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20  ecursive in the 
8de0: 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68  sense that if th
8df0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
8e00: 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69  ].pSelect.** poi
8e10: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
8e20: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
8e30: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
8e40: 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69  vely on that poi
8e50: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
8e60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8e70: 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74  ed on the Select
8e80: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8e90: 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45  defines a.** VIE
8ea0: 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e  W in order to un
8eb0: 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20  do any bindings 
8ec0: 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73  to tables.  This
8ed0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a   is necessary.**
8ee0: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
8ef0: 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44  ables might be D
8f00: 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65  ROPed by a subse
8f10: 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e  quent SQL comman
8f20: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e  d..** If the bin
8f30: 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65  dings are not re
8f40: 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20  moved, then the 
8f50: 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d  Select.pSrc->a[]
8f60: 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77  .pTab field.** w
8f70: 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
8f80: 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f  ting to a deallo
8f90: 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75  cated Table stru
8fa0: 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a  cture after the.
8fb0: 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f  ** DROP and a co
8fc0: 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75  redump will occu
8fd0: 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  r the next time 
8fe0: 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64  the VIEW is used
8ff0: 2e 0a 2a 2f 0a 23 69 66 20 30 0a 76 6f 69 64 20  ..*/.#if 0.void 
9000: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
9010: 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ind(Select *p){.
9020: 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
9030: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
9040: 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
9050: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9060: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
9070: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
9080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  turn;.  for(i=0,
9090: 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
90a0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
90b0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
90c0: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 49 74   if( (pTab = pIt
90d0: 65 6d 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b 0a  em->pTab)!=0 ){.
90e0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
90f0: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
9100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
9110: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
9120: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
9130: 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
9140: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  0;.      if( pIt
9150: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
9160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
9170: 6c 65 63 74 55 6e 62 69 6e 64 28 70 49 74 65 6d  lectUnbind(pItem
9180: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
9190: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
91a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
91b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63  is routine assoc
91c0: 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e  iates entries in
91d0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
91e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74  ression list wit
91f0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  h.** columns in 
9200: 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65  a result.  For e
9210: 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70  ach ORDER BY exp
9220: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63  ression, the opc
9230: 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  ode of.** the to
9240: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
9250: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
9260: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f  LUMN and the iCo
9270: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  lumn value of.**
9280: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
9290: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  ode is filled in
92a0: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d   with column num
92b0: 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62  ber and the iTab
92c0: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  le.** value of t
92d0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
92e0: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
92f0: 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65   iTable paramete
9300: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  r..**.** If ther
9310: 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45  e are prior SELE
9320: 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79  CT clauses, they
9330: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
9340: 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a  irst.  A match.*
9350: 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20  * in an earlier 
9360: 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65  SELECT takes pre
9370: 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c  cedence over a l
9380: 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ater SELECT..**.
9390: 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61  ** Any entry tha
93a0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
93b0: 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61   is flagged as a
93c0: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75  n error.  The nu
93d0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
93e0: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
93f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
9400: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
9410: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
9420: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
9430: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
9440: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
9450: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
9460: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
9470: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
9480: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
9490: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
94a0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
94b0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
94c0: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
94d0: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
94e0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
94f0: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
9500: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
9510: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
9520: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
9530: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
9540: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
9550: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
9560: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
9570: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
9580: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
9590: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
95a0: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
95b0: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
95c0: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
95d0: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
95e0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
95f0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
9600: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
9610: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
9620: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
9630: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
9640: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
9650: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
9660: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
9670: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68  ){.    if( match
9680: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
9690: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
96a0: 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42  >pPrior, pOrderB
96b0: 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  y, iTable, 0) ){
96c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
96d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
96e0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
96f0: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
9700: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
9710: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
9720: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
9730: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
9740: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
9750: 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  1;.    if( pOrde
9760: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
9770: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9780: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
9790: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
97a0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
97b0: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
97c0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
97d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
97e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
97f0: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
9800: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
9810: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
9820: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
9830: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
9840: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
9850: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
9860: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9870: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
9880: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
9890: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
98a0: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
98b0: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
98c0: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
98d0: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
98e0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
98f0: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
9900: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
9910: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
9920: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9930: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
9940: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9950: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
9960: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61  ame;.        zLa
9970: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  bel = sqlite3Nam
9980: 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e  eFromToken(&pE->
9990: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
99a0: 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d  assert( zLabel!=
99b0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
99c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
99d0: 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d  zName, zLabel)==
99e0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
99f0: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
9a00: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
9a10: 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a  teFree(zLabel);.
9a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9a30: 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69  ( iCol<0 && sqli
9a40: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
9a50: 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  E, pEList->a[j].
9a60: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
9a70: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
9a80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9a90: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
9aa0: 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43     pE->op = TK_C
9ab0: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d  OLUMN;.      pE-
9ac0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
9ad0: 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c  .      pE->iTabl
9ae0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
9af0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9b00: 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  .done = 1;.    }
9b10: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
9b20: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
9b30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9b40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9b50: 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
9b60: 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25  BY term number %
9b70: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
9b80: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
9b90: 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  mn", i+1);.     
9ba0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62   nErr++;.      b
9bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9bc0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
9bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
9be0: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
9bf0: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
9c00: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
9c10: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
9c20: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
9c30: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9c40: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
9c50: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
9c60: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
9c70: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
9c80: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
9c90: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9ca0: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
9cb0: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
9cc0: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
9cd0: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
9ce0: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
9cf0: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
9d00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9d10: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
9d20: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
9d30: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
9d40: 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74  on the.** nLimit
9d50: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65   and nOffset fie
9d60: 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64  lds.  nLimit and
9d70: 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   nOffset hold th
9d80: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68  e integers.** th
9d90: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
9da0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
9db0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
9dc0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
9dd0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
9de0: 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31   Or that hold -1
9df0: 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20   and 0 if those 
9e00: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
9e10: 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20  tted..** iLimit 
9e20: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9e30: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
9e40: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
9e50: 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74  ers for.** count
9e60: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
9e70: 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  ute the limit an
9e80: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
9e90: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d  ere is no.** lim
9ea0: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
9eb0: 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e  , then iLimit an
9ec0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
9ed0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
9ee0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
9ef0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66  es the values if
9f00: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
9f10: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
9f20: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
9f30: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e   is defined by n
9f40: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9f50: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
9f60: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
9f70: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
9f80: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
9f90: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
9fa0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
9fb0: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
9fc0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
9fd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
9fe0: 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e   Only if nLimit>
9ff0: 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20  =0 or nOffset>0 
a000: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
a010: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
a020: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
a030: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
a040: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
a050: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
a060: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
a070: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
a080: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
a090: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
a0a0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
a0b0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
a0c0: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
a0d0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
a0e0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
a0f0: 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  t *p){.  /* .  *
a100: 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  * If the compari
a110: 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74  son is p->nLimit
a120: 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30  >0 then "LIMIT 0
a130: 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c  " shows.  ** all
a140: 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68   rows.  It is th
a150: 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d  e same as no lim
a160: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61  it. If the compa
a170: 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70  rision is.  ** p
a180: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e  ->nLimit>=0 then
a190: 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20   "LIMIT 0" show 
a1a0: 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a  no rows at all..
a1b0: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
a1c0: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
a1d0: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
a1e0: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
a1f0: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
a200: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
a210: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
a220: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
a230: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
a240: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
a250: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
a260: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
a270: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
a280: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t>=0 ){.    int 
a290: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
a2a0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
a2b0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
a2c0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
a2d0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
a2e0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
a2f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a300: 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d  nteger, -p->nLim
a310: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
a320: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a330: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
a340: 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43  m, 1);.    VdbeC
a350: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49  omment((v, "# LI
a360: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
a370: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
a380: 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iMem;.  }.  if( 
a390: 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a  p->nOffset>0 ){.
a3a0: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
a3b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a3c0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
a3d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a3e0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
a3f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a410: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a420: 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b  -p->nOffset, 0);
a430: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a440: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
a450: 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  tore, iMem, 1);.
a460: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
a470: 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f  (v, "# OFFSET co
a480: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d  unter"));.    p-
a490: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b  >iOffset = iMem;
a4a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a4b0: 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74  nerate VDBE inst
a4c0: 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69  ructions that wi
a4d0: 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  ll open a transi
a4e0: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
a4f0: 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  * will be used f
a500: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74  or an index or t
a510: 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65  o store keyed re
a520: 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70  sults for a comp
a530: 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20  ound.** select. 
a540: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
a550: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   open a transien
a560: 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65  t table that nee
a570: 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ds a.** KeyInfo 
a580: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
a590: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
a5a0: 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  s in the KeyInfo
a5b0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
a5c0: 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20  * by the result 
a5d0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
a5e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  T statement in t
a5f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
a600: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  nt..**.** Specif
a610: 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75  ically, this rou
a620: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a630: 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20  o open an index 
a640: 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53  table for.** DIS
a650: 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e  TINCT, UNION, IN
a660: 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45  TERSECT and EXCE
a670: 50 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  PT select statem
a680: 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a  ents (but not .*
a690: 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a  * UNION ALL)..**
a6a0: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77  .** Make the new
a6b0: 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61   table a KeyAsDa
a6c0: 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41  ta table if keyA
a6d0: 73 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a  sData is true..*
a6e0: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
a6f0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 61  eturned is the a
a700: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
a710: 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75  _OpenTemp instru
a720: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a730: 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64   int openTempInd
a740: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
a750: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
a760: 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73   iTab, int keyAs
a770: 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  Data){.  KeyInfo
a780: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
a790: 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c  t nColumn;.  sql
a7a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a7b0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
a7c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a7d0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a7e0: 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 70 72   addr;..  if( pr
a7f0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
a800: 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
a810: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
a820: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69  Column = p->pELi
a830: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65  st->nExpr;.  pKe
a840: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
a850: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b  lloc( sizeof(*pK
a860: 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a  eyInfo)+nColumn*
a870: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
a880: 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   );.  if( pKeyIn
a890: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fo==0 ) return 0
a8a0: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  ;.  pKeyInfo->en
a8b0: 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 70  c = db->enc;.  p
a8c0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
a8d0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72  = nColumn;.  for
a8e0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
a8f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79 49   i++){.    pKeyI
a900: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
a910: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
a920: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
a930: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
a940: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
a950: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
a960: 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  {.      pKeyInfo
a970: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d  ->aColl[i] = db-
a980: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
a990: 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 73  }.  }.  addr = s
a9a0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a9b0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54   OP_OpenTemp, iT
a9c0: 61 62 2c 20 30 2c 20 0a 20 20 20 20 20 20 28 63  ab, 0, .      (c
a9d0: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
a9e0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
a9f0: 46 29 3b 0a 20 20 69 66 28 20 6b 65 79 41 73 44  F);.  if( keyAsD
aa00: 61 74 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ata ){.    sqlit
aa10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
aa20: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 69 54 61  P_KeyAsData, iTa
aa30: 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  b, 1);.  }.  ret
aa40: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
aa50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aa60: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
aa70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 61  ./*.** Add the a
aa80: 64 64 72 65 73 73 20 22 61 64 64 72 22 20 74 6f  ddress "addr" to
aa90: 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20   the set of all 
aaa0: 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65 20  OpenTemp opcode 
aab0: 61 64 64 72 65 73 73 65 73 0a 2a 2a 20 74 68 61  addresses.** tha
aac0: 74 20 61 72 65 20 62 65 69 6e 67 20 61 63 63 75  t are being accu
aad0: 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d 3e 70 70  mulated in p->pp
aae0: 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a 73 74 61  OpenTemp..*/.sta
aaf0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
ab00: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
ab10: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 61  Select *p, int a
ab20: 64 64 72 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a  ddr){.  IdList *
ab30: 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70 70 4f 70  pList = *p->ppOp
ab40: 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33  enTemp = sqlite3
ab50: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d  IdListAppend(*p-
ab60: 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b  >ppOpenTemp, 0);
ab70: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ab80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ab90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
aba0: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
abb0: 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61  ->nId-1].idx = a
abc0: 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ddr;.  return SQ
abd0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
abe0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
abf0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
ac00: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ac10: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
ac20: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
ac30: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
ac40: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
ac50: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
ac60: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
ac70: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
ac80: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
ac90: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
aca0: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
acb0: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
acc0: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
acd0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
ace0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
acf0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
ad00: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
ad10: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
ad20: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
ad30: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
ad40: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
ad50: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
ad60: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ad70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
ad80: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
ad90: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
ada0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
adb0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
adc0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
add0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
ade0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
adf0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
ae00: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
ae10: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
ae20: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
ae30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
ae40: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
ae50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ae60: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
ae70: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
ae80: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
ae90: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
aea0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
aeb0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
aec0: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
aed0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
aee0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
aef0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
af00: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
af10: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
af20: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
af30: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
af40: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
af50: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
af60: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
af70: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
af80: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
af90: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
afa0: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
afb0: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
afc0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
afd0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
afe0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
aff0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
b000: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
b010: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
b020: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
b030: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
b040: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
b050: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
b060: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
b070: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
b080: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
b090: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
b0a0: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
b0b0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
b0c0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
b0d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
b0e0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b0f0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
b100: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b110: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
b120: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
b130: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
b140: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
b150: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
b160: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b170: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
b180: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
b190: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
b1c0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
b1d0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
b1e0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
b1f0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
b200: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
b210: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
b220: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
b230: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
b240: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
b250: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
b260: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
b270: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
b280: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
b290: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
b2a0: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
b2b0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
b2c0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
b2d0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
b2e0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
b2f0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
b300: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
b310: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
b320: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
b330: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b340: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
b350: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b360: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b370: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b380: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b390: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
b3a0: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
b3b0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
b3c0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
b3d0: 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20          /* \___ 
b3e0: 20 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73   Store query res
b3f0: 75 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65  ults as specifie
b400: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  d */.  int iParm
b410: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b420: 2f 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74  /     by these t
b430: 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  wo parameters.  
b440: 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72         */.  char
b450: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
b460: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
b470: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
b480: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
b490: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
b4a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
b4b0: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
b4c0: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
b4d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
b4e0: 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
b4f0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
b500: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
b510: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
b520: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
b530: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
b540: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
b550: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e  .  IdList *pOpen
b560: 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f 50 5f 4f  Temp = 0;/* OP_O
b570: 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65 73 20  penTemp opcodes 
b580: 74 68 61 74 20 6e 65 65 64 20 61 20 4b 65 79 49  that need a KeyI
b590: 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 41 64  nfo */.  int aAd
b5a0: 64 72 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 2f  dr[5];         /
b5b0: 2a 20 41 64 64 72 65 73 73 65 73 20 6f 66 20 53  * Addresses of S
b5c0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f 70 65  etNumColumns ope
b5d0: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
b5e0: 6e 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20  nAddr = 0;      
b5f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 73 65 64    /* Number used
b600: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
b610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b620: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b630: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
b640: 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  et */..  /* Make
b650: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
b660: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
b670: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
b680: 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
b690: 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
b6a0: 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
b6b0: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
b6c0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
b6d0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
b6e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
b6f0: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
b700: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
b710: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
b720: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
b730: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
b740: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
b750: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
b760: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b770: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
b780: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
b790: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
b7a0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
b7b0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
b7c0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
b7d0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
b7e0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b7f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
b800: 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20  r->nLimit>=0 || 
b810: 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e  pPrior->nOffset>
b820: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b830: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b840: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
b850: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
b860: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
b870: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
b880: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
b890: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
b8a0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b8b0: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
b8c0: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
b8d0: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
b8e0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
b8f0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
b900: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
b910: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b920: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
b930: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
b940: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b950: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
b960: 2a 20 49 66 20 2a 70 20 74 68 69 73 20 69 73 20  * If *p this is 
b970: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
b980: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c  elect statement,
b990: 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   then initialize
b9a0: 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70 65 6e 54  .  ** p->ppOpenT
b9b0: 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  emp to point to 
b9c0: 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49 66 20 2a  pOpenTemp.  If *
b9d0: 70 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  p is not the rig
b9e0: 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73 74 61  ht most.  ** sta
b9f0: 74 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d 3e 70  tement then p->p
ba00: 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c 6c 20 68  pOpenTemp will h
ba10: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
ba20: 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 20 20 2a   initialized.  *
ba30: 2a 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c  * by a prior cal
ba40: 6c 20 74 6f 20 74 68 69 73 20 73 61 6d 65 20 70  l to this same p
ba50: 72 6f 63 65 64 75 72 65 2e 20 20 50 61 73 73 20  rocedure.  Pass 
ba60: 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70 65 6e 54  along the pOpenT
ba70: 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  emp.  ** pointer
ba80: 20 74 6f 20 70 50 72 69 6f 72 2c 20 74 68 65 20   to pPrior, the 
ba90: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
baa0: 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20 2a 2f  o our left..  */
bab0: 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f 70 65 6e  .  if( p->ppOpen
bac0: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Temp==0 ){.    p
bad0: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 26  ->ppOpenTemp = &
bae0: 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 0a 20  pOpenTemp;.  }. 
baf0: 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54   pPrior->ppOpenT
bb00: 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54  emp = p->ppOpenT
bb10: 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  emp;..  /* Creat
bb20: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
bb30: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
bb40: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
bb50: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
bb60: 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
bb70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
bb80: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
bb90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bba0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
bbb0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 61  iParm, 0);.    a
bbc0: 73 73 65 72 74 28 20 6e 41 64 64 72 3d 3d 30 20  ssert( nAddr==0 
bbd0: 29 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e 41 64  );.    aAddr[nAd
bbe0: 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56  dr++] = sqlite3V
bbf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
bc00: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
bc10: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65  arm, 0);.    eDe
bc20: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
bc30: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
bc40: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
bc50: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
bc60: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
bc70: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
bc80: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
bc90: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
bca0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
bcb0: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
bcc0: 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20   pPrior->nLimit 
bcd0: 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  = p->nLimit;.   
bce0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66       pPrior->nOf
bcf0: 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65  fset = p->nOffse
bd00: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
bd10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
bd20: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44  arse, pPrior, eD
bd30: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
bd40: 2c 20 30 2c 20 61 66 66 2c 20 30 29 3b 0a 20 20  , 0, aff, 0);.  
bd50: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
bd60: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
bd70: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bd80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bd90: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
bda0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
bdb0: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
bdc0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
bdd0: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
bde0: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
bdf0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
be00: 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  -1;.        p->n
be10: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
be20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
be30: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
be40: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
be50: 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29  0, 0, 0, aff, 0)
be60: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
be70: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
be80: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
be90: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
bea0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
beb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bed0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55  }.      /* For U
bee0: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
bef0: 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75  ER BY fall throu
bf00: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
bf10: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
bf20: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
bf30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
bf40: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
bf50: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
bf60: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
bf70: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
bf80: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
bf90: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
bfa0: 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a   op = 0;      /*
bfb0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
bfc0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
bfd0: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
bfe0: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
bff0: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
c000: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
c010: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
c020: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
c030: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
c040: 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
c050: 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
c060: 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
c070: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
c080: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f  st *pOrderBy;  /
c090: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
c0a0: 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 72 69  lause for the ri
c0b0: 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  ght SELECT */.  
c0c0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
c0d0: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70       priorOp = p
c0e0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53  ->op==TK_ALL ? S
c0f0: 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55  RT_Table : SRT_U
c100: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
c110: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
c120: 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  & p->pOrderBy==0
c130: 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20   && p->nLimit<0 
c140: 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30  && p->nOffset==0
c150: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
c160: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
c170: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
c180: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
c190: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
c1a0: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
c1b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c1c0: 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d  unionTab = iParm
c1d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c1e0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
c1f0: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
c200: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
c210: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
c220: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
c230: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
c240: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
c250: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
c260: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
c270: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
c280: 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20  p->pOrderBy .   
c290: 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64       && matchOrd
c2a0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
c2b0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
c2c0: 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31  rBy, unionTab, 1
c2d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
c2e0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
c2f0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c300: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
c310: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  }.        addr =
c320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c330: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
c340: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
c350: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
c360: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
c370: 20 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74         rc = mult
c380: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
c390: 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20  ddr(p, addr);.  
c3a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c3b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c3c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
c3d0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c3e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c400: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
c410: 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62  AsData, unionTab
c420: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
c430: 09 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73  .assert( nAddr<s
c440: 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a  izeof(aAddr)/siz
c450: 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b  eof(aAddr[0]) );
c460: 0a 20 20 20 20 20 20 20 20 61 41 64 64 72 5b 6e  .        aAddr[n
c470: 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  Addr++] = sqlite
c480: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c490: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
c4a0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
c4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c4c0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
c4d0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
c4e0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
c4f0: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
c500: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
c510: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c520: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
c530: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
c540: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
c550: 2c 20 61 66 66 2c 20 30 29 3b 0a 20 20 20 20 20  , aff, 0);.     
c560: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c570: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c580: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c590: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
c5a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
c5b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
c5c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
c5d0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
c5e0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
c5f0: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
c600: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
c610: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
c620: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
c630: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
c640: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
c650: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
c660: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
c670: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c680: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
c690: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72  r = 0;.      pOr
c6a0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
c6b0: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
c6c0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
c6d0: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
c6e0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
c6f0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
c700: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
c710: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
c720: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
c730: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c740: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c750: 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  , op, unionTab, 
c760: 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29  0, 0, 0, aff, 0)
c770: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
c780: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
c790: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
c7a0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
c7b0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  p->nLimit = nLim
c7c0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  it;.      p->nOf
c7d0: 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a  fset = nOffset;.
c7e0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
c7f0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69  = -1;.      p->i
c800: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20  Offset = -1;.   
c810: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c820: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c830: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c840: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
c850: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
c860: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
c870: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
c880: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
c890: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
c8a0: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
c8b0: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
c8c0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21        if( eDest!
c8d0: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
c8e0: 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20  nTab!=iParm ){. 
c8f0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
c900: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
c910: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c920: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c930: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
c940: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
c950: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
c960: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
c970: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
c980: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
c990: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
c9a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c9b0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
c9c0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
c9d0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c9e0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
c9f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ca00: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
ca10: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
ca20: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
ca30: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
ca40: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
ca50: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
ca60: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ca70: 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
ca80: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
ca90: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
caa0: 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
cab0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
cac0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
caf0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
cb20: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
cb30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
cb40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
cb50: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
cb60: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cb70: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
cb80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cb90: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
cba0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
cbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cbc0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
cbd0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
cbe0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cbf0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cc00: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
cc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
cc30: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
cc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cc50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cc60: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
cc70: 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
cc80: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
cc90: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
cca0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
ccb0: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e     int nLimit, n
ccc0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
ccd0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f  t addr;..      /
cce0: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
ccf0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
cd00: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
cd10: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
cd20: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
cd30: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
cd40: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
cd50: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
cd60: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
cd70: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
cd80: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
cd90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
cda0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
cdb0: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
cdc0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
cdd0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
cde0: 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72  derBy && matchOr
cdf0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
ce00: 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72  arse,p,p->pOrder
ce10: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
ce20: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
ce30: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
ce40: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
ce50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64 64 72     }..      addr
ce60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ce70: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
ce80: 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  mp, tab1, 0);.  
ce90: 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
cea0: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
ceb0: 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (p, addr);.     
cec0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ced0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
cee0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cef0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
cf00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf10: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
cf20: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20  ata, tab1, 1);. 
cf30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 64       assert( nAd
cf40: 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29  dr<sizeof(aAddr)
cf50: 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d  /sizeof(aAddr[0]
cf60: 29 20 29 3b 0a 20 20 20 20 20 20 61 41 64 64 72  ) );.      aAddr
cf70: 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69  [nAddr++] = sqli
cf80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cf90: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
cfa0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
cfb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
cfc0: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
cfd0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
cfe0: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
cff0: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
d000: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
d010: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
d020: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d030: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
d040: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
d050: 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29 3b 0a   0, 0, aff, 0);.
d060: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d070: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d080: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d090: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d0a0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
d0b0: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
d0c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
d0d0: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
d0e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d0f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d100: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32  P_OpenTemp, tab2
d110: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
d120: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
d130: 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72  TempAddr(p, addr
d140: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d150: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d160: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d170: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d180: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d190: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d1a0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
d1b0: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 1);.      ass
d1c0: 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f  ert( nAddr<sizeo
d1d0: 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28  f(aAddr)/sizeof(
d1e0: 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20  aAddr[0]) );.   
d1f0: 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b     aAddr[nAddr++
d200: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
d210: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
d220: 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32 2c 20  mColumns, tab2, 
d230: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
d240: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  ior = 0;.      n
d250: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
d260: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
d270: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
d280: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
d290: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
d2a0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
d2b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
d2c0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
d2d0: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
d2e0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 2c 20 30 29  0, 0, 0, aff, 0)
d2f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d300: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d310: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
d320: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
d330: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
d340: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d350: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d360: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d370: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d380: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
d390: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
d3a0: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
d3b0: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
d3c0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
d3d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d3e0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d3f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
d400: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
d410: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  k ){.        gen
d420: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d430: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
d440: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
d450: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
d460: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d470: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
d480: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
d490: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
d4c0: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
d4d0: 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
d4e0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
d4f0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
d500: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
d510: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d520: 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20  _FullKey, tab1, 
d530: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d540: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d550: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
d560: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
d570: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
d580: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
d590: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
d5a0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d5b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d5d0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
d5e0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
d610: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
d620: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d630: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
d640: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d650: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d660: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d670: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d680: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
d690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d6a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
d6b0: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
d6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d6d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d6e0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d6f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d700: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
d710: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
d720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d730: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
d740: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
d750: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
d760: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
d770: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
d780: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
d790: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
d7a0: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
d7b0: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
d7c0: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
d7d0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d7e0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
d7f0: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
d800: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
d810: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
d820: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
d830: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d840: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
d850: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
d860: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
d870: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
d880: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
d890: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
d8a0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d8b0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d8c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d8d0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d8e0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
d8f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
d900: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
d910: 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c  bles.  */.  nCol
d920: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
d930: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41  xpr;.  while( nA
d940: 64 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64  ddr>0 ){.    nAd
d950: 64 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr--;.    sqlite
d960: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
d970: 20 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e   aAddr[nAddr], n
d980: 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Col);.  }..  /* 
d990: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
d9a0: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
d9b0: 20 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f   by either the O
d9c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
d9d0: 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65  r.  ** by any te
d9e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
d9f0: 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
da00: 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
da10: 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
da20: 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
da30: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
da40: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
da50: 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20  s.  Invoke the. 
da60: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f   ** ORDER BY pro
da70: 63 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65  cessing if there
da80: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
da90: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
daa0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
dab0: 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
dac0: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
dad0: 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
dae0: 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
daf0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
db00: 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
db10: 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
db20: 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
db30: 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
db40: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
db50: 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
db60: 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
db70: 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
db80: 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
db90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
dba0: 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70  pOrderBy || (pOp
dbb0: 65 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54  enTemp && pOpenT
dbc0: 65 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20  emp->nId>0) ){. 
dbd0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
dc00: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
dc10: 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
dc20: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
dc30: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
dc40: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
dc50: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
dc60: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 3d 20  ->ppOpenTemp == 
dc70: 26 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a 20 20  &pOpenTemp );.  
dc80: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
dc90: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
dca0: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
dcb0: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
dcc0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
dcd0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
dce0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
dcf0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
dd00: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
dd10: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
dd20: 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65  fo->enc = pParse
dd30: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  ->db->enc;.    p
dd40: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
dd50: 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  = nCol;..    for
dd60: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
dd70: 2b 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  +){.      pKeyIn
dd80: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  fo->aColl[i] = m
dd90: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
dda0: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
ddb0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79  .      if( !pKey
ddc0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
ddd0: 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  {.        pKeyIn
dde0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
ddf0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
de00: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
de10: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
de20: 3b 20 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 69  ; pOpenTemp && i
de30: 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b  <pOpenTemp->nId;
de40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
de50: 20 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f   p3type = (i==0?
de60: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
de70: 46 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  FF:P3_KEYINFO);.
de80: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
de90: 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d   pOpenTemp->a[i]
dea0: 2e 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  .idx;.      sqli
deb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
dec0: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a  v, addr, (char *
ded0: 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79 70  )pKeyInfo, p3typ
dee0: 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
def0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
df00: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
df10: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  xprList_item *pO
df20: 72 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d 3e  rderByTerm = p->
df30: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
df40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
df50: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
df60: 3b 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79 54  ; i++, pOrderByT
df70: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
df80: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
df90: 72 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78 70  rderByTerm->pExp
dfa0: 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  r;.        char 
dfb0: 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72 42  *zName = pOrderB
dfc0: 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  yTerm->zName;.  
dfd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
dfe0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
dff0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
e000: 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20  lumn<nCol );.   
e010: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 45       assert( !pE
e020: 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
e030: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
e040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
e050: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  pr->pColl = sqli
e060: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
e070: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
e080: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -1);.        }el
e090: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45  se{.          pE
e0a0: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b 65  xpr->pColl = pKe
e0b0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45 78  yInfo->aColl[pEx
e0c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  pr->iColumn];.  
e0d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e0e0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
e0f0: 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
e100: 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  , v, p->pEList->
e110: 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
e120: 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  arm);.    }..   
e130: 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d 70 20   if( !pOpenTemp 
e140: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e150: 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55 4e 49   happens for UNI
e160: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
e170: 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c   BY */.      sql
e180: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
e190: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d 75  );.    }.  }..mu
e1a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
e1b0: 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d 70 20    if( pOpenTemp 
e1c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
e1d0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65 6e  ListDelete(pOpen
e1e0: 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Temp);.  }.  p->
e1f0: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a  ppOpenTemp = 0;.
e200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
e210: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e220: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
e230: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
e240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
e250: 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  W./*.** Scan thr
e260: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
e270: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
e280: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
e290: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
e2a0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
e2b0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
e2c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
e2d0: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
e2e0: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
e2f0: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
e300: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
e310: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
e320: 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
e330: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
e340: 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
e350: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
e360: 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
e370: 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
e380: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
e390: 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
e3a0: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
e3b0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
e3c0: 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
e3d0: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
e3e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
e3f0: 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
e400: 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
e410: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e420: 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
e430: 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
e440: 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
e450: 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
e460: 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
e470: 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
e480: 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
e490: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e4a0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
e4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e4c0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
e4d0: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
e4e0: 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
e4f0: 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
e500: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
e510: 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
e520: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
e530: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
e540: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
e550: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
e560: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e570: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
e580: 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
e590: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
e5a0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
e5b0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
e5c0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
e5d0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
e5e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e5f0: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
e600: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
e610: 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
e620: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e630: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
e640: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
e650: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
e660: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
e670: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
e680: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
e690: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
e6a0: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
e6b0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
e6c0: 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
e6d0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
e6e0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
e6f0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
e700: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65  lite3ExprDup(pNe
e710: 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
e720: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e730: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
e740: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
e750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e760: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
e770: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e780: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
e790: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
e7a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
e7b0: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
e7c0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45  pList);.      pE
e7d0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
e7e0: 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
e7f0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
e800: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
e810: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
e820: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
e830: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
e840: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
e850: 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
e860: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
e870: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
e880: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
e890: 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a  w->span);.    }.
e8a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
e8b0: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
e8c0: 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
e8d0: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
e8e0: 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
e8f0: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
e900: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
e910: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
e920: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
e930: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
e940: 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70  c void .substExp
e950: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
e960: 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c  pList, int iTabl
e970: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
e980: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
e990: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e9a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
e9b0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
e9c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
e9d0: 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
e9e0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
e9f0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
ea00: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ea10: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ea20: 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  VIEW) */..#ifnde
ea30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ea40: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  EW./*.** This ro
ea50: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
ea60: 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
ea70: 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
ea80: 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
ea90: 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
eaa0: 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
eab0: 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
eac0: 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
ead0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
eae0: 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
eaf0: 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
eb00: 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
eb10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
eb20: 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
eb30: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
eb40: 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
eb50: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
eb60: 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
eb70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
eb80: 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
eb90: 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
eba0: 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
ebb0: 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
ebc0: 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
ebd0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
ebe0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ebf0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
ec00: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
ec10: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
ec20: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
ec30: 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
ec40: 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
ec50: 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
ec60: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
ec70: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
ec80: 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
ec90: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
eca0: 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
ecb0: 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
ecc0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
ecd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
ece0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
ecf0: 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
ed00: 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
ed10: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
ed20: 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
ed30: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
ed40: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
ed50: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
ed60: 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
ed70: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
ed80: 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
ed90: 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
eda0: 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
edb0: 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
edc0: 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
edd0: 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
ede0: 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
edf0: 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
ee00: 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
ee10: 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
ee20: 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
ee30: 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
ee40: 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
ee50: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
ee60: 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
ee70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
ee80: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
ee90: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
eea0: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
eeb0: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
eec0: 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
eed0: 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
eee0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
eef0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
ef00: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ef10: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
ef20: 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
ef30: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
ef40: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
ef50: 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
ef60: 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
ef70: 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
ef80: 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
ef90: 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
efa0: 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
efb0: 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
efc0: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
efd0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
efe0: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
eff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
f000: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f010: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
f020: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f030: 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
f040: 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
f050: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
f060: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
f070: 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
f080: 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
f090: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
f0a0: 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
f0b0: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
f0c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
f0d0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
f0e0: 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
f0f0: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
f100: 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
f110: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f120: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
f130: 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
f140: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
f150: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
f160: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
f170: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
f180: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
f190: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
f1a0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f1b0: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
f1c0: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
f1d0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
f1e0: 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
f1f0: 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
f200: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
f210: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
f220: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
f230: 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
f240: 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
f250: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f260: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
f270: 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
f280: 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
f290: 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
f2a0: 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
f2b0: 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
f2c0: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
f2d0: 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ).**.** In this 
f2e0: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
f2f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
f300: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
f310: 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
f320: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
f330: 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
f340: 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
f350: 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
f360: 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
f370: 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
f380: 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
f390: 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
f3a0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
f3b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
f3c0: 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
f3d0: 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
f3e0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
f3f0: 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
f400: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
f410: 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
f420: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
f430: 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
f440: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f450: 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
f460: 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
f470: 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
f480: 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
f490: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
f4a0: 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
f4b0: 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
f4c0: 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
f4d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f4e0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
f4f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f500: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
f510: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
f520: 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
f530: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
f540: 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
f550: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
f560: 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
f570: 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
f580: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
f590: 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
f5a0: 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
f5b0: 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
f5c0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
f5d0: 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
f5e0: 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
f5f0: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
f600: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
f610: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
f620: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
f630: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
f640: 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
f650: 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
f660: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
f670: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
f680: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
f690: 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
f6a0: 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
f6b0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
f6c0: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
f6d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
f6e0: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
f6f0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f700: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
f710: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
f720: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
f730: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
f740: 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
f750: 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
f760: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
f770: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f780: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
f790: 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f7b0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
f7c0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
f7d0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
f7e0: 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
f7f0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  subquery */..  /
f800: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
f810: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f820: 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
f830: 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
f840: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
f850: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
f860: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
f870: 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
f880: 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
f890: 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
f8a0: 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
f8b0: 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75  >a[iFrom];.  pSu
f8c0: 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
f8d0: 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
f8e0: 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
f8f0: 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
f900: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
f910: 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75  n 0;.  if( subqu
f920: 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
f930: 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
f940: 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d  n 0;.  pSubSrc =
f950: 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
f960: 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
f970: 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
f980: 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
f990: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
f9a0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
f9b0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  pSub->nLimit>=0)
f9c0: 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63   &&  (pSrc->nSrc
f9d0: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
f9e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f9f0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44   }.  if( (p->isD
fa00: 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c  istinct || p->nL
fa10: 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71  imit>=0) && subq
fa20: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
fa30: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
fa40: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
fa50: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
fa60: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
fa70: 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
fa80: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
fa90: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
faa0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
fab0: 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
fac0: 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
fad0: 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
fae0: 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
faf0: 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
fb00: 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
fb10: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
fb20: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
fb30: 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
fb40: 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
fb50: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
fb60: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
fb70: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
fb80: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
fb90: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
fba0: 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
fbb0: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
fbc0: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
fbd0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
fbe0: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
fbf0: 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
fc00: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
fc10: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
fc20: 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
fc30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
fc40: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
fc50: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
fc60: 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
fc70: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
fc80: 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
fc90: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
fca0: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
fcb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
fcc0: 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
fcd0: 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
fce0: 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
fcf0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
fd00: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
fd10: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
fd20: 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
fd30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
fd40: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
fd50: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
fd60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
fd70: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
fd80: 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
fd90: 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
fda0: 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
fdb0: 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
fdc0: 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
fdd0: 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
fde0: 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
fdf0: 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
fe00: 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
fe10: 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
fe20: 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
fe30: 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
fe40: 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
fe50: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
fe60: 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
fe70: 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
fe80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
fe90: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
fea0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
feb0: 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
fec0: 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
fed0: 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
fee0: 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
fef0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
ff00: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
ff10: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
ff20: 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
ff30: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
ff40: 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
ff50: 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
ff60: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
ff70: 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
ff80: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
ff90: 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
ffa0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
ffb0: 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
ffc0: 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
ffd0: 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
ffe0: 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
fff0: 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
10000 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
10010 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
10020 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
10030 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
10040 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
10050 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
10060 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
10070 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
10080 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
10090 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
100a0 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
100b0 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
100c0 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
100d0 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
100e0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
100f0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
10100 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
10110 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
10120 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
10130 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
10140 6e 74 79 70 65 3b 0a 20 20 20 20 54 61 62 6c 65  ntype;.    Table
10150 20 2a 70 54 61 62 20 3d 20 70 53 75 62 69 74 65   *pTab = pSubite
10160 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  m->pTab;..    if
10170 28 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  ( pTab && pTab->
10180 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
10190 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
101a0 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69  teTable(0, pSubi
101b0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
101c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
101d0 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61  (pSubitem->zData
101e0 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
101f0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
10200 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
10210 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
10220 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  >zAlias);.    if
10230 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
10240 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
10250 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
10260 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
10270 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
10280 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
10290 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
102a0 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
102b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
102c0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
102d0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
102e0 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
102f0 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
10300 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
10310 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
10320 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
10330 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
10340 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
10350 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
10360 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
10370 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
10380 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
10390 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
103a0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
103b0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
103c0 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
103d0 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
103e0 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
103f0 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
10400 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
10410 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
10420 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
10430 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
10440 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
10450 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
10460 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
10470 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
10480 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
10490 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
104a0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
104b0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
104c0 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
104f0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
10500 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
10510 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
10520 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10530 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
10540 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10550 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
10560 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
10570 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
10580 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
10590 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
105a0 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
105b0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
105c0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
105d0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
105e0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
105f0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
10600 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
10610 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
10620 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10630 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
10640 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
10650 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
10660 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
10670 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
10680 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
10690 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
106a0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
106b0 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
106c0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
106d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
106e0 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
106f0 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
10700 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
10710 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
10720 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
10730 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
10740 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
10750 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
10760 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
10770 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
10780 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
10790 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
107a0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
107b0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
107c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
107d0 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
107e0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
107f0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
10800 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
10810 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
10820 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10830 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
10840 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10850 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
10860 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
10870 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
10880 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
10890 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65  pWhere);.  }else
108a0 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
108b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
108c0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
108d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
108e0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
108f0 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
10900 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
10910 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
10920 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
10930 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
10940 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
10950 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
10960 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
10970 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69  p->pHaving, sqli
10980 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
10990 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20  >pHaving));.    
109a0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
109b0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
109c0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
109d0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
109e0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
109f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
10a00 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
10a10 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10a20 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
10a30 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
10a40 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
10a50 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d  re, pWhere);.  }
10a60 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74  ..  /* The flatt
10a70 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
10a80 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
10a90 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
10aa0 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65  e.  ** outer que
10ab0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
10ac0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73  .  */.  p->isDis
10ad0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
10ae0 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
10af0 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
10b00 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69   Transfer the li
10b10 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66  mit expression f
10b20 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
10b30 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20   to the outer.  
10b40 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ** query..  */. 
10b50 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
10b60 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
10b70 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
10b80 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
10b90 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
10ba0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
10bb0 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
10bc0 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
10bd0 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
10be0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
10bf0 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
10c00 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
10c10 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
10c20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
10c30 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
10c40 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69  Offset;..  /* Fi
10c50 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
10c60 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
10c70 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
10c80 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
10c90 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
10ca0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
10cb0 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
10cc0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
10cd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
10ce0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
10cf0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
10d00 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
10d10 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
10d20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
10d30 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
10d40 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
10d50 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
10d60 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
10d70 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
10d80 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
10d90 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
10da0 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
10db0 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
10dc0 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
10dd0 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
10de0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
10df0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
10e00 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
10e10 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
10e20 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
10e30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
10e40 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
10e50 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
10e60 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
10e70 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
10e80 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
10e90 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
10ea0 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
10eb0 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
10ec0 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
10ed0 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
10ee0 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
10ef0 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
10f00 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
10f10 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
10f20 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
10f30 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
10f40 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
10f50 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
10f60 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
10f70 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
10f80 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
10f90 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
10fa0 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
10fb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
10fc0 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
10fd0 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
10fe0 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
10ff0 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ite3Select()..**
11000 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
11010 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
11020 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
11030 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
11040 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
11050 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  t simpleMinMaxQu
11060 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
11070 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
11080 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
11090 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm){.  Expr *pEx
110a0 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
110b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
110c0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
110d0 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
110e0 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
110f0 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
11100 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11110 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74  t, *pList, eList
11120 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
11130 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
11140 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  em;.  SrcList *p
11150 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  Src;..  /* Check
11160 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
11170 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
11180 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11190 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
111a0 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
111b0 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
111c0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
111d0 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
111e0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
111f0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
11200 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
11210 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
11220 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
11230 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
11240 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
11250 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
11260 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
11270 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
11280 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
11290 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
112a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
112b0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
112c0 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
112d0 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
112e0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
112f0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
11300 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
11310 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
11320 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78  ite3StrNICmp(pEx
11330 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
11340 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
11350 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
11360 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
11370 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
11380 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
11390 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
113a0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
113b0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
113c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
113d0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
113e0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
113f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
11400 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
11410 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
11420 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
11430 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
11440 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
11450 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
11460 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
11470 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
11480 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
11490 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
114a0 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
114b0 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
114c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
114d0 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
114e0 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
114f0 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
11500 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
11510 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
11520 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
11530 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
11540 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
11550 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
11560 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
11570 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
11580 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
11590 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
115a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
115b0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
115c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
115d0 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
115e0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
115f0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
11600 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
11610 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
11620 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
11630 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
11640 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
11650 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64  [0]==iCol && pId
11660 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11670 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65  [0]==pColl ) bre
11680 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11690 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
116a0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
116b0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
116c0 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
116d0 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
116e0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
116f0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
11700 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
11710 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
11720 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
11730 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
11740 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
11750 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
11760 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
11770 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
11780 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
11790 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
117a0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
117b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
117c0 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
117d0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
117e0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
117f0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
11800 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
11810 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
11820 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
11830 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11840 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
11850 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
11860 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11870 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
11880 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
11890 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
118a0 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
118b0 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
118c0 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
118d0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
118e0 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
118f0 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
11900 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
11910 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
11920 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
11930 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
11940 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
11950 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
11960 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
11970 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
11980 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
11990 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
119a0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
119b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
119c0 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53  Db);.  base = pS
119d0 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
119e0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
119f0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
11a00 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63  , p);.  if( pSrc
11a10 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
11a20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11a30 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64  OpenTableForRead
11a40 69 6e 67 28 76 2c 20 62 61 73 65 2c 20 70 54 61  ing(v, base, pTa
11a50 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d  b);.  }.  cont =
11a60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11a70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
11a80 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
11a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11aa0 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
11ab0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
11ac0 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
11ad0 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
11ae0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
11af0 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
11b00 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
11b10 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
11b20 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
11b30 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
11b40 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
11b50 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
11b60 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
11b70 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
11b80 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
11b90 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
11ba0 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
11bb0 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
11bc0 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
11bd0 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
11be0 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
11bf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
11c00 20 69 49 64 78 3b 0a 20 20 20 20 69 49 64 78 20   iIdx;.    iIdx 
11c10 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11c30 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
11c40 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
11c50 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11c60 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
11c70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49  enRead, iIdx, pI
11c80 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx->tnum,.      
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11ca0 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e  ar*)&pIdx->keyIn
11cb0 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
11cc0 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d  .    if( seekOp=
11cd0 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20  =OP_Rewind ){.  
11ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11cf0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
11d00 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
11d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11d20 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
11d30 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 1, 0);.      
11d40 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65  seekOp = OP_Move
11d50 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Gt;.    }.    sq
11d60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11d70 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20  , seekOp, iIdx, 
11d80 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11d90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11da0 64 78 52 65 63 6e 6f 2c 20 69 49 64 78 2c 20 30  dxRecno, iIdx, 0
11db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11dc0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
11dd0 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ose, iIdx, 0);. 
11de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11df0 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
11e00 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
11e10 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
11e20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
11e30 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
11e40 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
11e50 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
11e60 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
11e70 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
11e80 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  r;.  selectInner
11e90 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11ea0 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
11eb0 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
11ec0 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30  m, cont, cont, 0
11ed0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11ee0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11ef0 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
11f00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11f10 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
11f20 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
11f30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
11f40 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
11f50 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11f60 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
11f70 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
11f80 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
11f90 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
11fa0 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
11fb0 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
11fc0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
11fd0 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
11fe0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
11ff0 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
12000 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
12010 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
12020 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
12030 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
12040 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
12050 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
12060 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
12070 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
12080 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12090 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
120a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
120b0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
120c0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f  * The ORDER BY o
120d0 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
120e0 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65  e to be processe
120f0 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  d */.  SrcList *
12100 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
12110 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
12120 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12130 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  EList,     /* Th
12140 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
12150 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
12160 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  NC,     /* Name 
12170 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 6e 63 6c  context for encl
12180 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 20  osing query */. 
12190 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
121a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
121b0 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
121c0 74 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f 6c 76  tions are involv
121d0 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
121e0 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
121f0 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20   Either "ORDER" 
12200 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61  or "GROUP", as a
12210 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
12220 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
12230 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
12240 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
12250 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
12260 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12270 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78  int iCol;.    Ex
12280 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
12290 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
122a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
122b0 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
122c0 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30  &iCol) && iCol>0
122d0 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
122e0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
122f0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12300 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 70 45  te(pE);.      pE
12310 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12320 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
12330 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
12340 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
12350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12360 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
12370 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  lveNames(pParse,
12380 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
12390 74 2c 20 70 4e 43 2c 20 70 45 2c 20 69 73 41 67  t, pNC, pE, isAg
123a0 67 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 72  g, 1) ){.      r
123b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
123c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
123d0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
123e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
123f0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12400 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
12410 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12420 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12430 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  se,.          "%
12440 73 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20  s BY terms must 
12450 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67  not be non-integ
12460 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a  er constants", z
12470 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Type);.        r
12480 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
12490 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30  else if( iCol<=0
124a0 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
124b0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
124c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
124d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
124e0 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c        "%s BY col
124f0 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
12500 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
12510 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
12520 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
12530 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69  nd %d", zType, i
12540 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
12550 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
12560 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
12570 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12580 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
12590 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
125a0 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
125b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
125c0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
125d0 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
125e0 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
125f0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
12600 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74  * value of eDest
12610 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a   and iParm..**.*
12620 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75  *     eDest Valu
12630 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a  e       Result.*
12640 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
12650 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
12660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12680 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c  -.**     SRT_Cal
12690 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20  lback    Invoke 
126a0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  the callback for
126b0 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
126c0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20   result..**.**  
126d0 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
126e0 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72     Store first r
126f0 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20  esult in memory 
12700 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  cell iParm.**.**
12710 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20       SRT_Set    
12720 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
12730 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61  ts as keys of ta
12740 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
12750 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
12760 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
12770 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
12780 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12790 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
127a0 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
127b0 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
127c0 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
127d0 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
127e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
127f0 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
12800 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
12810 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
12820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
12830 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70   above is incomp
12840 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61  lete.  Additiona
12850 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61  l eDist value ha
12860 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73  ve be added.** s
12870 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e  ince this commen
12880 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20  t was written.  
12890 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e  See the selectIn
128a0 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69  nerLoop() functi
128b0 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70  on for.** a comp
128c0 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20  lete listing of 
128d0 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  the allowed valu
128e0 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  es of eDest and 
128f0 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a  their meanings..
12900 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12910 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
12920 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
12930 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
12940 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
12950 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
12960 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
12970 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
12980 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
12990 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
129a0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
129b0 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
129c0 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
129d0 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
129e0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
129f0 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
12a00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
12a10 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61  nt, parentTab, a
12a20 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66  nd *pParentAgg f
12a30 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64  ields are filled
12a40 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53   in if this.** S
12a50 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75  ELECT is a subqu
12a60 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ery.  This routi
12a70 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f  ne may try to co
12a80 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43  mbine this SELEC
12a90 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61  T.** with its pa
12aa0 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73  rent to form a s
12ab0 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79  ingle flat query
12ac0 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20  .  In so doing, 
12ad0 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e  it might.** chan
12ae0 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  ge the parent qu
12af0 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61  ery from a non-a
12b00 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61  ggregate to an a
12b10 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
12b20 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73  ** For that reas
12b30 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41  on, the pParentA
12b40 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65  gg flag is passe
12b50 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20  d as a pointer, 
12b60 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20  so it.** can be 
12b70 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
12b80 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20  xample 1:   The 
12b90 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  meaning of the p
12ba0 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
12bb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
12bc0 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  T * FROM t1 JOIN
12bd0 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e   (SELECT x, coun
12be0 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f  t(*) FROM t2) JO
12bf0 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20  IN t3;.**    \  
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62      \_______ sub
12c20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20  query _______/  
12c30 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c        /.**     \
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20        /.**      
12c80 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
12c90 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
12ca0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
12cb0 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69  _____/.**.** Thi
12cc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12cd0 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65  led for the oute
12ce0 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20  r query first.  
12cf0 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a   For that call,.
12d00 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  ** pParent will 
12d10 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67  be NULL.  During
12d20 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
12d30 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
12d40 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75  ry, this .** rou
12d50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
12d60 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61  ecursively to ha
12d70 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72  ndle the subquer
12d80 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75  y.  For the recu
12d90 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70  rsive.** call, p
12da0 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e  Parent will poin
12db0 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  t to the outer q
12dc0 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74  uery.  Because t
12dd0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a  he subquery is.*
12de0 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  * the second ele
12df0 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d  ment in a three-
12e00 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61  way join, the pa
12e10 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65  rentTab paramete
12e20 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28  r will.** be 1 (
12e30 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66  the 2nd value of
12e40 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72   a 0-indexed arr
12e50 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ay.).*/.int sqli
12e60 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
12e70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12e80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
12e90 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
12ea0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
12ec0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
12ed0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
12ee0 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
12ef0 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
12f00 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
12f10 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
12f20 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
12f30 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74      /* A paramet
12f40 65 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65  er used by the e
12f50 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65  Dest disposal me
12f60 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  thod */.  Select
12f70 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
12f80 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
12f90 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
12fa0 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
12fb0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
12fc0 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
12fd0 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
12fe0 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
12ff0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
13000 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20  ParentAgg,      
13010 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
13020 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
13030 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
13040 20 20 63 68 61 72 20 2a 61 66 66 2c 20 20 20 20    char *aff,    
13050 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
13060 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
13070 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
13080 73 74 72 69 6e 67 20 2a 2f 0a 20 20 4e 61 6d 65  string */.  Name
13090 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 20 20 20  Context *pNC    
130a0 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
130b0 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65  of the next oute
130c0 72 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  r query */.){.  
130d0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e  int i;.  WhereIn
130e0 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64  fo *pWInfo;.  Vd
130f0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41  be *v;.  int isA
13100 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gg = 0;         
13110 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
13120 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
13130 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
13140 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
13150 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
13160 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
13170 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
13180 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
13190 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
131a0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
131b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
131c0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
131d0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
131e0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
131f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
13200 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
13210 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13220 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
13230 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13240 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
13250 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
13260 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
13270 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
13280 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
13290 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
132a0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
132b0 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
132c0 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
132d0 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
132e0 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
132f0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
13300 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
13310 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
13320 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
13330 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
13340 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
13350 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
13360 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
13370 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
13380 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  if( sqlite3_mall
13390 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61  oc_failed || pPa
133a0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d  rse->nErr || p==
133b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
133c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
133d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
133e0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
133f0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
13400 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13410 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
13420 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
13430 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
13440 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
13450 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
13460 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
13470 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
13480 72 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  r ){.#ifndef SQL
13490 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52 0a  ITE_OMIT_CURSOR.
134a0 20 20 20 20 69 66 28 20 70 2d 3e 70 46 65 74 63      if( p->pFetc
134b0 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  h ){.      sqlit
134c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
134d0 65 2c 20 22 63 75 72 73 6f 72 73 20 63 61 6e 6e  e, "cursors cann
134e0 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 63 6f  ot be used on co
134f0 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 22 29  mpound queries")
13500 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
13510 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 23  ect_end;.    }.#
13520 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
13530 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
13540 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
13550 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Parm, aff);.  }.
13560 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
13570 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
13580 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
13590 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
135a0 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
135b0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57   = p->pSrc;.  pW
135c0 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
135d0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
135e0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47  ->pOrderBy;.  pG
135f0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
13600 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
13610 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
13620 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
13630 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
13640 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
13650 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
13660 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
13670 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
13680 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
13690 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
136a0 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
136b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
136c0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
136d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
136e0 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
136f0 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  tmt(pParse, p) )
13700 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
13710 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68  t_end;.  }.  pWh
13720 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
13730 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
13740 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
13750 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
13760 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
13770 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
13780 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
13790 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
137a0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
137b0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
137c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44  ..  */.  if( (eD
137d0 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
137e0 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
137f0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
13800 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
13810 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13820 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
13830 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
13840 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
13850 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
13860 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
13870 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  sion");.    goto
13880 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
13890 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
138a0 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
138b0 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
138c0 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
138d0 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
138e0 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20  se SRT_Union:.  
138f0 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
13900 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  t:.    case SRT_
13910 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70  Discard:.      p
13920 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
13930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
13940 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
13950 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ak;.  }..  /* At
13960 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
13970 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
13980 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
13990 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
139a0 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
139b0 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
139c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
139d0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  .  .  **.  ** Re
139e0 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
139f0 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20   names and do a 
13a00 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20  semantics check 
13a10 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  on all the expre
13a20 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ssions..  */.  f
13a30 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
13a40 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13a50 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
13a60 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13a70 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13a80 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13a90 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
13aa0 73 74 2c 20 30 2c 20 70 4e 43 2c 20 70 58 2c 20  st, 0, pNC, pX, 
13ab0 31 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 67  1, 1) ){.      g
13ac0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13ad0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78      }.    if( Ex
13ae0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
13af0 2c 20 45 50 5f 41 67 67 29 20 29 20 69 73 41 67  , EP_Agg) ) isAg
13b00 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  g = 1;.  }.  if(
13b10 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
13b20 6c 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  lveNames(pParse,
13b30 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
13b40 74 2c 20 70 4e 43 2c 20 70 57 68 65 72 65 2c 20  t, pNC, pWhere, 
13b50 30 2c 20 31 29 20 29 7b 0a 20 20 20 20 67 6f 74  0, 1) ){.    got
13b60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
13b70 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20  }.  if( pHaving 
13b80 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  ){.    if( pGrou
13b90 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
13ba0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13bb0 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50  pParse, "a GROUP
13bc0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65   BY clause is re
13bd0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41  quired before HA
13be0 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f  VING");.      go
13bf0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
13c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
13c10 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13c20 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
13c30 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
13c40 4e 43 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20  NC, pHaving, 1, 
13c50 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  1) ){.      goto
13c60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13c70 20 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48   }.    if( ExprH
13c80 61 73 50 72 6f 70 65 72 74 79 28 70 48 61 76 69  asProperty(pHavi
13c90 6e 67 2c 20 45 50 5f 41 67 67 29 20 29 20 69 73  ng, EP_Agg) ) is
13ca0 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  Agg = 1;.  }.  i
13cb0 66 28 20 70 47 72 6f 75 70 42 79 20 26 26 20 21  f( pGroupBy && !
13cc0 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  isAgg ){.    sql
13cd0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13ce0 72 73 65 2c 20 22 47 52 4f 55 50 20 42 59 20 6d  rse, "GROUP BY m
13cf0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
13d00 6f 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  on aggregate que
13d10 72 69 65 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  ries");.    goto
13d20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
13d30 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72  .  if( processOr
13d40 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
13d50 65 2c 70 4f 72 64 65 72 42 79 2c 70 54 61 62 4c  e,pOrderBy,pTabL
13d60 69 73 74 2c 70 45 4c 69 73 74 2c 70 4e 43 2c 69  ist,pEList,pNC,i
13d70 73 41 67 67 2c 22 4f 52 44 45 52 22 29 0a 20 20  sAgg,"ORDER").  
13d80 20 7c 7c 20 70 72 6f 63 65 73 73 4f 72 64 65 72   || processOrder
13d90 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 70  GroupBy(pParse,p
13da0 47 72 6f 75 70 42 79 2c 70 54 61 62 4c 69 73 74  GroupBy,pTabList
13db0 2c 70 45 4c 69 73 74 2c 70 4e 43 2c 69 73 41 67  ,pEList,pNC,isAg
13dc0 67 2c 22 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a  g,"GROUP").  ){.
13dd0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13de0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  end;.  }..  /* W
13df0 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 20 53  e cannot use a S
13e00 51 4c 20 63 75 72 73 6f 72 20 6f 6e 20 61 20 6a  QL cursor on a j
13e10 6f 69 6e 20 6f 72 20 6f 6e 20 61 20 44 49 53 54  oin or on a DIST
13e20 49 4e 43 54 20 71 75 65 72 79 0a 20 20 2a 2f 0a  INCT query.  */.
13e30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13e40 4d 49 54 5f 43 55 52 53 4f 52 0a 20 20 69 66 28  MIT_CURSOR.  if(
13e50 20 70 2d 3e 70 46 65 74 63 68 20 29 7b 0a 20 20   p->pFetch ){.  
13e60 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
13e70 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nct ){.      sql
13e80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13e90 72 73 65 2c 20 22 63 75 72 73 6f 72 73 20 63 61  rse, "cursors ca
13ea0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20  nnot be used on 
13eb0 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73  DISTINCT queries
13ec0 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ");.      goto s
13ed0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13ee0 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
13ef0 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
13f00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13f10 73 67 28 70 50 61 72 73 65 2c 20 22 63 75 72 73  sg(pParse, "curs
13f20 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ors cannot be us
13f30 65 64 20 6f 6e 20 6a 6f 69 6e 73 22 29 3b 0a 20  ed on joins");. 
13f40 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13f50 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
13f60 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
13f70 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  0].pSelect ){.  
13f80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13f90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 75 72  Msg(pParse, "cur
13fa0 73 6f 72 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  sor cannot be us
13fb0 65 64 20 77 69 74 68 20 6e 65 73 74 65 64 20 71  ed with nested q
13fc0 75 65 72 69 65 73 20 22 0a 20 20 20 20 20 20 20  ueries ".       
13fd0 20 20 20 22 6f 72 20 76 69 65 77 73 22 29 3b 0a     "or views");.
13fe0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
13ff0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
14000 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
14010 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
14020 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
14030 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14040 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
14050 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
14060 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  _end;..  /* Iden
14070 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
14080 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
14090 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20  using them in a 
140a0 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
140b0 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
140c0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
140d0 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73  ut is going to s
140e0 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e  ome other destin
140f0 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
14100 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
14110 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
14120 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
14130 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
14140 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
14150 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14160 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
14170 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
14180 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
14190 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
141a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
141b0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
141c0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
141d0 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  text = 0;.    in
141e0 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  t needRestoreCon
141f0 74 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70  text;..    if( p
14200 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
14210 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
14220 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61  nue;.    if( pTa
14230 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
14240 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  e!=0 ){.      zS
14250 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
14260 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
14270 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50  ontext;.      pP
14280 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
14290 78 74 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  xt = pTabList->a
142a0 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
142b0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
142c0 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ext = 1;.    }el
142d0 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  se{.      needRe
142e0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30  storeContext = 0
142f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14300 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14310 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
14320 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65  .pSelect, SRT_Te
14330 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20 20 20 20  mpTable, .      
14340 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
14350 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
14360 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c  r, p, i, &isAgg,
14370 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
14380 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
14390 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
143a0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
143b0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
143c0 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
143d0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
143e0 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
143f0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
14400 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55  if( eDest!=SRT_U
14410 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53  nion && eDest!=S
14420 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44 65  RT_Except && eDe
14430 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st!=SRT_Discard 
14440 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
14450 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14460 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
14470 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
14480 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
14490 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
144a0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
144b0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
144c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
144d0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
144e0 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20  e of a min() or 
144f0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62  max() function b
14500 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e  y itself.  ** in
14510 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
14520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70  .  */.  if( simp
14530 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50  leMinMaxQuery(pP
14540 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
14550 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63  iParm) ){.    rc
14560 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 0;.    goto s
14570 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
14580 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
14590 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  e if this is a s
145a0 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e  ubquery that can
145b0 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20   be "flattened" 
145c0 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
145d0 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  .  ** If flatten
145e0 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ing is a possibl
145f0 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72  ity, do so and r
14600 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
14610 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  y.  .  */.#ifnde
14620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14630 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  EW.  if( pParent
14640 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
14650 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
14660 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
14670 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
14680 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  ab, *pParentAgg,
14690 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69   isAgg) ){.    i
146a0 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72  f( isAgg ) *pPar
146b0 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  entAgg = 1;.    
146c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
146d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
146e0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
146f0 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f   BY clause, reso
14700 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  lve any collatio
14710 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a  n sequences.  **
14720 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76 65   names that have
14730 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79   been explicitly
14740 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
14750 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14760 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14770 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
14780 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
14790 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
147a0 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
147b0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
147c0 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d  ].pExpr->pColl =
147d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
147e0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
147f0 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  eq(pParse, pOrde
14800 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  rBy->a[i].zName,
14810 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
14820 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
14830 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
14840 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
14850 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
14860 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
14870 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75  er..  */.  compu
14880 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
14890 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20  (pParse, p);..  
148a0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
148b0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
148c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
148d0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
148e0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
148f0 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
14900 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
14910 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14920 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
14930 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14950 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
14960 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
14970 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
14980 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
14990 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
149a0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
149b0 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
149c0 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
149d0 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
149e0 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a   || pGroupBy ){.
149f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14a00 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20  se->nAgg==0 );. 
14a10 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
14a20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
14a30 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14a40 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
14a50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
14a60 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
14a70 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14a80 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
14a90 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ab0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
14ac0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
14ad0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
14ae0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14af0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
14b00 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
14b10 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f  tes(pParse, pGro
14b20 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
14b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
14b40 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14b60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14b70 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74  pHaving && sqlit
14b80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
14b90 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
14ba0 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
14bb0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
14bc0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
14bd0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
14be0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
14bf0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
14c00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
14c10 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
14c20 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
14c30 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
14c40 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
14c50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
14c60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
14c70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14c80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  }.  }..  /* Rese
14c90 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  t the aggregator
14ca0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
14cb0 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  g ){.    int add
14cc0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14cd0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
14ce0 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79 3f 30  set, (pGroupBy?0
14cf0 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67  :1), pParse->nAg
14d00 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  g);.    for(i=0;
14d10 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
14d20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e   i++){.      Fun
14d30 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20  cDef *pFunc;.   
14d40 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20     if( (pFunc = 
14d50 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
14d60 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75  pFunc)!=0 && pFu
14d70 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  nc->xFinalize!=0
14d80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14d90 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
14da0 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20  _AggInit, 0, i, 
14db0 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33  (char*)pFunc, P3
14dc0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
14dd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14de0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
14df0 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a 65     int sz = size
14e00 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 70 47  of(KeyInfo) + pG
14e10 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a 73 69  roupBy->nExpr*si
14e20 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a  zeof(CollSeq*);.
14e30 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
14e40 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a  Key = (KeyInfo *
14e50 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 7a  )sqliteMalloc(sz
14e60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
14e70 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  pKey ){.        
14e80 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14ea0 4b 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73  Key->enc = pPars
14eb0 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20  e->db->enc;.    
14ec0 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d    pKey->nField =
14ed0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
14ee0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
14ef0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
14f00 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14f10 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
14f20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14f30 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 47  llSeq(pParse, pG
14f40 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
14f50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
14f60 20 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d   !pKey->aColl[i]
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   ){.          pK
14f80 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  ey->aColl[i] = p
14f90 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
14fa0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Coll;.        }.
14fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14fc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14fd0 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
14fe0 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49   *)pKey, P3_KEYI
14ff0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
15000 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e    }.  }..  /* In
15010 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
15020 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c  ory cell to NULL
15030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
15040 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
15050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15060 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
15070 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
15080 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15090 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
150a0 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
150b0 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  /* Open a tempor
150c0 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65  ary table to use
150d0 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
150e0 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
150f0 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
15100 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
15110 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
15120 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78     openTempIndex
15130 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73 74  (pParse, p, dist
15140 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  inct, 0);.  }els
15150 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
15160 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
15170 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
15180 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
15190 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
151a0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
151b0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
151c0 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  re,.            
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151e0 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
151f0 26 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 46  &pOrderBy, p->pF
15200 65 74 63 68 29 3b 0a 20 20 69 66 28 20 70 57 49  etch);.  if( pWI
15210 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
15220 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
15230 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
15240 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77   inner loop if w
15250 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e  e are not dealin
15260 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72  g with.  ** aggr
15270 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66  egates.  */.  if
15280 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  ( !isAgg ){.    
15290 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
152a0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
152b0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
152c0 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
152d0 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
152e0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
152f0 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  m, pWInfo->iCont
15300 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
15310 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20  reak, aff) ){.  
15320 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
15330 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
15340 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
15350 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
15360 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
15370 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
15380 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
15390 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
153a0 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78   else{.    AggEx
153b0 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66  pr *pAgg;.    if
153c0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
153d0 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
153e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
153f0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
15400 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
15410 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15420 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
15430 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
15440 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f     }.      /* No
15450 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15460 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
15470 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50  the following OP
15480 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20  _MakeRecord .   
15490 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65     ** because we
154a0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
154b0 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20  do any coercion 
154c0 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f  of datatypes. */
154d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
154e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
154f0 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70  keRecord, pGroup
15500 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  By->nExpr, 0);. 
15510 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
15520 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15530 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15540 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15550 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
15560 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
15570 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
15580 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
15590 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
155a0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g++){.        if
155b0 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20  ( pAgg->isAgg ) 
155c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
155d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
155e0 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e  e(pParse, pAgg->
155f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
15600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15610 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
15620 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
15630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15640 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
15650 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bl1);.    }.    
15660 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
15670 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
15680 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
15690 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
156a0 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
156b0 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
156c0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
156d0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 2d        if( !pAgg-
156e0 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  >isAgg ) continu
156f0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
15700 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20   pAgg->pFunc!=0 
15710 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15720 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53   pAgg->pFunc->xS
15730 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tep!=0 );.      
15740 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75  pDef = pAgg->pFu
15750 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  nc;.      pE = p
15760 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Agg->pExpr;.    
15770 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
15780 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15790 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
157a0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
157b0 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
157c0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
157d0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
157e0 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ist);.      sqli
157f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15800 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
15810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
15820 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
15830 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
15840 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
15850 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
15860 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70       for(j=0; !p
15870 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b  Coll && j<nExpr;
15880 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
15890 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
158a0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
158b0 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61  se, pE->pList->a
158c0 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
158d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
158e0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
158f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
15900 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
15910 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
15920 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
15930 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
15940 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
15950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15960 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
15970 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
15980 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
15990 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  Def, P3_POINTER)
159a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
159b0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
159c0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
159d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
159e0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
159f0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72   /* If we are pr
15a00 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
15a10 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  tes, we need to 
15a20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20  set up a second 
15a30 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61  loop.  ** over a
15a40 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  ll of the aggreg
15a50 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70  ate values and p
15a60 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a  rocess them..  *
15a70 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
15a80 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20  .    int endagg 
15a90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15aa0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
15ab0 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
15ac0 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
15ad0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15ae0 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65  OP_AggNext, 0, e
15af0 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72  ndagg);.    pPar
15b00 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a  se->useAgg = 1;.
15b10 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
15b20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15b30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
15b40 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
15b50 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
15b60 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
15b70 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15b80 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
15b90 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
15ba0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bc0 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
15bd0 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29  , endagg, aff) )
15be0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
15bf0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
15c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15c10 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
15c20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20  0, startagg);.  
15c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15c40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
15c50 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
15c60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15c70 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
15c80 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
15c90 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15ca0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
15cb0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
15cc0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
15cd0 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
15ce0 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
15cf0 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
15d00 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
15d10 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
15d20 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
15d30 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
15d40 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
15d50 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
15d60 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
15d70 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
15d80 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76  subquery, we hav
15d90 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20  e now converted 
15da0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
15db0 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  o a.  ** tempora
15dc0 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65  ry table.  So de
15dd0 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72  lete the subquer
15de0 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  y structure from
15df0 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
15e00 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   to prevent this
15e10 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
15e20 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
15e30 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
15e40 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75  e the.  ** the u
15e50 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  se of the tempor
15e60 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
15e70 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
15e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15e90 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
15ea0 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
15eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
15ec0 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
15ed0 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
15ee0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
15ef0 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a  electDelete(p);.
15f00 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
15f10 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
15f20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d  pSelect = 0;.  }
15f30 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
15f40 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
15f50 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
15f60 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
15f70 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
15f80 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
15f90 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
15fa0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
15fb0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
15fc0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
15fd0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
15fe0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
15ff0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
16000 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
16010 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73  .select_end:.  s
16020 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
16030 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
16040 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.