/ Hex Artifact Content
Login

Artifact 4382c7787651e0546d875e38f7fbe646f89bf7ab:


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 36  select.c,v 1.236
0200: 20 32 30 30 35 2f 30 31 2f 33 30 20 31 31 3a 31   2005/01/30 11:1
0210: 31 3a 34 34 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:44 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: 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69  #if 0.static voi
2680: 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74  d sqliteAggregat
2690: 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65  eInfoReset(Parse
26a0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
26b0: 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e  iteFree(pParse->
26c0: 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d  aAgg);.  pParse-
26d0: 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61  >aAgg = 0;.  pPa
26e0: 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20  rse->nAgg = 0;. 
26f0: 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
2700: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
2710: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65  *.** Insert code
2720: 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77   into "v" that w
2730: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
2740: 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ord on the top o
2750: 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  f the.** stack i
2760: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
2770: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
2780: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61  ushOntoSorter(Pa
2790: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 56 64 62  rse *pParse, Vdb
27a0: 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a  e *v, ExprList *
27b0: 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74  pOrderBy){.  int
27c0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
27d0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
27e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
27f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2800: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2810: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  i].pExpr);.  }. 
2820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2830: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
2840: 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rd, pOrderBy->nE
2850: 78 70 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  xpr, 0);.  sqlit
2860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2870: 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 29  P_SortPut, 0, 0)
2880: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  ;.}../*.** Add c
2890: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
28a0: 20 74 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20   the OFFSET and 
28b0: 4c 49 4d 49 54 0a 2a 2f 0a 73 74 61 74 69 63 20  LIMIT.*/.static 
28c0: 76 6f 69 64 20 63 6f 64 65 4c 69 6d 69 74 65 72  void codeLimiter
28d0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
28e0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
28f0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
2900: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
2910: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
2920: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2930: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
2940: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
2950: 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e,    /* Jump he
2960: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
2970: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
2980: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20  .  int iBreak,  
2990: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
29a0: 65 20 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f  e to end the loo
29b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20  p */.  int nPop 
29c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29d0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70  er of times to p
29e0: 6f 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75  op stack when ju
29f0: 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66  mping */.){.  if
2a00: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
2a10: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20  ){.    int addr 
2a20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2a30: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
2a40: 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20  .    if( nPop>0 
2a50: 29 20 61 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71  ) addr++;.    sq
2a60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2a70: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d  , OP_MemIncr, p-
2a80: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 29 3b  >iOffset, addr);
2a90: 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20  .    if( nPop>0 
2aa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ac0: 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20  Pop, nPop, 0);. 
2ad0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ae0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2af0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
2b00: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
2b10: 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70  ment((v, "# skip
2b20: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
2b30: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2b40: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
2b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b60: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2b70: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
2b80: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
2b90: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 78 69  mment((v, "# exi
2ba0: 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 72 65 61  t when LIMIT rea
2bb0: 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  ched"));.  }.}..
2bc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2bd0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
2be0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
2bf0: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
2c00: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
2c10: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
2c20: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
2c30: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
2c40: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
2c50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
2c60: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
2c70: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2c80: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
2c90: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
2ca0: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
2cb0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
2cc0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
2cd0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
2ce0: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
2cf0: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
2d00: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
2d10: 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65  c int selectInne
2d20: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
2d30: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2d40: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2d50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2d60: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2d70: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
2d80: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
2d90: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2da0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2db0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
2dc0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
2dd0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
2de0: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e00: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
2e10: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2e20: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
2e30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2e50: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
2e60: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2e70: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
2e80: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
2e90: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
2ea0: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
2eb0: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
2ec0: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
2ed0: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
2ee0: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
2f20: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
2f30: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2f50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2f60: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
2f80: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
2f90: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
2fa0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
2fb0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
2fc0: 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20  reak,           
2fd0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2fe0: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
2ff0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
3000: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
3010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66             /* af
3020: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66  finity string if
3030: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
3040: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ion */.){.  Vdbe
3050: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
3060: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
3070: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
3080: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3090: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
30a0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
30b0: 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d  nt */..  if( v==
30c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
30d0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
30e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
30f0: 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20  ere was a LIMIT 
3100: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45  clause on the SE
3110: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
3120: 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63  then do the chec
3130: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
3140: 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64   this row should
3150: 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
3160: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
3170: 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20   distinct>=0 && 
3180: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
3190: 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28  ->nExpr>0;.  if(
31a0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
31b0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
31c0: 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28      codeLimiter(
31d0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
31e0: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 7d   iBreak, 0);.  }
31f0: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
3200: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
3210: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
3220: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
3230: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
3240: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
3250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3260: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
3270: 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  cTab, i);.    }.
3280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
3290: 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  lumn = pEList->n
32a0: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
32b0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
32c0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
32d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
32e0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
32f0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3300: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3310: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3320: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3330: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3340: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3350: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3360: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
3370: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
3380: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
3390: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
33a0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
33b0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 23 69  asDistinct ){.#i
33c0: 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  f NULL_ALWAYS_DI
33d0: 53 54 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74  STINCT.    sqlit
33e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
33f0: 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73  P_IsNull, -pELis
3400: 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65  t->nExpr, sqlite
3410: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3420: 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20  (v)+7);.#endif. 
3430: 20 20 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65     /* Deliberate
3440: 6c 79 20 6c 65 61 76 65 20 74 68 65 20 61 66 66  ly leave the aff
3450: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66  inity string off
3460: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3470: 67 0a 20 20 20 20 2a 2a 20 4f 50 5f 4d 61 6b 65  g.    ** OP_Make
3480: 52 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 73 71  Record */.    sq
3490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
34a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
34b0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2a   pEList->nExpr *
34c0: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c   -1, 0);.    sql
34d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
34e0: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69   OP_Distinct, di
34f0: 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 33 56  stinct, sqlite3V
3500: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3510: 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )+3);.    sqlite
3520: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3530: 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  _Pop, pEList->nE
3540: 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  xpr+1, 0);.    s
3550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3560: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3570: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3580: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3590: 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63  # skip indistinc
35a0: 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  t records"));.  
35b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35c0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
35d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
35e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
35f0: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64   OP_PutStrKey, d
3600: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
3610: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
3620: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4c 69   ){.      codeLi
3630: 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e  miter(v, p, iCon
3640: 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c 20 6e  tinue, iBreak, n
3650: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20  Column);.    }. 
3660: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
3670: 65 73 74 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  est ){.#ifndef S
3680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
3690: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 2f  UND_SELECT.    /
36a0: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
36b0: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
36c0: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
36d0: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
36e0: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
36f0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3700: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
3710: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n: {.      sqlit
3720: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3730: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3740: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3750: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3770: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
3780: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
3790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
37b0: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
37c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
37e0: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
37f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3800: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
3810: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
3820: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
3830: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
3840: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
3850: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
3860: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
3870: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
3880: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
3890: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
38a0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
38b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
38c0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ept: {.      int
38d0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
38e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
38f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3900: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3910: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
3920: 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  INCT);.      sql
3930: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
3940: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
3950: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
3960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3970: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
3980: 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a  iParm, addr+3);.
3990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
39a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
39b0: 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ete, iParm, 0);.
39c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
39d0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
39e0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
39f0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
3a00: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
3a10: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3a20: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
3a30: 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  se SRT_TempTable
3a40: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3a50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3a60: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
3a70: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
3a80: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3a90: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3aa0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3ab0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3ae0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
3af0: 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  o, iParm, 0);.  
3b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3b10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
3b20: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
3b30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3b40: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
3b50: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
3b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3b70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
3b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
3b90: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
3ba0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
3bb0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
3bc0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
3bd0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
3be0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
3bf0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
3c00: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
3c10: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
3c20: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
3c30: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
3c40: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
3c50: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
3c60: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
3c70: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
3c80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
3c90: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
3ca0: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
3cb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
3cc0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
3cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ce0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3cf0: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3d10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3d20: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
3d30: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3d40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3d50: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3d60: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3d70: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3d80: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3d90: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3da0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3db0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69 50    char aff = (iP
3dc0: 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20  arm>>16)&0xFF;. 
3dd0: 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
3de0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3df0: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
3e00: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
3e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3e20: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
3e30: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
3e40: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 1);.        s
3e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3e60: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3e70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3e80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3e90: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3ea0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3eb0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ed0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3ee0: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3ef0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3f00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3f20: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3f30: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3f40: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3f50: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3f60: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3f70: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3f80: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3f90: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3fa0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3fb0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3fc0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
3fd0: 73 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52  sts:.    case SR
3fe0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
3ff0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4000: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
4010: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4020: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4030: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4040: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4050: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4070: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
4080: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
4090: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
40a0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
40b0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
40c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
40d0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
40e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
40f0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
4100: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
4110: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
4120: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  back function.. 
4130: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4140: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20  RT_Callback:.   
4150: 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72   case SRT_Sorter
4160: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
4170: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4190: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
41a0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
41b0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
41c0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
41d0: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
41e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
41f0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4200: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
4210: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4220: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4230: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4240: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4250: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4260: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
4270: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
4280: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
4290: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
42a0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
42b0: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
42c0: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
42d0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
42e0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
42f0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4300: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4310: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4320: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4340: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4350: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4360: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
4370: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
4380: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
4390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
43a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43b0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
43c0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
43d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
43e0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
43f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
4400: 49 47 47 45 52 29 20 7c 7c 20 21 64 65 66 69 6e  IGGER) || !defin
4410: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
4420: 55 52 53 4f 52 29 0a 20 20 20 20 2f 2a 20 44 69  URSOR).    /* Di
4430: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4440: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4450: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4460: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4470: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4480: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4490: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
44a0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
44b0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
44c0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
44d0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
44e0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
44f0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4500: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4510: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4520: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4530: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4540: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4550: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4560: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4570: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4580: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
45a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
45b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
45c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
45d0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
45e0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
45f0: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
4600: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
4610: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
4620: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
4630: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
4640: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
4650: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
4660: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
4670: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
4680: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
4690: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
46a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
46b0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
46c0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
46d0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
46e0: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
46f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
4700: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
4710: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4720: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
4730: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4740: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
4750: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
4760: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
4770: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4780: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   nColumn,     /*
4790: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
47a0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
47b0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
47c0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
47d0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
47e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  e */.  int iParm
47f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
4800: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73  nal parameter as
4810: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44  sociated with eD
4820: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
4830: 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56 64  end1 = sqlite3Vd
4840: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4850: 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c    int end2 = sql
4860: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4870: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
4880: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
4890: 66 6f 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  fo;.  ExprList *
48a0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
48b0: 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74  nCol, i;.  sqlit
48c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
48d0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65 44 65 73  >db;..  if( eDes
48e0: 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20  t==SRT_Sorter ) 
48f0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72 64 65 72  return;.  pOrder
4900: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
4910: 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f 72 64 65  ;.  nCol = pOrde
4920: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  rBy->nExpr;.  pI
4930: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
4940: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  oc( sizeof(*pInf
4950: 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f  o) + nCol*(sizeo
4960: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
4970: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30  ;.  if( pInfo==0
4980: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
4990: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
49a0: 20 28 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e   (char*)&pInfo->
49b0: 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  aColl[nCol];.  p
49c0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
49d0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
49e0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
49f0: 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74    /* If a collat
4a00: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
4a10: 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c 69   specified expli
4a20: 63 69 74 79 2c 20 74 68 65 6e 20 69 74 0a 20 20  city, then it.  
4a30: 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69    ** is stored i
4a40: 6e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  n pOrderBy->a[i]
4a50: 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73  .zName. Otherwis
4a60: 65 2c 20 75 73 65 20 74 68 65 20 64 65 66 61 75  e, use the defau
4a70: 6c 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  lt.    ** collat
4a80: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 74 68 65  ion type for the
4a90: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20   expression..   
4aa0: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   */.    pInfo->a
4ab0: 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
4ac0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4ad0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
4ae0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
4af0: 69 66 28 20 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c  if( !pInfo->aCol
4b00: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 49  l[i] ){.      pI
4b10: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
4b20: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4b30: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4b40: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
4b50: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
4b60: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ortOrder;.  }.  
4b70: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4b80: 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c  , OP_Sort, 0, 0,
4b90: 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20 50   (char*)pInfo, P
4ba0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
4bb0: 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  F);.  addr = sql
4bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4bd0: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4be0: 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c 69   end1);.  codeLi
4bf0: 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64 64 72  miter(v, p, addr
4c00: 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73 77  , end2, 1);.  sw
4c10: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4c20: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4c30: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4c40: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
4c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c60: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
4c70: 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  no, iParm, 0);. 
4c80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4c90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4ca0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4cc0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
4cd0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4cf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4d00: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
4d10: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4d30: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d50: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
4d60: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  , -1, sqlite3Vdb
4d70: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
4d80: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4d90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4da0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
4db0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4dc0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4dd0: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
4de0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
4e10: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e  Record, 1, 0, "n
4e20: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
4e30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
4e50: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
4e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e70: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
4e80: 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  ey, (iParm&0x000
4e90: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4eb0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
4ec0: 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ts:.    case SRT
4ed0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
4ee0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4ef0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4f00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4f10: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4f20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4f30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4f40: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31  OP_Goto, 0, end1
4f50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4f60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4f70: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4f80: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
4f90: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
4fa0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fc0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4fd0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
4fe0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
4ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5000: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
5010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5020: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
5030: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5040: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5050: 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69  _Column, -1-i, i
5060: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5070: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5080: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
5090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
50a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
50b0: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
50c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
50d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
50e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
50f0: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
5110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5120: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
5130: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5140: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5150: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
5160: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
5170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5180: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5190: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
51a0: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
51b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
51c0: 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20  bel(v, end2);.  
51d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51e0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
51f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5200: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5210: 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  end1);.  sqlite3
5220: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5230: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
5240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5250: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5260: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
5270: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
5280: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
5290: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
52a0: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
52b0: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
52c0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
52d0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
52e0: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
52f0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
5300: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
5310: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
5320: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
5330: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
5340: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
5350: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5360: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
5370: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
5380: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
5390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
53a0: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
53b0: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
53c0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
53d0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
53e0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
53f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5400: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
5410: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
5420: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
5430: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
5440: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
5450: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
5460: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
5470: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
5480: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
5490: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
54a0: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
54b0: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
54c0: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
54d0: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
54e0: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
54f0: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
5500: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
5510: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
5520: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
5530: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
5540: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
5550: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
5560: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
5570: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
5580: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
5590: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
55a0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
55b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
55c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
55d0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
55e0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
55f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
5600: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
5610: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
5620: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
5630: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
5640: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
5650: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
5660: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
5670: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5680: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
5690: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
56a0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
56b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56c0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
56d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
56e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
56f0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
5700: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5710: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
5720: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
5730: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
5740: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5750: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
5760: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5770: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
5780: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
5790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
57a0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
57b0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
57c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
57d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
57e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
57f0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
5800: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
5810: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
5820: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
5830: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
5840: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
5850: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
5860: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
5870: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
5880: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
5890: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
58a0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e  nType(&sNC, pS->
58b0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
58c0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
58d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
58e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
58f0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
5900: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
5910: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
5920: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5930: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5940: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
5950: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
5960: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5970: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
5980: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
5990: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
59a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
59b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
59c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
59d0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
59e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
59f0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
5a00: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
5a10: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5a20: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5a30: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5a40: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5a50: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
5a60: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
5a70: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
5a80: 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28  pTabList;.  for(
5a90: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5aa0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5ab0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
5ac0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5ae0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
5af0: 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69  (&sNC, p);.    i
5b00: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
5b10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
5b20: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
5b30: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
5b40: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
5b50: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
5b60: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
5b70: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
5b80: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
5b90: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
5ba0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5bb0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5bc0: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
5bd0: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
5be0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
5bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5c00: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5c10: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5c20: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5c30: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5c40: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
5c50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
5c60: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
5c70: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
5c80: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
5c90: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
5ca0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
5cb0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
5cc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5cd0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5ce0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
5cf0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
5d00: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
5d10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5d20: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
5d30: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5d40: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5d50: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5d60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5d70: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
5d80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5d90: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
5da0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
5db0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
5dc0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
5dd0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5de0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
5df0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
5e00: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
5e10: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
5e20: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
5e30: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5e40: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
5e50: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
5e60: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
5e70: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5e80: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5e90: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5ea0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
5eb0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5ec0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
5ed0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
5ee0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5ef0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
5f00: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
5f10: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
5f20: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
5f30: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
5f40: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5f50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5f60: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
5f70: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5f80: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5f90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5fa0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5fb0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5fc0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5fd0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ff0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6000: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
6010: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
6020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6030: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
6040: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
6050: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
6060: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
6070: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
6080: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
6090: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
60a0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
60b0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
60c0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
60d0: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
60e0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
60f0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
6100: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
6110: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6120: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
6130: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
6140: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
6150: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
6160: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
6170: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
6180: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
6190: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
61a0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
61b0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
61c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
61d0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
61e0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
61f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
6200: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
6210: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
6220: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6230: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
6240: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
6250: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
6260: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
6270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6280: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
6290: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
62a0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
62b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
62c0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
62d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
62e0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
62f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
6300: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
6310: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
6320: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
6330: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6350: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
6360: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
6370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
6380: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6390: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
63a0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
63b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
63d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
63e0: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
63f0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
6400: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6410: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6420: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
6430: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6440: 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e  me(v, i, p->span
6450: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
6460: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
6470: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
6480: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
6490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64a0: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
64b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
64c0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
64d0: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
64e0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
64f0: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
6500: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
6510: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6520: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6530: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
6540: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
6550: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
6560: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
6570: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6580: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6590: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
65a0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
65b0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
65c0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
65d0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
65e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
65f0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
6600: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
6610: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
6620: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
6630: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
6640: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
6650: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
6660: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
6670: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
6680: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
6690: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
66a0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
66b0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
66c0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
66d0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
66e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
66f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6700: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6710: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
6720: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
6730: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
6740: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
6750: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
6760: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
6770: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6780: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6790: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
67a0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
67b0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
67c0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
67d0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
67e0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
67f0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
6800: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
6810: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
6820: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6830: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
6840: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
6850: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
6860: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
6870: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
6880: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
6890: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
68a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
68b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
68c0: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65  olve(pParse, pSe
68d0: 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  lect, 0) ){.    
68e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
68f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
6900: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
6910: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
6920: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6930: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
6940: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
6950: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
6960: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6970: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6980: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6990: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
69a0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
69b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
69c0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
69d0: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
69e0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  Malloc( sizeof(p
69f0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
6a00: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f  ab->nCol );.  fo
6a10: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
6a20: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6a30: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
6a40: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
6a50: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
6a60: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
6a70: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73  ;.    char *zBas
6a80: 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63  ename;.    int c
6a90: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
6aa0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
6ab0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
6ac0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
6ad0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
6ae0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
6af0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
6b00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
6b10: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
6b20: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
6b30: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
6b40: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
6b50: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
6b60: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6b70: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
6b80: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
6b90: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
6ba0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
6bb0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
6bc0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
6bd0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6be0: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
6bf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
6c00: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
6c10: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
6c20: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
6c30: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
6c40: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
6c50: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
6c60: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
6c70: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
6c80: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
6c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
6ca0: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
6cb0: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
6cc0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
6cd0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
6ce0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
6cf0: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
6d00: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
6d10: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
6d20: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
6d30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6d40: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
6d50: 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  , &p->span);.   
6d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
6d70: 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69   If all else fai
6d80: 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61  ls, make up a na
6d90: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6da0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
6db0: 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  tf("column%d", i
6dc0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
6dd0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
6de0: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  ame);..    /* Ma
6df0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
6e00: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
6e10: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
6e20: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
6e30: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
6e40: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
6e50: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
6e60: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
6e70: 20 20 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61    */.    zBasena
6e80: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
6e90: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
6ea0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
6eb0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6ec0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
6ed0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6ee0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6ef0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a  ite3MPrintf("%s:
6f00: 25 64 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20  %d", zBasename, 
6f10: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
6f20: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  j = -1;.      }.
6f30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42      }.    if( zB
6f40: 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20 29  asename!=zName )
6f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6f60: 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b 0a 20  ee(zBasename);. 
6f70: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
6f80: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
6f90: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
6fa0: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
6fb0: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
6fc0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
6fd0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
6fe0: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
6ff0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7000: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
7010: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
7020: 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70  StrDup(columnTyp
7030: 65 28 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20  e(&sNC, p));.   
7040: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
7050: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
7060: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7070: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7080: 20 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a     if( zType ){.
7090: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69        pCol->affi
70a0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
70b0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
70c0: 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29  , strlen(zType))
70d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
70e0: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
70f0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7100: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
7110: 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b   !pCol->pColl ){
7120: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f  .      pCol->pCo
7130: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
7140: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
7150: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
7160: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
7170: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
7180: 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45  * Prepare a SELE
7190: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
71a0: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64   processing by d
71b0: 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oing the followi
71c0: 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a  ng.** things:.**
71d0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
71e0: 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
71f0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
7200: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
7210: 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
7220: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
7230: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
7240: 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
7250: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
7260: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
7270: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
7280: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
7290: 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
72a0: 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
72b0: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
72c0: 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
72d0: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
72e0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
72f0: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
7300: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
7310: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
7320: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
7330: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
7340: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
7350: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
7360: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
7370: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
7380: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
7390: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
73a0: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
73b0: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
73c0: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
73d0: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
73e0: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
73f0: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
7400: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
7410: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
7420: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
7430: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
7440: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
7450: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
7460: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
7470: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
7480: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
7490: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
74a0: 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
74b0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
74c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
74d0: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
74e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
74f0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
7500: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
7510: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
7520: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
7530: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
7540: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
7550: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
7560: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
7570: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
7580: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
7590: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
75a0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
75b0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
75c0: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
75d0: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
75e0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
75f0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
7600: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
7610: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
7620: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
7630: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
7640: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
7650: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
7660: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
7670: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7680: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
7690: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
76a0: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
76b0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
76c0: 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >pSrc==0 ) retur
76d0: 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  n 1;.  pTabList 
76e0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
76f0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
7700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
7710: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
7720: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
7730: 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
7740: 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
7750: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
7760: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7770: 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
7780: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
7790: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d  rsors(pParse, p-
77a0: 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  >pSrc);..  /* Lo
77b0: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
77c0: 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
77d0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
77e0: 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
77f0: 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
7800: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
7810: 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
7820: 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
7830: 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
7840: 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
7850: 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
7860: 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
7870: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
7880: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
7890: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
78a0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
78b0: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
78c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
78d0: 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
78e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
78f0: 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
7900: 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
7910: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
7920: 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
7930: 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
7940: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
7950: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
7960: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
7970: 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
7980: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
7990: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
79a0: 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  Y.      /* A sub
79b0: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
79c0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
79d0: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
79e0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
79f0: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
7a00: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
7a10: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
7a20: 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20    pFrom->zAlias 
7a30: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
7a40: 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c 69  te3MPrintf("sqli
7a50: 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
7a60: 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e  , (void*)pFrom->
7a70: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7a80: 7d 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  }.      pFrom->p
7a90: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
7aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
7ab0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
7ac0: 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41  Parse, pFrom->zA
7ad0: 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lias, pFrom->pSe
7ae0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28  lect);.      if(
7af0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
7b00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
7b20: 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66  he isTransient f
7b30: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
7b40: 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  at the Table str
7b50: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a  ucture has been.
7b60: 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
7b70: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
7b80: 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20  nd may be freed 
7b90: 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e  at any time.  In
7ba0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20   other words,.  
7bb0: 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e      ** pTab is n
7bc0: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
7bd0: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
7be0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
7bf0: 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a   defines.      *
7c00: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63  * part of the sc
7c10: 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70  hema. */.      p
7c20: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
7c30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 1;.#endif.   
7c40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
7c50: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
7c60: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
7c70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7c80: 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 72 6f  se */.      pFro
7c90: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
7ca0: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
7cb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
7cc0: 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  rse,pFrom->zName
7cd0: 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
7ce0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
7cf0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7d00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7d10: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
7d20: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
7d30: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
7d40: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
7d50: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
7d60: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
7d70: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
7d80: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
7d90: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
7da0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
7db0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
7dc0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7dd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7de0: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
7df0: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
7e00: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
7e10: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
7e20: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
7e30: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
7e40: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
7e50: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
7e60: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
7e70: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
7e80: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
7e90: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
7ea0: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
7eb0: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
7ec0: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
7ed0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
7ee0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
7ef0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
7f00: 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
7f10: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
7f20: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
7f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7f40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
7f50: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
7f60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
7f70: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
7f80: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
7f90: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
7fa0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
7fb0: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
7fc0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
7fd0: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
7fe0: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
7ff0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
8000: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
8010: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
8020: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
8030: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
8040: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
8050: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
8060: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
8070: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
8080: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
8090: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
80a0: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
80b0: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
80c0: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
80d0: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
80e0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
80f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8100: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
8110: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
8120: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
8130: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
8140: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
8150: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
8160: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
8170: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
8180: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
8190: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
81a0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
81b0: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
81c0: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
81d0: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
81e0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
81f0: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
8200: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
8210: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
8220: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
8230: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
8240: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
8250: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
8260: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
8270: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
8280: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
8290: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
82a0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
82b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
82c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
82d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
82e0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
82f0: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
8300: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
8310: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
8320: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
8330: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
8340: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
8350: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
8360: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
8370: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
8380: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
8390: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
83a0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
83b0: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
83c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
83d0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
83e0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
83f0: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
8400: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
8410: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
8420: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
8430: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
8440: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
8450: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
8460: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
8470: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
8480: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
8490: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
84a0: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
84b0: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
84c0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
84d0: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
84e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
84f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
8500: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8510: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
8520: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  0);.        pNew
8530: 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
8540: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
8550: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
8560: 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
8570: 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
8580: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 0;.      }el
8590: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
85a0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
85b0: 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
85c0: 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
85d0: 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
85e0: 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
85f0: 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
8600: 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
8610: 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
8620: 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
8630: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8640: 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  TName;          
8650: 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
8660: 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
8670: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
8680: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
8690: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
86a0: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69     zTName = sqli
86b0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
86c0: 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  (&pE->pLeft->tok
86d0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  en);.        }el
86e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
86f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
8700: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
8710: 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
8720: 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
8730: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
8740: 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
8750: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
8760: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
8770: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8780: 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
8790: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
87a0: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
87b0: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
87c0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
87d0: 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
87e0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
87f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8800: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
8810: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
8820: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
8830: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
8840: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
8850: 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
8860: 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  ame)!=0) ){.    
8870: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8880: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8890: 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
88a0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
88b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
88c0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
88d0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
88e0: 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a  pExpr, *pLeft, *
88f0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
8900: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
8910: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
8920: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
8930: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
8950: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
8960: 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
8970: 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
8980: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
8990: 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  pLeft->jointype 
89a0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
89b0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
89d0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70  mnIndex(pLeft->p
89e0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
89f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8a00: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
8a10: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
8a20: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
8a30: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
8a40: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
8a50: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
8a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8a80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8a90: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
8aa0: 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
8ab0: 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a  pLeft->pUsing, z
8ac0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8ae0: 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
8af0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
8b00: 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
8b10: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
8b20: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
8b30: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
8b40: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
8b50: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
8b60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8b70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8b80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8b90: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
8ba0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
8bb0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
8bc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
8bd0: 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ht==0 ) break;. 
8be0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
8bf0: 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b  ken(&pRight->tok
8c00: 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  en, zName);.    
8c10: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
8c20: 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74  Name && pTabList
8c30: 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
8c40: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
8c50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
8c60: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8c80: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
8c90: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
8ca0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
8cb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
8cc0: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
8ce0: 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74  tToken(&pLeft->t
8cf0: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
8d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8d10: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
8d20: 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72  span, sqlite3MPr
8d30: 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54  intf("%s.%s", zT
8d40: 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
8d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8d60: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
8d70: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
8d80: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
8d90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8da0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
8db0: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
8dc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8dd0: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
8de0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8e00: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
8e10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8e20: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
8e30: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
8e40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8e50: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
8e60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8e70: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67  ew, pExpr, &pRig
8e80: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
8e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ea0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
8eb0: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
8ec0: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
8ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ee0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8ef0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
8f00: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
8f10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
8f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8f30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8f40: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
8f50: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
8f60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8f70: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
8f80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8f90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54     sqliteFree(zT
8fa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
8fb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8fc0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8fd0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
8fe0: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
8ff0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9000: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9010: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
9020: 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c   unlinks the Sel
9030: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61  ect.pSrc.a[].pTa
9040: 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e  b pointers.** in
9050: 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74   a select struct
9060: 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65  ure.  It just se
9070: 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ts the pointers 
9080: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a  to NULL.  This.*
9090: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63  * routine is rec
90a0: 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65  ursive in the se
90b0: 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20  nse that if the 
90c0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
90d0: 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74  pSelect.** point
90e0: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
90f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9100: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
9110: 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74  ly on that point
9120: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
9130: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9140: 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73   on the Select s
9150: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
9160: 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20  fines a.** VIEW 
9170: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f  in order to undo
9180: 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f   any bindings to
9190: 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69   tables.  This i
91a0: 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
91b0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62  ecause those tab
91c0: 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f  les might be DRO
91d0: 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75  Ped by a subsequ
91e0: 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e  ent SQL command.
91f0: 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e 64 69  .** If the bindi
9200: 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f  ngs are not remo
9210: 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 65  ved, then the Se
9220: 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70  lect.pSrc->a[].p
9230: 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69 6c  Tab field.** wil
9240: 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
9250: 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63 61  ng to a dealloca
9260: 74 65 64 20 54 61 62 6c 65 20 73 74 72 75 63 74  ted Table struct
9270: 75 72 65 20 61 66 74 65 72 20 74 68 65 0a 2a 2a  ure after the.**
9280: 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f 72 65   DROP and a core
9290: 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72 20  dump will occur 
92a0: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
92b0: 65 20 56 49 45 57 20 69 73 20 75 73 65 64 2e 0a  e VIEW is used..
92c0: 2a 2f 0a 23 69 66 20 30 0a 76 6f 69 64 20 73 71  */.#if 0.void sq
92d0: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
92e0: 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  d(Select *p){.  
92f0: 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
9300: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
9310: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
9320: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
9330: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9340: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
9350: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rn;.  for(i=0, p
9360: 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3c  Item=pSrc->a; i<
9370: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  pSrc->nSrc; i++,
9380: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
9390: 66 28 20 28 70 54 61 62 20 3d 20 70 49 74 65 6d  f( (pTab = pItem
93a0: 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20  ->pTab)!=0 ){.  
93b0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
93c0: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
93d0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
93e0: 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29  teTable(0, pTab)
93f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9400: 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pItem->pTab = 0;
9410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
9420: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
9430: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
9440: 63 74 55 6e 62 69 6e 64 28 70 49 74 65 6d 2d 3e  ctUnbind(pItem->
9450: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
9460: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
9470: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
9480: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9490: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
94a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
94b0: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
94c0: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
94d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
94e0: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
94f0: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
9500: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
9510: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
9520: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
9530: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
9540: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
9550: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
9560: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
9570: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
9580: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
9590: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
95a0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
95b0: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
95c0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
95d0: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
95e0: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
95f0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
9600: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
9610: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
9620: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
9630: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
9640: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
9650: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
9660: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
9670: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
9680: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
9690: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
96a0: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
96b0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
96c0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
96d0: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
96e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
96f0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
9700: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
9710: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9720: 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61  * A place to lea
9730: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
9740: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
9750: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f  Select,        /
9760: 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c  * Match to resul
9770: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69  t columns of thi
9780: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78  s SELECT */.  Ex
9790: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
97a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
97b0: 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20  ER BY values to 
97c0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f  match against co
97d0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lumns */.  int i
97e0: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
97f0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
9800: 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c  s value in iTabl
9810: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43  e */.  int mustC
9820: 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f  omplete        /
9830: 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52  * If TRUE all OR
9840: 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74  DER BYs must mat
9850: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ch */.){.  int n
9860: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
9870: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
9880: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
9890: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
98a0: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
98b0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74  rn 1;.  if( must
98c0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
98d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
98e0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
98f0: 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  { pOrderBy->a[i]
9900: 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d  .done = 0; }.  }
9910: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
9920: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
9930: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
9940: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9950: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
9960: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
9970: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
9980: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
9990: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
99a0: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
99b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
99c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
99d0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
99e0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
99f0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9a00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
9a10: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
9a20: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9a30: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
9a40: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
9a50: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9a60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9a70: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
9a80: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
9a90: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
9aa0: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
9ab0: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
9ac0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9ad0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9ae0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52  e,.          "OR
9af0: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
9b00: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
9b10: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
9b20: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20            iCol, 
9b30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9b40: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
9b50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9b70: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
9b80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9b90: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
9ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
9bb0: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
9bc0: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
9bd0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
9be0: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
9bf0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
9c00: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
9c10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
9c20: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
9c30: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
9c40: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
9c50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
9c60: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e  Label = sqlite3N
9c70: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
9c80: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
9c90: 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c    assert( zLabel
9ca0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
9cb0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9cc0: 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29  p(zName, zLabel)
9cd0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
9ce0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
9cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9d00: 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29  liteFree(zLabel)
9d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d20: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71  if( iCol<0 && sq
9d30: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
9d40: 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  (pE, pEList->a[j
9d50: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9d60: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
9d70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9d80: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
9d90: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
9da0: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
9db0: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
9dc0: 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61  l;.      pE->iTa
9dd0: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
9de0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
9df0: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
9e00: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c   }.    if( iCol<
9e10: 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74  0 && mustComplet
9e20: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
9e30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9e40: 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45  e,.        "ORDE
9e50: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
9e60: 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   %d does not mat
9e70: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
9e80: 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20  lumn", i+1);.   
9e90: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
9ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
9ec0: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23    .}.#endif /* #
9ed0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9ee0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9ef0: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  CT */../*.** Get
9f00: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
9f10: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
9f20: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
9f30: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
9f40: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
9f50: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f60: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
9f70: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
9f80: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
9f90: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
9fa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
9fb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9fc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
9fd0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
9fe0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
9ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
a000: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
a010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
a020: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
a030: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
a040: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
a050: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
a060: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69  ed on the.** nLi
a070: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20  mit and nOffset 
a080: 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20  fields.  nLimit 
a090: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
a0a0: 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   the integers.**
a0b0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
a0c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
a0d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
a0e0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
a0f0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
a100: 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64  s.  Or that hold
a110: 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f   -1 and 0 if tho
a120: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
a130: 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d  omitted..** iLim
a140: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
a150: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
a160: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
a170: 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f  umbers for.** co
a180: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
a190: 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
a1a0: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
a1b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
a1c0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
a1d0: 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74  set, then iLimit
a1e0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
a1f0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
a200: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
a210: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
a220: 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   if iLimit and i
a230: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
a240: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
a250: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
a260: 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  y nLimit and nOf
a270: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
a280: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
a290: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
a2a0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
a2b0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
a2c0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
a2d0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
a2e0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
a2f0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
a300: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d  .** Only if nLim
a310: 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74  it>=0 or nOffset
a320: 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  >0 do the limit 
a330: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
a340: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
a350: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
a360: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
a370: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
a380: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
a390: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
a3a0: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
a3b0: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
a3c0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
a3d0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
a3e0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
a3f0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
a400: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a410: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a  lect *p){.  /* .
a420: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70    ** If the comp
a430: 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69  arison is p->nLi
a440: 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49  mit>0 then "LIMI
a450: 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20  T 0" shows.  ** 
a460: 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73  all rows.  It is
a470: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20   the same as no 
a480: 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f  limit. If the co
a490: 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a  mparision is.  *
a4a0: 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74  * p->nLimit>=0 t
a4b0: 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68  hen "LIMIT 0" sh
a4c0: 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c  ow no rows at al
a4d0: 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  l..  ** "LIMIT -
a4e0: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
a4f0: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
a500: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
a510: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
a520: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
a530: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
a540: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
a550: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
a560: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
a570: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
a580: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
a590: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
a5a0: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
a5b0: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
a5c0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
a5d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a5e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a5f0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a600: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
a610: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a620: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
a630: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
a640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a650: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
a660: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64  iMem, 1);.    Vd
a670: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
a680: 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29   LIMIT counter")
a690: 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
a6a0: 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69   = iMem;.  }.  i
a6b0: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  f( p->nOffset>0 
a6c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  ){.    int iMem 
a6d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
a6e0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
a6f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a700: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a710: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
a720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a730: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
a740: 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  r, -p->nOffset, 
a750: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
a760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a770: 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31  emStore, iMem, 1
a780: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
a790: 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54  nt((v, "# OFFSET
a7a0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
a7b0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d   p->iOffset = iM
a7c0: 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  em;.  }.}../*.**
a7d0: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 69   Generate VDBE i
a7e0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
a7f0: 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61   will open a tra
a800: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61  nsient table tha
a810: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65  t.** will be use
a820: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  d for an index o
a830: 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64  r to store keyed
a840: 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63   results for a c
a850: 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63  ompound.** selec
a860: 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
a870: 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73  ds, open a trans
a880: 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20  ient table that 
a890: 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e  needs a.** KeyIn
a8a0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
a8b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
a8c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49  umns in the KeyI
a8d0: 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nfo is determine
a8e0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75  d.** by the resu
a8f0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a900: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
a910: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  n the second arg
a920: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65  ument..**.** Spe
a930: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
a940: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a950: 64 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64  d to open an ind
a960: 65 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20  ex table for.** 
a970: 44 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c  DISTINCT, UNION,
a980: 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45   INTERSECT and E
a990: 58 43 45 50 54 20 73 65 6c 65 63 74 20 73 74 61  XCEPT select sta
a9a0: 74 65 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74  tements (but not
a9b0: 20 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   .** UNION ALL).
a9c0: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20  .**.** Make the 
a9d0: 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41  new table a KeyA
a9e0: 73 44 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b  sData table if k
a9f0: 65 79 41 73 44 61 74 61 20 69 73 20 74 72 75 65  eyAsData is true
aa00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
aa10: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
aa20: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
aa30: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73   OP_OpenTemp ins
aa40: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  truction..*/.sta
aa50: 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70  tic int openTemp
aa60: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
aa70: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
aa80: 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65  int iTab, int ke
aa90: 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49  yAsData){.  KeyI
aaa0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
aab0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20   int nColumn;.  
aac0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
aad0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
aae0: 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  i;.  Vdbe *v = p
aaf0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
ab00: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66 28  int addr;..  if(
ab10: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
ab20: 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
ab30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ab40: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70    nColumn = p->p
ab50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
ab60: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
ab70: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
ab80: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75  *pKeyInfo)+nColu
ab90: 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  mn*sizeof(CollSe
aba0: 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65  q*) );.  if( pKe
abb0: 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  yInfo==0 ) retur
abc0: 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d  n 0;.  pKeyInfo-
abd0: 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a  >enc = db->enc;.
abe0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
abf0: 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ld = nColumn;.  
ac00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
ac10: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b  mn; i++){.    pK
ac20: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
ac30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ac40: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
ac50: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
ac60: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
ac70: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
ac80: 5d 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49  ] ){.      pKeyI
ac90: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
aca0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
acb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20     }.  }.  addr 
acc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  = sqlite3VdbeOp3
acd0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
ace0: 20 69 54 61 62 2c 20 30 2c 20 0a 20 20 20 20 20   iTab, 0, .     
acf0: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
ad00: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
ad10: 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79  DOFF);.  if( key
ad20: 41 73 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71  AsData ){.    sq
ad30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ad40: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
ad50: 69 54 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  iTab, 1);.  }.  
ad60: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
ad70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
ad90: 45 43 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  ECT./*.** Add th
ada0: 65 20 61 64 64 72 65 73 73 20 22 61 64 64 72 22  e address "addr"
adb0: 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 61   to the set of a
adc0: 6c 6c 20 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f  ll OpenTemp opco
add0: 64 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a 20  de addresses.** 
ade0: 74 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 61  that are being a
adf0: 63 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d  ccumulated in p-
ae00: 3e 70 70 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a  >ppOpenTemp..*/.
ae10: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
ae20: 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64  SelectOpenTempAd
ae30: 64 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  dr(Select *p, in
ae40: 74 20 61 64 64 72 29 7b 0a 20 20 49 64 4c 69 73  t addr){.  IdLis
ae50: 74 20 2a 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70  t *pList = *p->p
ae60: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69  pOpenTemp = sqli
ae70: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
ae80: 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20  *p->ppOpenTemp, 
ae90: 30 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  0);.  if( pList=
aea0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
aeb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
aec0: 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c   }.  pList->a[pL
aed0: 69 73 74 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20  ist->nId-1].idx 
aee0: 3d 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e  = addr;.  return
aef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
af00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
af10: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
af20: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
af30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
af40: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
af50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
af60: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
af70: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
af80: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
af90: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
afa0: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
afb0: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
afc0: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
afd0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
afe0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
aff0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
b000: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
b010: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
b020: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
b030: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
b040: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
b050: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
b060: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
b070: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
b080: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
b090: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
b0a0: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
b0b0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
b0c0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
b0d0: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
b0e0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
b0f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
b100: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
b110: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
b120: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
b130: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
b140: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
b150: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
b160: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
b170: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
b180: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b190: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
b1a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
b1b0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
b1c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b1d0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b1e0: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
b1f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b200: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
b210: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b220: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
b230: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
b240: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
b250: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
b260: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
b270: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
b280: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
b290: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
b2a0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
b2b0: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
b2c0: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
b2d0: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
b2e0: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
b2f0: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
b300: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
b310: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
b320: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
b330: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
b340: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
b350: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
b360: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
b370: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
b380: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
b390: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
b3a0: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
b3b0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
b3c0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
b3d0: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
b3e0: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
b3f0: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
b400: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
b410: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
b420: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
b430: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
b440: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
b450: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
b460: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
b470: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
b480: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
b490: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
b4a0: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
b4b0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
b4c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b4d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
b4e0: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
b4f0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
b500: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
b510: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
b520: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
b530: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
b540: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
b550: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
b560: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
b570: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
b580: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
b590: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
b5a0: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
b5b0: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
b5c0: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
b5d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
b5e0: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
b5f0: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
b600: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
b610: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
b620: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
b630: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
b640: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
b650: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
b660: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
b670: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b680: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
b690: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b6a0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
b6b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
b6c0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
b6d0: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
b6e0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f             /* \_
b700: 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20  __  Store query 
b710: 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69  results as speci
b720: 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  fied */.  int iP
b730: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
b740: 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73  /* /     by thes
b750: 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73  e two parameters
b760: 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63  .         */.  c
b770: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
b780: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
b790: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
b7a0: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
b7b0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
b7c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
b7d0: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
b7e0: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
b7f0: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
b800: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
b810: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
b820: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
b830: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
b840: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
b850: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
b860: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
b870: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f   */.  IdList *pO
b880: 70 65 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f  penTemp = 0;/* O
b890: 50 5f 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64  P_OpenTemp opcod
b8a0: 65 73 20 74 68 61 74 20 6e 65 65 64 20 61 20 4b  es that need a K
b8b0: 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20  eyInfo */.  int 
b8c0: 61 41 64 64 72 5b 35 5d 3b 20 20 20 20 20 20 20  aAddr[5];       
b8d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 6f    /* Addresses o
b8e0: 66 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20  f SetNumColumns 
b8f0: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
b900: 6e 74 20 6e 41 64 64 72 20 3d 20 30 3b 20 20 20  nt nAddr = 0;   
b910: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75       /* Number u
b920: 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  sed */.  int nCo
b930: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
b940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b950: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b960: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  t set */..  /* M
b970: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
b980: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
b990: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
b9a0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
b9b0: 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
b9c0: 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
b9d0: 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
b9e0: 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
b9f0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
ba00: 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MIT..  */.  if( 
ba10: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
ba20: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
ba30: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
ba40: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ba50: 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d   }.  pPrior = p-
ba60: 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  >pPrior;.  if( p
ba70: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
ba80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ba90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
baa0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
bab0: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
bac0: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
bad0: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
bae0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
baf0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
bb00: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bb10: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
bb20: 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  rior->nLimit>=0 
bb30: 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73  || pPrior->nOffs
bb40: 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et>0 ){.    sqli
bb50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bb60: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
bb70: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
bb80: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
bb90: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
bba0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
bbb0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
bbc0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
bbd0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
bbe0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
bbf0: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
bc00: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
bc10: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
bc20: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
bc30: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
bc40: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
bc50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
bc60: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bc70: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
bc80: 20 20 2f 2a 20 49 66 20 2a 70 20 74 68 69 73 20    /* If *p this 
bc90: 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
bca0: 74 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  t select stateme
bcb0: 6e 74 2c 20 74 68 65 6e 20 69 6e 69 74 69 61 6c  nt, then initial
bcc0: 69 7a 65 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70  ize.  ** p->ppOp
bcd0: 65 6e 54 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20  enTemp to point 
bce0: 74 6f 20 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49  to pOpenTemp.  I
bcf0: 66 20 2a 70 20 69 73 20 6e 6f 74 20 74 68 65 20  f *p is not the 
bd00: 72 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20  right most.  ** 
bd10: 73 74 61 74 65 6d 65 6e 74 20 74 68 65 6e 20 70  statement then p
bd20: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c  ->ppOpenTemp wil
bd30: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
bd40: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  een initialized.
bd50: 20 20 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20    ** by a prior 
bd60: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 73 61 6d  call to this sam
bd70: 65 20 70 72 6f 63 65 64 75 72 65 2e 20 20 50 61  e procedure.  Pa
bd80: 73 73 20 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70  ss along the pOp
bd90: 65 6e 54 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e  enTemp.  ** poin
bda0: 74 65 72 20 74 6f 20 70 50 72 69 6f 72 2c 20 74  ter to pPrior, t
bdb0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
bdc0: 74 20 74 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20  t to our left.. 
bdd0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f   */.  if( p->ppO
bde0: 70 65 6e 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  penTemp==0 ){.  
bdf0: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
be00: 3d 20 26 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20  = &pOpenTemp;.  
be10: 7d 0a 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70  }.  pPrior->ppOp
be20: 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70  enTemp = p->ppOp
be30: 65 6e 54 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72  enTemp;..  /* Cr
be40: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
be50: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
be60: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
be70: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
be80: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
be90: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
bea0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
beb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bec0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
bed0: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
bee0: 20 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3d    assert( nAddr=
bef0: 3d 30 20 29 3b 0a 20 20 20 20 61 41 64 64 72 5b  =0 );.    aAddr[
bf00: 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74  nAddr++] = sqlit
bf10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bf20: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
bf30: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
bf40: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
bf50: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
bf60: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
bf70: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
bf80: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
bf90: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
bfa0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
bfb0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
bfc0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
bfd0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
bfe0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d      pPrior->nLim
bff0: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
c000: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
c010: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
c020: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
c030: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c040: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
c050: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
c060: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
c070: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
c080: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
c090: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c0b0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
c0c0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
c0d0: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
c0e0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
c0f0: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
c100: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
c110: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
c120: 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  -1;.        p->n
c130: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c150: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c160: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
c170: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c180: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
c190: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
c1a0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c1b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c1c0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c1e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c1f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f       /* For UNIO
c200: 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20  N ALL ... ORDER 
c210: 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  BY fall through 
c220: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
c230: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
c240: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
c250: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
c260: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
c270: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
c280: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
c290: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
c2a0: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
c2b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
c2c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e   = 0;      /* On
c2d0: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
c2e0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
c2f0: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
c300: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
c310: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
c320: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
c330: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
c340: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  cts */.      int
c350: 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74   nLimit, nOffset
c360: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
c370: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
c380: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
c390: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
c3a0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54  *pOrderBy;  /* T
c3b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c3c0: 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  se for the right
c3d0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
c3e0: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
c3f0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
c400: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
c410: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
c420: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
c430: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
c440: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
c450: 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20   p->nLimit<0 && 
c460: 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b  p->nOffset==0 ){
c470: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
c480: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
c490: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
c4a0: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
c4b0: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
c4c0: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
c4d0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
c4e0: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
c4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c500: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
c510: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
c520: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
c530: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
c540: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
c550: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
c560: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
c570: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
c580: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
c5a0: 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20  pOrderBy .      
c5b0: 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62    && matchOrderb
c5c0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
c5d0: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
c5e0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29  , unionTab, 1) )
c5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
c600: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
c610: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c620: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
c630: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
c640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c650: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75  , OP_OpenTemp, u
c660: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
c670: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
c680: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
c690: 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
c6a0: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
c6b0: 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (p, addr);.     
c6c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c6d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c6e0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c6f0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c720: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
c730: 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31  ata, unionTab, 1
c740: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 09 61 73  );.        }..as
c750: 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65  sert( nAddr<size
c760: 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66  of(aAddr)/sizeof
c770: 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20  (aAddr[0]) );.  
c780: 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64        aAddr[nAdd
c790: 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  r++] = sqlite3Vd
c7a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
c7b0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69  tNumColumns, uni
c7c0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
c7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
c7e0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
c7f0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c800: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c810: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
c820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c830: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
c840: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
c850: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c860: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
c870: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
c880: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
c890: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
c8a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c8b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c8c0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
c8d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
c8e0: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
c8f0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
c900: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
c910: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
c920: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
c930: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
c940: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
c950: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
c960: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
c970: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
c980: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
c990: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
c9a0: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
c9b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c9c0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
c9d0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   0;.      pOrder
c9e0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
c9f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
ca00: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  rBy = 0;.      n
ca10: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
ca20: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
ca30: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
ca40: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
ca50: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
ca60: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
ca70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
ca80: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
ca90: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
caa0: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
cab0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
cac0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
cad0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
cae0: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  By;.      p->nLi
caf0: 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  mit = nLimit;.  
cb00: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
cb10: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   nOffset;.      
cb20: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->iLimit = -1;.
cb30: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
cb40: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28   = -1;.      if(
cb50: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
cb60: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
cb70: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
cb80: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
cb90: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
cba0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cbb0: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
cbc0: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
cbd0: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
cbe0: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
cbf0: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
cc00: 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72  if( eDest!=prior
cc10: 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
cc20: 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  iParm ){.       
cc30: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
cc40: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
cc50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
cc60: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
cc70: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
cc80: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
cc90: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
cca0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
ccb0: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
ccc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ccd0: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
cce0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ccf0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
cd00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
cd10: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
cd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
cd40: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
cd50: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
cd60: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
cd70: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
cd80: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
cd90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
cda0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
cdb0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
cdc0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
cdd0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
cde0: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
cdf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
ce20: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
ce30: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
ce60: 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
ce70: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ce80: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
ce90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
cea0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ceb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cec0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ced0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
cee0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
cef0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cf00: 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
cf10: 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
cf20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
cf30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
cf40: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
cf50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cf60: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
cf70: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
cf80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
cf90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cfa0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
cfb0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
cfc0: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
cfd0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
cfe0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  Start;.      int
cff0: 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74   nLimit, nOffset
d000: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
d010: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
d020: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
d030: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
d040: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
d050: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
d060: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d070: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
d080: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
d090: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
d0a0: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
d0b0: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
d0c0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
d0d0: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
d0e0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d0f0: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
d100: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d110: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
d120: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
d130: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
d140: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
d150: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
d160: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
d170: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d180: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
d190: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d1b0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
d1c0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b1, 0);.      rc
d1d0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
d1e0: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
d1f0: 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
d200: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d210: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d220: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d250: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
d260: 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  ab1, 1);.      a
d270: 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a  ssert( nAddr<siz
d280: 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f  eof(aAddr)/sizeo
d290: 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20  f(aAddr[0]) );. 
d2a0: 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72       aAddr[nAddr
d2b0: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
d2c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
d2d0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 31  NumColumns, tab1
d2e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
d2f0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d300: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d310: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
d320: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
d330: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d340: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
d350: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d360: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d370: 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e  Prior, SRT_Union
d380: 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c  , tab1, 0, 0, 0,
d390: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
d3a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d3b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d3c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d3d0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d3e0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
d3f0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d400: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
d410: 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
d420: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d430: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
d440: 70 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  p, tab2, 0);.   
d450: 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
d460: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
d470: 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  p, addr);.      
d480: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d490: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
d4a0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d4b0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
d4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4d0: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
d4e0: 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20  ta, tab2, 1);.  
d4f0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 64 64      assert( nAdd
d500: 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f  r<sizeof(aAddr)/
d510: 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29  sizeof(aAddr[0])
d520: 20 29 3b 0a 20 20 20 20 20 20 61 41 64 64 72 5b   );.      aAddr[
d530: 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74  nAddr++] = sqlit
d540: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d550: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
d560: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
d570: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
d580: 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70        nLimit = p
d590: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->nLimit;.      
d5a0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->nLimit = -1;.
d5b0: 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20        nOffset = 
d5c0: 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->nOffset;.    
d5d0: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
d5e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d5f0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d600: 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  e, p, SRT_Union,
d610: 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20   tab2, 0, 0, 0, 
d620: 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  aff);.      p->p
d630: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
d640: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
d650: 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
d660: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66  p->nOffset = nOf
d670: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
d680: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d690: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d6a0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d6b0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
d6c0: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
d6d0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
d6e0: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
d6f0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
d700: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
d710: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d720: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
d730: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
d740: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
d750: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
d760: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
d770: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
d780: 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
d790: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d7a0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d7b0: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
d7c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d7d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d7e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7f0: 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
d800: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d  reak);.      com
d810: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
d820: 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
d830: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
d840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d850: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
d860: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
d870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d880: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
d890: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
d8a0: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
d8b0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d8c0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
d8d0: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
d8e0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
d910: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
d920: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
d950: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d960: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d970: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
d980: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d9a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d9b0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
d9c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d9d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d9e0: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
d9f0: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
da00: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
da10: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
da20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
da40: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
da50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da60: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
da70: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
da80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
da90: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
daa0: 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
dab0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
dac0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
dad0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
dae0: 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
daf0: 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
db00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
db10: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
db20: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
db30: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
db40: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
db50: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
db60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
db70: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
db80: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
db90: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
dba0: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
dbb0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
dbc0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
dbd0: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
dbe0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
dbf0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
dc00: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
dc10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
dc20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
dc30: 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  umns in temporar
dc40: 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  y tables.  */.  
dc50: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
dc60: 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  ->nExpr;.  while
dc70: 28 20 6e 41 64 64 72 3e 30 20 29 7b 0a 20 20 20  ( nAddr>0 ){.   
dc80: 20 6e 41 64 64 72 2d 2d 3b 0a 20 20 20 20 73 71   nAddr--;.    sq
dc90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
dca0: 32 28 76 2c 20 61 41 64 64 72 5b 6e 41 64 64 72  2(v, aAddr[nAddr
dcb0: 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
dcc0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
dcd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
dce0: 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
dcf0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
dd00: 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
dd10: 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
dd20: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
dd30: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
dd40: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
dd50: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
dd60: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
dd70: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
dd80: 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
dd90: 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
dda0: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
ddb0: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
ddc0: 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
ddd0: 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
dde0: 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
ddf0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
de00: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
de10: 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
de20: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
de30: 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
de40: 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
de50: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
de60: 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
de70: 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
de80: 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
de90: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
dea0: 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
deb0: 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
dec0: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
ded0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20   p->pOrderBy || 
dee0: 28 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 70 4f  (pOpenTemp && pO
def0: 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29 20  penTemp->nId>0) 
df00: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
df30: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
df40: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
df50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
df60: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
df70: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
df80: 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
df90: 74 28 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  t( p->ppOpenTemp
dfa0: 20 3d 3d 20 26 70 4f 70 65 6e 54 65 6d 70 20 29   == &pOpenTemp )
dfb0: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
dfc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
dfd0: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
dfe0: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  nCol*sizeof(Coll
dff0: 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  Seq*));.    if( 
e000: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
e010: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e020: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e030: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e040: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
e050: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50  eyInfo->enc = pP
e060: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
e070: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
e080: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
e090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
e0a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4b  ; i++){.      pK
e0b0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
e0c0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
e0d0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
e0e0: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   i);.      if( !
e0f0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
e100: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i] ){.        pK
e110: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
e120: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
e130: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
e140: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
e150: 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70 20  (i=0; pOpenTemp 
e160: 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e  && i<pOpenTemp->
e170: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nId; i++){.     
e180: 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28 69   int p3type = (i
e190: 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ==0?P3_KEYINFO_H
e1a0: 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e 46  ANDOFF:P3_KEYINF
e1b0: 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  O);.      int ad
e1c0: 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d 3e  dr = pOpenTemp->
e1d0: 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20  a[i].idx;.      
e1e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e1f0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
e200: 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70  ar *)pKeyInfo, p
e210: 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  3type);.    }.. 
e220: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
e230: 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
e240: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e250: 20 2a 70 4f 72 64 65 72 42 79 54 65 72 6d 20 3d   *pOrderByTerm =
e260: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
e270: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e280: 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
e290: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 72 64 65  Expr; i++, pOrde
e2a0: 72 42 79 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  rByTerm++){.    
e2b0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e2c0: 3d 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e  = pOrderByTerm->
e2d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63  pExpr;.        c
e2e0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72  har *zName = pOr
e2f0: 64 65 72 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65  derByTerm->zName
e300: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e310: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e320: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
e330: 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b  >iColumn<nCol );
e340: 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65  .        /* asse
e350: 72 74 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c  rt( !pExpr->pCol
e360: 6c 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  l ); */.        
e370: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
e380: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
e390: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
e3a0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
e3b0: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  e, zName, -1);. 
e3c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e3d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
e3e0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
e3f0: 3e 61 43 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43  >aColl[pExpr->iC
e400: 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20  olumn];.        
e410: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e420: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
e430: 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
e440: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
e450: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
e460: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
e470: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
e480: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
e490: 6e 73 20 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  ns for UNION ALL
e4a0: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f   ... ORDER BY */
e4b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
e4c0: 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  e(pKeyInfo);.   
e4d0: 20 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65   }.  }..multi_se
e4e0: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20  lect_end:.  if( 
e4f0: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
e500: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
e510: 6c 65 74 65 28 70 4f 70 65 6e 54 65 6d 70 29 3b  lete(pOpenTemp);
e520: 0a 20 20 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e  .  }.  p->ppOpen
e530: 54 65 6d 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  Temp = 0;.  retu
e540: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e550: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e560: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e570: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e580: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
e590: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
e5a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
e5b0: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
e5c0: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
e5d0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
e5e0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
e5f0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
e600: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
e610: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
e620: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
e630: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
e640: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
e650: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
e660: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e670: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
e680: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
e690: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
e6a0: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
e6b0: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
e6c0: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
e6d0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
e6e0: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
e6f0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
e700: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
e710: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
e720: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
e730: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
e740: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
e750: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
e760: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
e770: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
e780: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
e790: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
e7a0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
e7b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
e7c0: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
e7d0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e7e0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
e7f0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e800: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
e810: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
e820: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
e830: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
e840: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
e850: 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
e860: 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
e870: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
e880: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e890: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
e8a0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
e8b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
e8c0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
e8d0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e8e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e8f0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
e900: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
e910: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
e920: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
e930: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
e940: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
e950: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
e960: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
e970: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
e980: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
e990: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
e9a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e9b0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
e9c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
e9d0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
e9e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
e9f0: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
ea00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
ea10: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
ea20: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
ea30: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
ea40: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
ea50: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
ea60: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
ea70: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
ea80: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
ea90: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
eaa0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
eab0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
eac0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
ead0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
eae0: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
eaf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eb00: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
eb10: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
eb20: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
eb30: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
eb40: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
eb50: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
eb60: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
eb70: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
eb80: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
eb90: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
eba0: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
ebb0: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
ebc0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
ebd0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
ebe0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
ebf0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
ec00: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
ec10: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
ec20: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
ec30: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
ec40: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
ec50: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
ec60: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
ec70: 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
ec80: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53  ist);.    substS
ec90: 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65  elect(pExpr->pSe
eca0: 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
ecb0: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
ecc0: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
ecd0: 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
ece0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
ecf0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
ed00: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
ed10: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
ed20: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
ed30: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  EList){.  int i;
ed40: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ed50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ed60: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
ed70: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
ed80: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
ed90: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
eda0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
edb0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
edc0: 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63  ubstSelect(Selec
edd0: 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  t *p, int iTable
ede0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
edf0: 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20  st){.  if( !p ) 
ee00: 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
ee10: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
ee20: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
ee30: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
ee40: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
ee50: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ee60: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
ee70: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
ee80: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
ee90: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
eea0: 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
eeb0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
eec0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
eed0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
eee0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
eef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ef00: 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e  T_VIEW) */..#ifn
ef10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ef20: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  VIEW./*.** This 
ef30: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
ef40: 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
ef50: 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
ef60: 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
ef70: 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
ef80: 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
ef90: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
efa0: 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
efb0: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
efc0: 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
efd0: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
efe0: 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
eff0: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
f000: 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
f010: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
f020: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
f030: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
f040: 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
f050: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
f060: 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
f070: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
f080: 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
f090: 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
f0a0: 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
f0b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
f0c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
f0d0: 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
f0e0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f0f0: 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
f100: 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
f110: 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
f120: 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
f130: 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
f140: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
f150: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
f160: 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
f170: 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
f180: 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
f190: 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
f1a0: 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
f1b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f1c0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
f1d0: 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
f1e0: 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
f1f0: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
f200: 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
f210: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
f220: 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
f230: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
f240: 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
f250: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
f260: 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
f270: 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
f280: 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
f290: 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
f2a0: 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
f2b0: 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
f2c0: 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
f2d0: 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
f2e0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
f2f0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
f300: 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
f310: 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
f320: 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
f330: 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
f340: 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
f350: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
f360: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
f370: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
f380: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
f390: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
f3a0: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
f3b0: 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
f3c0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
f3d0: 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
f3e0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f3f0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
f400: 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
f410: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
f420: 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
f430: 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
f440: 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
f450: 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
f460: 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
f470: 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
f480: 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
f490: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
f4a0: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
f4b0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
f4c0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
f4d0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
f4e0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
f4f0: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
f500: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f510: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
f520: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
f530: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
f540: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
f550: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
f560: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
f570: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
f580: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
f590: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
f5a0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
f5b0: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
f5c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
f5d0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f5e0: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
f5f0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f600: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
f610: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
f620: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
f630: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
f640: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f650: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
f660: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
f670: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
f680: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
f690: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
f6a0: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
f6b0: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
f6c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
f6d0: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
f6e0: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
f6f0: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
f700: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
f710: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
f720: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
f730: 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
f740: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
f750: 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
f760: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
f770: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
f780: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
f790: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
f7a0: 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
f7b0: 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  50).**.** In thi
f7c0: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
f7d0: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
f7e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
f7f0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
f800: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f810: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
f820: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
f830: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
f840: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
f850: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
f860: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
f870: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
f880: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
f890: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
f8a0: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
f8b0: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
f8c0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f8d0: 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
f8e0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
f8f0: 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
f900: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f910: 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
f920: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f930: 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
f940: 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
f950: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
f960: 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
f970: 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
f980: 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
f990: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
f9a0: 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
f9b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f9c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
f9d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
f9e0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
f9f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
fa00: 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
fa10: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
fa20: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
fa30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
fa40: 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
fa50: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
fa60: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
fa70: 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
fa80: 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
fa90: 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
faa0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
fab0: 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
fac0: 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
fad0: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
fae0: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
faf0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
fb00: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
fb10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
fb20: 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
fb30: 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
fb40: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
fb50: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
fb60: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
fb70: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
fb80: 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
fb90: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
fba0: 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
fbb0: 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
fbc0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
fbd0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
fbe0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
fbf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
fc00: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
fc10: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
fc20: 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
fc30: 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
fc40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
fc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fc60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fc70: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
fca0: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
fcb0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
fcc0: 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
fcd0: 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20  e subquery */.. 
fce0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
fcf0: 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
fd00: 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
fd10: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
fd20: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
fd30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
fd40: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
fd50: 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
fd60: 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
fd70: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
fd80: 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
fd90: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70  c->a[iFrom];.  p
fda0: 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
fdb0: 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
fdc0: 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
fdd0: 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
fde0: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
fdf0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62  urn 0;.  if( sub
fe00: 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
fe10: 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
fe20: 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63  urn 0;.  pSubSrc
fe30: 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
fe40: 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
fe50: 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72   );.  if( pSubSr
fe60: 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
fe70: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53  urn 0;.  if( (pS
fe80: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
fe90: 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d  | pSub->nLimit>=
fea0: 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53  0) &&  (pSrc->nS
feb0: 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
fec0: 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
fed0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69  .  }.  if( (p->i
fee0: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e  sDistinct || p->
fef0: 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75  nLimit>=0) && su
ff00: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
ff10: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
ff20: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
ff30: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
ff40: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65  turn 0;..  /* Re
ff50: 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
ff60: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
ff70: 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
ff80: 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
ff90: 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
ffa0: 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
ffb0: 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
ffc0: 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
ffd0: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
ffe0: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
fff0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
10000 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
10010 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
10020 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
10030 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
10040 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
10050 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
10060 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
10070 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
10080 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
10090 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
100a0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
100b0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
100c0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
100d0 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28   && iFrom>0 && (
100e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d  pSrc->a[iFrom-1]
100f0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
10100 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
10110 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
10120 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
10130 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
10140 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
10150 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
10160 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
10170 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
10180 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
10190 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
101a0 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
101b0 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
101c0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
101d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
101e0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
101f0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
10200 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
10210 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
10220 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
10230 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
10240 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
10250 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
10260 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
10270 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
10280 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
10290 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
102a0 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
102b0 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
102c0 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
102d0 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
102e0 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
102f0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
10300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f  .  */.  if( iFro
10310 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b  m>0 && (pSrc->a[
10320 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70  iFrom-1].jointyp
10330 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
10340 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d   .      && pSub-
10350 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
10360 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10370 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
10380 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
10390 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
103a0 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
103b0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
103c0 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
103d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
103e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
103f0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
10400 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
10410 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
10420 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
10430 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
10440 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10450 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
10460 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
10470 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
10480 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
10490 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
104a0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
104b0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
104c0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
104d0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
104e0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
104f0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
10500 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
10510 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
10520 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
10530 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
10540 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
10550 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
10560 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
10570 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
10580 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
10590 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
105a0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
105b0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
105c0 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
105d0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  em->iCursor;.  {
105e0 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
105f0 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
10600 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
10610 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
10620 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 54 61 62  ointype;.    Tab
10630 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 75 62 69  le *pTab = pSubi
10640 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20  tem->pTab;..    
10650 69 66 28 20 70 54 61 62 20 26 26 20 70 54 61 62  if( pTab && pTab
10660 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
10670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10680 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75  leteTable(0, pSu
10690 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  bitem->pTab);.  
106a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
106b0 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  ee(pSubitem->zDa
106c0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
106d0 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
106e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
106f0 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65  liteFree(pSubite
10700 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
10710 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
10720 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61  .      int extra
10730 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a   = nSubSrc - 1;.
10740 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
10750 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
10760 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73          pSrc = s
10770 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
10780 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b  end(pSrc, 0, 0);
10790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
107a0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
107b0 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d       for(i=pSrc-
107c0 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61  >nSrc-1; i-extra
107d0 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20  >=iFrom; i--){. 
107e0 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69         pSrc->a[i
107f0 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78  ] = pSrc->a[i-ex
10800 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra];.      }.  
10810 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
10820 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
10830 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  {.      pSrc->a[
10840 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
10850 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
10860 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
10870 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
10880 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
10890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
108a0 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72  ->a[iFrom+nSubSr
108b0 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  c-1].jointype = 
108c0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20  jointype;.  }.. 
108d0 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
108e0 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
108f0 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
10900 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
10910 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
10920 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
10930 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
10940 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78  y..  ** .  ** Ex
10950 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
10960 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
10970 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
10980 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
10990 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
109a0 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20  ERE a>b;.  **   
109b0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
109c0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
109d0 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
109e0 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
109f0 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f     /.  **    \__
10a00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10a10 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
10a20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10a30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10a40 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f    **.  ** We loo
10a50 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
10a60 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
10a70 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
10a80 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
10a90 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
10aa0 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
10ab0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
10ac0 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
10ad0 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
10ae0 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  */.  substExprLi
10af0 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50  st(p->pEList, iP
10b00 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
10b10 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ist);.  pList = 
10b20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  p->pEList;.  for
10b30 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
10b40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
10b50 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
10b60 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
10b70 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
10b80 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
10b90 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
10ba0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  !=0 ){.      pLi
10bb0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
10bc0 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
10bd0 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
10be0 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
10bf0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
10c00 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74  Agg ){.    subst
10c10 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
10c20 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
10c30 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
10c40 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
10c50 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
10c60 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
10c70 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
10c80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10c90 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
10ca0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  rBy==0 );.    p-
10cb0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
10cc0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
10cd0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
10ce0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
10cf0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
10d00 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
10d10 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  (p->pOrderBy, iP
10d20 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
10d30 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
10d40 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
10d50 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
10d60 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62  ite3ExprDup(pSub
10d70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c  ->pWhere);.  }el
10d80 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  se{.    pWhere =
10d90 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75   0;.  }.  if( su
10da0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
10db0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
10dc0 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
10dd0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  p->pHaving = p->
10de0 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70  pWhere;.    p->p
10df0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
10e00 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
10e10 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
10e20 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10e30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
10e40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
10e50 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71  d(p->pHaving, sq
10e60 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
10e70 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
10e80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
10e90 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
10ea0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
10eb0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10ec0 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29  (pSub->pGroupBy)
10ed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
10ee0 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
10ef0 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
10f00 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
10f10 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
10f20 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57  te3ExprAnd(p->pW
10f30 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
10f40 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
10f50 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
10f60 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
10f70 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
10f80 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
10f90 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
10fa0 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
10fb0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
10fc0 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
10fd0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
10fe0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
10ff0 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  limit expression
11000 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
11010 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a  ry to the outer.
11020 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f    ** query..  */
11030 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69  .  if( pSub->nLi
11040 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  mit>=0 ){.    if
11050 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b  ( p->nLimit<0 ){
11060 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
11070 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b   = pSub->nLimit;
11080 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11090 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66  ->nLimit+p->nOff
110a0 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d  set > pSub->nLim
110b0 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  it+pSub->nOffset
110c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
110d0 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
110e0 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73  it + pSub->nOffs
110f0 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et - p->nOffset;
11100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
11110 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d  nOffset += pSub-
11120 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20  >nOffset;..  /* 
11130 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
11140 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
11150 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
11160 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
11170 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
11180 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
11190 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
111a0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
111b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
111c0 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  W */../*.** Anal
111d0 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
111e0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
111f0 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
11200 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
11210 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
11220 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
11230 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
11240 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
11250 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
11260 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
11270 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
11280 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
11290 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
112a0 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
112b0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
112c0 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
112d0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
112e0 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
112f0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
11300 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
11310 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
11320 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
11330 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
11340 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
11350 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
11360 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
11370 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
11380 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
11390 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
113a0 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
113b0 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
113c0 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
113d0 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
113e0 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
113f0 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
11400 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
11410 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
11420 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
11430 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
11440 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
11450 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
11460 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
11470 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
11480 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
11490 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
114a0 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
114b0 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
114c0 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
114d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a  qlite3Select()..
114e0 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
114f0 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
11500 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
11510 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
11520 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
11530 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
11540 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
11550 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
11560 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
11570 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
11580 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
11590 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
115a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
115b0 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
115c0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
115d0 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
115e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
115f0 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
11600 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
11610 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
11620 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
11630 2a 70 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65  *pSrc;..  /* Che
11640 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
11650 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
11660 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11670 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
11680 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
11690 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
116a0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
116b0 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
116c0 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
116d0 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
116e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
116f0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
11700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c   return 0;.  pEL
11710 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
11720 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
11730 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
11740 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45   0;.  pExpr = pE
11750 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11760 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
11770 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
11780 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
11790 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
117a0 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
117b0 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
117c0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
117d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
117e0 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
117f0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
11800 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
11810 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
11820 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
11830 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
11840 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
11850 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
11860 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
11870 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
11880 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
11890 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
118a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
118b0 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    pExpr = pList-
118c0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
118d0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
118e0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
118f0 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
11900 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
11910 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
11920 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
11930 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
11940 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
11950 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
11960 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
11970 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
11980 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
11990 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
119a0 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
119b0 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
119c0 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
119d0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
119e0 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
119f0 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
11a00 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
11a10 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
11a20 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
11a30 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
11a40 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
11a50 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
11a60 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
11a70 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
11a80 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11a90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11ab0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
11ac0 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  r);.    for(pIdx
11ad0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
11ae0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
11af0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
11b00 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
11b10 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn>=1 );.      
11b20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
11b30 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70  mn[0]==iCol && p
11b40 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
11b50 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62  ll[0]==pColl ) b
11b60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11b70 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
11b80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
11b90 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
11ba0 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
11bb0 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20  ll be using the 
11bc0 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
11bd0 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
11be0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
11bf0 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
11c00 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
11c10 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68  ry cell..  ** Th
11c20 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68  e column names h
11c30 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11c40 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
11c50 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
11c60 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  on..  */.  v = s
11c70 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11c80 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11c90 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
11ca0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
11cb0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
11cc0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
11cd0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
11ce0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
11cf0 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
11d00 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
11d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11d20 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
11d30 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
11d40 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11d50 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
11d60 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  s, iParm, 1);.  
11d70 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
11d80 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
11d90 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
11da0 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
11db0 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
11dc0 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
11dd0 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
11de0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
11df0 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
11e00 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
11e10 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
11e20 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
11e30 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
11e40 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
11e50 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
11e60 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
11e70 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
11e80 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
11e90 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ma(pParse, pTab-
11ea0 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20  >iDb);.  base = 
11eb0 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
11ec0 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  or;.  computeLim
11ed0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
11ee0 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53  se, p);.  if( pS
11ef0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
11f00 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
11f10 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65  e3OpenTableForRe
11f20 61 64 69 6e 67 28 76 2c 20 62 61 73 65 2c 20 70  ading(v, base, p
11f30 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74  Tab);.  }.  cont
11f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11f50 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
11f60 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
11f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f80 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
11f90 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
11fa0 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75      /* Even thou
11fb0 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  gh the cursor us
11fc0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69  ed to open the i
11fd0 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f  ndex here is clo
11fe0 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f  sed.    ** as so
11ff0 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76  on as a single v
12000 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72 65  alue has been re
12010 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f  ad from it, allo
12020 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75  cate it.    ** u
12030 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54  sing (pParse->nT
12040 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74  ab++) to prevent
12050 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20 66   the cursor id f
12060 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a  rom being .    *
12070 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20 69  * reused. This i
12080 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  s important for 
12090 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68  statements of th
120a0 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22  e form .    ** "
120b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45  INSERT INTO x SE
120c0 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20  LECT max() FROM 
120d0 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  x"..    */.    i
120e0 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 69 49 64  nt iIdx;.    iId
120f0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
12100 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
12110 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
12120 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44  nteger, pIdx->iD
12130 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
12140 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
12150 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20  OpenRead, iIdx, 
12160 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20  pIdx->tnum,.    
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12180 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79  char*)&pIdx->key
12190 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
121a0 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f  );.    if( seekO
121b0 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a  p==OP_Rewind ){.
121c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
121d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
121e0 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
121f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12200 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
12210 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ord, 1, 0);.    
12220 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f    seekOp = OP_Mo
12230 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  veGt;.    }.    
12240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12250 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78  (v, seekOp, iIdx
12260 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12270 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12280 5f 49 64 78 52 65 63 6e 6f 2c 20 69 49 64 78 2c  _IdxRecno, iIdx,
12290 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
122a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
122b0 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b  Close, iIdx, 0);
122c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
122d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
122e0 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Ge, base, 0);.  
122f0 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20  }.  eList.nExpr 
12300 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  = 1;.  memset(&e
12310 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a  ListItem, 0, siz
12320 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b  eof(eListItem));
12330 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c  .  eList.a = &eL
12340 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74  istItem;.  eList
12350 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  .a[0].pExpr = pE
12360 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  xpr;.  selectInn
12370 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
12380 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , &eList, 0, 0, 
12390 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
123a0 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c  arm, cont, cont,
123b0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
123c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
123d0 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
123e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
123f0 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30  P_Close, base, 0
12400 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31  );.  .  return 1
12410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
12420 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
12430 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
12440 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  se in a SELECT s
12450 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
12460 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
12470 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
12480 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42  **.** An ORDER B
12490 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73  Y or GROUP BY is
124a0 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
124b0 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20  ssions.  If any 
124c0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
124d0 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
124e0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20  tant, then that 
124f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
12500 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a  placed by the.**
12510 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65   corresponding e
12520 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73 75  ntry in the resu
12530 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
12540 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64  c int processOrd
12550 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d  erGroupBy(.  Nam
12560 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
12570 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
12580 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  xt of the SELECT
12590 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
125a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
125b0 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy,   /* The OR
125c0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
125d0 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  BY clause to be 
125e0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63  processed */.  c
125f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
12600 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22       /* Either "
12610 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50  ORDER" or "GROUP
12620 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
12630 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
12640 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
12650 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
12660 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  t;     /* The re
12670 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
12680 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73  SELECT */.  Pars
12690 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
126a0 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20  >pParse;     /* 
126b0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
126c0 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a  f the SELECT */.
126d0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
126e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65   );..  if( pOrde
126f0 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
12700 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
12710 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
12720 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
12730 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Col;.    Expr *p
12740 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
12750 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
12760 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
12770 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
12780 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
12790 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
127a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
127b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
127c0 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
127d0 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64         pE = pOrd
127e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
127f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
12800 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  p(pEList->a[iCol
12810 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
12820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12830 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12840 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
12850 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75       "%s BY colu
12860 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74  mn number %d out
12870 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
12880 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
12890 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
128a0 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43  d %d", zType, iC
128b0 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
128c0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
128d0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
128e0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
128f0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
12900 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a  mes(pNC, pE) ){.
12910 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
12920 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
12930 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
12940 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
12950 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12960 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12970 20 20 20 22 25 73 20 42 59 20 74 65 72 6d 73 20     "%s BY terms 
12980 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d  must not be non-
12990 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
129a0 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20  s", zType);.    
129b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
129c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
129d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
129e0 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73  routine resolves
129f0 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20   any names used 
12a00 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
12a10 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70  t of the.** supp
12a20 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61 74  lied SELECT stat
12a30 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45  ement. If the SE
12a40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
12a50 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a  eing resolved.**
12a60 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
12a70 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20  , then pOuterNC 
12a80 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
12a90 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  the NameContext 
12aa0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e  .** of the paren
12ab0 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74  t SELECT..*/.int
12ac0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
12ad0 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a  solve(.  Parse *
12ae0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12af0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
12b00 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12b10 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12b20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
12b30 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
12b40 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
12b50 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
12b60 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20  C  /* The outer 
12b70 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61  name context. Ma
12b80 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b  y be NULL. */.){
12b90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
12ba0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
12bb0 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   Result set. */.
12bc0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12be0 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c  For-loop variabl
12bf0 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70  e used in multip
12c00 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e  le places */.  N
12c10 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
12c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
12c30 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
12c40 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
12c50 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
12c60 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20   before, return 
12c70 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a  immediately. */.
12c80 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c    if( p->isResol
12c90 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ved ){.    asser
12ca0 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a  t( !pOuterNC );.
12cb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12cc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  E_OK;.  }.  p->i
12cd0 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a  sResolved = 1;..
12ce0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
12cf0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
12d00 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69  errors, do nothi
12d10 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ng. */.  if( pPa
12d20 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
12d30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12d40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
12d50 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65  * Prepare the se
12d60 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  lect statement. 
12d70 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
12d80 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73  llocate all curs
12d90 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ors.  ** require
12da0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
12db0 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75  tables and subqu
12dc0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
12dd0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  M clause..  */. 
12de0 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
12df0 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  tmt(pParse, p) )
12e00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12e10 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
12e20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
12e30 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  local name-conte
12e40 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78  xt to pass to Ex
12e50 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
12e60 2e 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 4e 65 78  .  */.  sNC.pNex
12e70 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20  t = pOuterNC;.  
12e80 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
12e90 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  rse;.  sNC.pSrcL
12ea0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
12eb0 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
12ec0 31 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20  1;.  sNC.hasAgg 
12ed0 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20  = 0;.  sNC.nErr 
12ee0 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20  = 0;.  sNC.nRef 
12ef0 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73  = 0;.  sNC.pELis
12f00 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4e 61 6d  t = 0;..  /* Nam
12f10 65 43 6f 6e 74 65 78 74 2e 6e 44 65 70 74 68 20  eContext.nDepth 
12f20 73 74 6f 72 65 73 20 74 68 65 20 64 65 70 74 68  stores the depth
12f30 20 6f 66 20 72 65 63 75 72 73 69 6f 6e 20 66 6f   of recursion fo
12f40 72 20 74 68 69 73 20 71 75 65 72 79 2e 20 46 6f  r this query. Fo
12f50 72 0a 20 20 2a 2a 20 61 6e 20 6f 75 74 65 72 20  r.  ** an outer 
12f60 71 75 65 72 79 20 28 65 2e 67 2e 20 53 45 4c 45  query (e.g. SELE
12f70 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
12f80 5f 6d 61 73 74 65 72 29 20 74 68 69 73 20 69 73  _master) this is
12f90 20 31 2e 20 46 6f 72 0a 20 20 2a 2a 20 61 20 73   1. For.  ** a s
12fa0 75 62 71 75 65 72 79 20 69 74 20 69 73 20 32 2e  ubquery it is 2.
12fb0 20 46 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   For a subquery 
12fc0 6f 66 20 61 20 73 75 62 71 75 65 72 79 2c 20 33  of a subquery, 3
12fd0 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 0a 20 20  . And so on. .  
12fe0 2a 2a 20 50 61 72 73 65 2e 6e 4d 61 78 44 65 70  ** Parse.nMaxDep
12ff0 74 68 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  th is the maximu
13000 6d 20 64 65 70 74 68 20 66 6f 72 20 61 6e 79 20  m depth for any 
13010 73 75 62 71 75 65 72 79 20 72 65 73 6f 6c 76 65  subquery resolve
13020 64 20 73 6f 0a 20 20 2a 2a 20 66 61 72 2e 20 54  d so.  ** far. T
13030 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
13040 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d  etermine the num
13050 62 65 72 20 6f 66 20 61 67 67 72 65 67 61 74 65  ber of aggregate
13060 20 63 6f 6e 74 65 78 74 73 0a 20 20 2a 2a 20 72   contexts.  ** r
13070 65 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69  equired at runti
13080 6d 65 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 6e  me..  */.  sNC.n
13090 44 65 70 74 68 20 3d 20 28 70 4f 75 74 65 72 4e  Depth = (pOuterN
130a0 43 3f 70 4f 75 74 65 72 4e 43 2d 3e 6e 44 65 70  C?pOuterNC->nDep
130b0 74 68 2b 31 3a 31 29 3b 0a 20 20 69 66 28 20 73  th+1:1);.  if( s
130c0 4e 43 2e 6e 44 65 70 74 68 3e 70 50 61 72 73 65  NC.nDepth>pParse
130d0 2d 3e 6e 4d 61 78 44 65 70 74 68 20 29 7b 0a 20  ->nMaxDepth ){. 
130e0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44     pParse->nMaxD
130f0 65 70 74 68 20 3d 20 73 4e 43 2e 6e 44 65 70 74  epth = sNC.nDept
13100 68 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  h;.  }..  /* Res
13110 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
13120 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
13130 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
13140 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45  EList;.  if( !pE
13150 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  List ) return SQ
13160 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f  LITE_ERROR;.  fo
13170 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
13180 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13190 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c    Expr *pX = pEL
131a0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
131b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
131c0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
131d0 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
131e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
13200 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
13210 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
13220 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
13230 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
13240 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
13250 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
13260 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
13270 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
13280 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
13290 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
132a0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
132b0 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Agg );.  if( p->
132c0 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e  pGroupBy || sNC.
132d0 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d  hasAgg ){.    p-
132e0 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65  >isAgg = 1;.  }e
132f0 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c  lse{.    sNC.all
13300 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  owAgg = 0;.  }..
13310 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47    /* If a HAVING
13320 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
13330 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  nt, then there m
13340 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42  ust be a GROUP B
13350 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  Y clause..  */. 
13360 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
13370 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  && !p->pGroupBy 
13380 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13390 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
133a0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
133b0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
133c0 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
133d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
133e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
133f0 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73  * Add the expres
13400 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  sion list to the
13410 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65   name-context be
13420 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65  fore parsing the
13430 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72  .  ** other expr
13440 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53  essions in the S
13450 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
13460 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
13470 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
13480 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
13490 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e  lause (etc.) can
134a0 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73   refer to expres
134b0 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c  sions by.  ** al
134c0 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73  iases in the res
134d0 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ult set..  **.  
134e0 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20  ** Minor point: 
134f0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
13500 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ase, then the ex
13510 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65  pression will be
13520 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74  .  ** re-evaluat
13530 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
13540 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a  rence to it..  *
13550 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d  /.  sNC.pEList =
13560 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
13570 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
13580 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
13590 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20  p->pWhere) ||.  
135a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52      sqlite3ExprR
135b0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
135c0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c  , p->pHaving) ||
135d0 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72  .      processOr
135e0 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
135f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
13600 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20  RDER") ||.      
13610 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
13620 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 47 72  pBy(&sNC, p->pGr
13630 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a  oupBy, "GROUP").
13640 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
13650 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13660 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
13670 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13680 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
13690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
136a0 75 63 74 20 69 73 20 75 73 65 64 20 62 79 20 73  uct is used by s
136b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 0a 2a  qlite3Select().*
136c0 2a 20 74 6f 20 73 61 76 65 20 61 67 67 72 65 67  * to save aggreg
136d0 61 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f  ate related info
136e0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
136f0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a 2a   Parse object.**
13700 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
13710 20 65 61 63 68 20 63 61 6c 6c 20 61 6e 64 20 74   each call and t
13720 6f 20 72 65 73 74 6f 72 65 20 69 74 20 61 74 20  o restore it at 
13730 74 68 65 20 65 6e 64 2e 20 53 65 65 0a 2a 2a 20  the end. See.** 
13740 73 61 76 65 41 67 67 72 65 67 61 74 65 49 6e 66  saveAggregateInf
13750 6f 28 29 20 61 6e 64 20 72 65 73 74 6f 72 65 41  o() and restoreA
13760 67 67 72 65 67 61 74 65 49 6e 66 6f 28 29 2e 0a  ggregateInfo()..
13770 2a 2f 20 0a 73 74 72 75 63 74 20 41 67 67 72 65  */ .struct Aggre
13780 67 61 74 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20  gateInfo {.  u8 
13790 75 73 65 41 67 67 3b 0a 20 20 69 6e 74 20 6e 41  useAgg;.  int nA
137a0 67 67 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61  gg;.  AggExpr *a
137b0 41 67 67 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  Agg;.};.typedef 
137c0 73 74 72 75 63 74 20 41 67 67 72 65 67 61 74 65  struct Aggregate
137d0 49 6e 66 6f 20 41 67 67 72 65 67 61 74 65 49 6e  Info AggregateIn
137e0 66 6f 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f 70 79  fo;../* .** Copy
137f0 20 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74   aggregate relat
13800 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ed information f
13810 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 73 74  rom the Parse st
13820 72 75 63 74 75 72 65 0a 2a 2a 20 69 6e 74 6f 20  ructure.** into 
13830 74 68 65 20 41 67 67 72 65 67 61 74 65 49 6e 66  the AggregateInf
13840 6f 20 73 74 72 75 63 74 75 72 65 2e 20 5a 65 72  o structure. Zer
13850 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
13860 72 65 6c 61 74 65 64 0a 2a 2a 20 76 61 6c 75 65  related.** value
13870 73 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  s in the Parse s
13880 74 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  truct..*/.static
13890 20 76 6f 69 64 20 73 61 76 65 41 67 67 72 65 67   void saveAggreg
138a0 61 74 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ateInfo(Parse *p
138b0 50 61 72 73 65 2c 20 41 67 67 72 65 67 61 74 65  Parse, Aggregate
138c0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
138d0 70 49 6e 66 6f 2d 3e 61 41 67 67 20 3d 20 70 50  pInfo->aAgg = pP
138e0 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 70 49  arse->aAgg;.  pI
138f0 6e 66 6f 2d 3e 6e 41 67 67 20 3d 20 70 50 61 72  nfo->nAgg = pPar
13900 73 65 2d 3e 6e 41 67 67 3b 0a 20 20 70 49 6e 66  se->nAgg;.  pInf
13910 6f 2d 3e 75 73 65 41 67 67 20 3d 20 70 50 61 72  o->useAgg = pPar
13920 73 65 2d 3e 75 73 65 41 67 67 3b 0a 20 20 70 50  se->useAgg;.  pP
13930 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a  arse->aAgg = 0;.
13940 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
13950 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73   0;.  pParse->us
13960 65 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eAgg = 0;.}../*.
13970 2a 2a 20 43 6f 70 79 20 61 67 67 72 65 67 61 74  ** Copy aggregat
13980 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d  e related inform
13990 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41  ation from the A
139a0 67 67 72 65 67 61 74 65 49 6e 66 6f 20 73 74 72  ggregateInfo str
139b0 75 63 74 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f  uct.** back into
139c0 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
139d0 74 75 72 65 2e 20 54 68 65 20 61 67 67 72 65 67  ture. The aggreg
139e0 61 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f  ate related info
139f0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 63 75 72 72 65  rmation.** curre
13a00 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74  ntly stored in t
13a10 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
13a20 72 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  re is deleted..*
13a30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
13a40 73 74 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e  storeAggregateIn
13a50 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
13a60 2c 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20  , AggregateInfo 
13a70 2a 70 49 6e 66 6f 29 7b 0a 20 20 73 71 6c 69 74  *pInfo){.  sqlit
13a80 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41  eFree(pParse->aA
13a90 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  gg);.  pParse->a
13aa0 41 67 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 41 67  Agg = pInfo->aAg
13ab0 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67  g;.  pParse->nAg
13ac0 67 20 3d 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 3b  g = pInfo->nAgg;
13ad0 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  .  pParse->useAg
13ae0 67 20 3d 20 70 49 6e 66 6f 2d 3e 75 73 65 41 67  g = pInfo->useAg
13af0 67 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 47 65  g;.}.  ./*.** Ge
13b00 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
13b10 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
13b20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
13b30 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
13b40 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
13b50 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
13b60 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
13b70 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74  * value of eDest
13b80 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a   and iParm..**.*
13b90 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75  *     eDest Valu
13ba0 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a  e       Result.*
13bb0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
13bc0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
13bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bf0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c  -.**     SRT_Cal
13c00 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20  lback    Invoke 
13c10 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  the callback for
13c20 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
13c30 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20   result..**.**  
13c40 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
13c50 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72     Store first r
13c60 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20  esult in memory 
13c70 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  cell iParm.**.**
13c80 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20       SRT_Set    
13c90 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
13ca0 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61  ts as keys of ta
13cb0 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
13cc0 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
13cd0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
13ce0 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
13cf0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13d00 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
13d10 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
13d20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
13d30 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
13d40 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
13d50 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
13d60 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
13d70 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
13d80 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
13d90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
13da0 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70   above is incomp
13db0 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61  lete.  Additiona
13dc0 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61  l eDist value ha
13dd0 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73  ve be added.** s
13de0 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e  ince this commen
13df0 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20  t was written.  
13e00 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e  See the selectIn
13e10 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69  nerLoop() functi
13e20 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70  on for.** a comp
13e30 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20  lete listing of 
13e40 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  the allowed valu
13e50 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  es of eDest and 
13e60 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a  their meanings..
13e70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13e80 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
13e90 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
13ea0 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
13eb0 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
13ec0 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
13ed0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
13ee0 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
13ef0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
13f00 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
13f10 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
13f20 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
13f30 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
13f40 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
13f50 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
13f60 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
13f70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
13f80 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61  nt, parentTab, a
13f90 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66  nd *pParentAgg f
13fa0 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64  ields are filled
13fb0 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53   in if this.** S
13fc0 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75  ELECT is a subqu
13fd0 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ery.  This routi
13fe0 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f  ne may try to co
13ff0 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43  mbine this SELEC
14000 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61  T.** with its pa
14010 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73  rent to form a s
14020 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79  ingle flat query
14030 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20  .  In so doing, 
14040 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e  it might.** chan
14050 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  ge the parent qu
14060 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61  ery from a non-a
14070 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61  ggregate to an a
14080 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
14090 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73  ** For that reas
140a0 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41  on, the pParentA
140b0 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65  gg flag is passe
140c0 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20  d as a pointer, 
140d0 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20  so it.** can be 
140e0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
140f0 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20  xample 1:   The 
14100 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  meaning of the p
14110 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
14120 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
14130 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  T * FROM t1 JOIN
14140 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e   (SELECT x, coun
14150 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f  t(*) FROM t2) JO
14160 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20  IN t3;.**    \  
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62      \_______ sub
14190 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20  query _______/  
141a0 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c        /.**     \
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20        /.**      
141f0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
14200 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
14210 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
14220 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69  _____/.**.** Thi
14230 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14240 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65  led for the oute
14250 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20  r query first.  
14260 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a   For that call,.
14270 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  ** pParent will 
14280 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67  be NULL.  During
14290 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
142a0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
142b0 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75  ry, this .** rou
142c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
142d0 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61  ecursively to ha
142e0 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72  ndle the subquer
142f0 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75  y.  For the recu
14300 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70  rsive.** call, p
14310 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e  Parent will poin
14320 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  t to the outer q
14330 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74  uery.  Because t
14340 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a  he subquery is.*
14350 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  * the second ele
14360 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d  ment in a three-
14370 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61  way join, the pa
14380 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65  rentTab paramete
14390 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28  r will.** be 1 (
143a0 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66  the 2nd value of
143b0 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72   a 0-indexed arr
143c0 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ay.).*/.int sqli
143d0 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
143e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
143f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
14400 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
14410 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
14420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
14430 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
14440 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
14450 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
14460 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
14470 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
14480 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
14490 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
144a0 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74      /* A paramet
144b0 65 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65  er used by the e
144c0 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65  Dest disposal me
144d0 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  thod */.  Select
144e0 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
144f0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
14500 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
14510 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
14520 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
14530 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
14540 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
14550 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
14560 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
14570 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20  ParentAgg,      
14580 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
14590 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
145a0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
145b0 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
145d0 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
145e0 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
145f0 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
14600 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66  nt i;.  WhereInf
14610 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62  o *pWInfo;.  Vdb
14620 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67  e *v;.  int isAg
14630 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
14640 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
14650 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
14660 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
14670 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
14680 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
14690 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
146a0 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
146b0 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
146c0 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
146d0 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
146e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
146f0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
14700 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
14710 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
14720 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
14730 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
14740 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14750 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
14760 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
14770 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
14780 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
14790 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
147a0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
147b0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
147c0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
147d0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
147e0 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
147f0 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
14800 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
14810 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
14820 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
14830 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
14840 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
14850 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
14860 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
14870 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
14880 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
14890 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
148a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  function */.  Ag
148b0 67 72 65 67 61 74 65 49 6e 66 6f 20 73 41 67 67  gregateInfo sAgg
148c0 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 73 71 6c  Info;..  if( sql
148d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
148e0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
148f0 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74  rr || p==0 ) ret
14900 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
14910 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14920 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
14930 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
14940 72 65 74 75 72 6e 20 31 3b 0a 0a 23 69 66 6e 64  return 1;..#ifnd
14950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
14960 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
14970 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
14980 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
14990 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
149a0 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
149b0 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
149c0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 23 69   p->pPrior ){.#i
149d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
149e0 54 5f 43 55 52 53 4f 52 0a 20 20 20 20 69 66 28  T_CURSOR.    if(
149f0 20 70 2d 3e 70 46 65 74 63 68 20 29 7b 0a 20 20   p->pFetch ){.  
14a00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14a10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 75 72  Msg(pParse, "cur
14a20 73 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 75  sors cannot be u
14a30 73 65 64 20 6f 6e 20 63 6f 6d 70 6f 75 6e 64 20  sed on compound 
14a40 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20  queries");.     
14a50 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
14a60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14a70 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
14a80 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14a90 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
14aa0 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ff);.  }.#endif.
14ab0 0a 20 20 73 61 76 65 41 67 67 72 65 67 61 74 65  .  saveAggregate
14ac0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 26 73 41  Info(pParse, &sA
14ad0 67 67 49 6e 66 6f 29 3b 0a 20 20 70 4f 72 64 65  ggInfo);.  pOrde
14ae0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
14af0 79 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  y;.  if( eDest==
14b00 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 65 44 65  SRT_Union || eDe
14b10 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
14b20 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  | eDest==SRT_Dis
14b30 63 61 72 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  card ){.    p->p
14b40 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
14b50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
14b60 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
14b70 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
14b80 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
14b90 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65  ;.  }.  p->pOrde
14ba0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
14bb0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
14bc0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
14bd0 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
14be0 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
14bf0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
14c00 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
14c10 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
14c20 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
14c30 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
14c40 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
14c50 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
14c60 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
14c70 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
14c80 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
14c90 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
14ca0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
14cb0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20  ct_end;..  /* . 
14cc0 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
14cd0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
14ce0 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
14cf0 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
14d00 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
14d10 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
14d20 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
14d30 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14d40 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
14d50 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
14d60 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
14d70 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
14d80 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
14d90 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
14da0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
14db0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
14dc0 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
14dd0 74 73 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  ts || pEList->nE
14de0 78 70 72 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65  xpr==1 );.#ifnde
14df0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
14e00 42 51 55 45 52 59 0a 20 20 69 66 28 20 28 65 44  BQUERY.  if( (eD
14e10 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
14e20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
14e30 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
14e40 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
14e50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14e60 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
14e70 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
14e80 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
14e90 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
14ea0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
14eb0 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  sion");.    goto
14ec0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
14ed0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52  .#endif..  /* OR
14ee0 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
14ef0 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
14f00 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
14f10 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
14f20 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
14f30 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ion:.    case SR
14f40 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61  T_Except:.    ca
14f50 73 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a  se SRT_Discard:.
14f60 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
14f70 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
14f80 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
14f90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14fa0 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 75    /* We cannot u
14fb0 73 65 20 61 20 53 51 4c 20 63 75 72 73 6f 72 20  se a SQL cursor 
14fc0 6f 6e 20 61 20 6a 6f 69 6e 20 6f 72 20 6f 6e 20  on a join or on 
14fd0 61 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  a DISTINCT query
14fe0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
14ff0 4c 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52  LITE_OMIT_CURSOR
15000 0a 20 20 69 66 28 20 70 2d 3e 70 46 65 74 63 68  .  if( p->pFetch
15010 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
15020 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
15030 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15040 73 67 28 70 50 61 72 73 65 2c 20 22 63 75 72 73  sg(pParse, "curs
15050 6f 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ors cannot be us
15060 65 64 20 6f 6e 20 44 49 53 54 49 4e 43 54 20 71  ed on DISTINCT q
15070 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20  ueries");.      
15080 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
15090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
150a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  TabList->nSrc>0 
150b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
150c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
150d0 20 22 63 75 72 73 6f 72 73 20 63 61 6e 6e 6f 74   "cursors cannot
150e0 20 62 65 20 75 73 65 64 20 6f 6e 20 6a 6f 69 6e   be used on join
150f0 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  s");.      goto 
15100 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15110 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
15120 73 74 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  st->a[0].pSelect
15130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15140 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15150 2c 20 22 63 75 72 73 6f 72 20 63 61 6e 6e 6f 74  , "cursor cannot
15160 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6e 65   be used with ne
15170 73 74 65 64 20 71 75 65 72 69 65 73 20 22 0a 20  sted queries ". 
15180 20 20 20 20 20 20 20 20 20 22 6f 72 20 76 69 65           "or vie
15190 77 73 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ws");.      goto
151a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
151b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
151c0 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
151d0 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
151e0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
151f0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15200 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
15210 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
15220 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
15230 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69  n names if we wi
15240 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d  ll be using them
15250 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20   in a callback. 
15260 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
15270 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
15280 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
15290 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20  g to some other 
152a0 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a  destination..  *
152b0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
152c0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
152d0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
152e0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
152f0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
15300 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15310 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
15320 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
15330 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
15340 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
15350 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
15360 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
15370 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15380 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
15390 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
153a0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rc; i++){.    co
153b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
153c0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b  AuthContext = 0;
153d0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73  .    int needRes
153e0 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  toreContext;..  
153f0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
15400 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
15410 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15420 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
15430 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  i].zName!=0 ){. 
15440 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
15450 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
15460 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
15470 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
15480 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62  thContext = pTab
15490 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
154a0 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
154b0 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
154c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
154d0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
154e0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
154f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15500 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
15510 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  t->a[i].pSelect,
15520 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20   SRT_TempTable, 
15530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15540 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
15550 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20  .iCursor, p, i, 
15560 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20  &isAgg, 0);.    
15570 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43  if( needRestoreC
15580 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ontext ){.      
15590 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
155a0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
155b0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a  hContext;.    }.
155c0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
155d0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65  ->pSrc;.    pWhe
155e0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
155f0 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 53      if( eDest!=S
15600 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73  RT_Union && eDes
15610 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26  t!=SRT_Except &&
15620 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63   eDest!=SRT_Disc
15630 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  ard ){.      pOr
15640 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
15650 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rBy;.    }.    p
15660 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
15670 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69  oupBy;.    pHavi
15680 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
15690 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
156a0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
156b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
156c0 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
156d0 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
156e0 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
156f0 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73   function by its
15700 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  elf.  ** in the 
15710 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f  result set..  */
15720 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
15730 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
15740 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
15750 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  ) ){.    rc = 0;
15760 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
15770 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
15780 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
15790 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
157a0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
157b0 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
157c0 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
157d0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
157e0 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
157f0 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
15800 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
15810 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
15820 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
15830 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
15840 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
15850 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
15860 72 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ry(pParse, pPare
15870 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
15880 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
15890 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
158a0 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
158b0 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 1;.    goto 
158c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
158d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
158e0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
158f0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73  R BY clause, res
15900 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  olve any collati
15910 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a  on sequences.  *
15920 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76  * names that hav
15930 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  e been explicitl
15940 79 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  y specified..  *
15950 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
15960 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
15970 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
15980 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
15990 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
159a0 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
159b0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
159c0 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  i].pExpr->pColl 
159d0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  = .            s
159e0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
159f0 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64  Seq(pParse, pOrd
15a00 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  erBy->a[i].zName
15a10 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
15a20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
15a30 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
15a40 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15a50 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
15a60 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
15a70 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70  ter..  */.  comp
15a80 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
15a90 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  s(pParse, p);.. 
15aa0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
15ab0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
15ac0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
15ad0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
15ae0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
15af0 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
15b00 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
15b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15b20 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
15b30 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
15b40 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15b50 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
15b60 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  s, iParm, pEList
15b70 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
15b80 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73   /* Do an analys
15b90 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  is of aggregate 
15ba0 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
15bb0 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c  /.  if( isAgg ||
15bc0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
15bd0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
15be0 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20  >nAgg==0 );.    
15bf0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66  isAgg = 1;.    f
15c00 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
15c10 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15c20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
15c30 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
15c40 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
15c50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15c60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
15c70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15c80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15c90 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
15ca0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15cb0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
15cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15cd0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
15ce0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
15cf0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
15d00 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
15d10 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
15d20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
15d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15d40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
15d50 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
15d60 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
15d70 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
15d80 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
15d90 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
15db0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
15dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
15dd0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
15de0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
15df0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
15e00 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
15e10 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
15e20 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
15e30 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
15e40 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
15e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15e60 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74   }..  /* Reset t
15e70 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20  he aggregator.  
15e80 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
15e90 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d  {.    int addr =
15ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15eb0 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74  p(v, OP_AggReset
15ec0 2c 20 28 70 47 72 6f 75 70 42 79 3f 30 3a 31 29  , (pGroupBy?0:1)
15ed0 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b  , pParse->nAgg);
15ee0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15ef0 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
15f00 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  +){.      FuncDe
15f10 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  f *pFunc;.      
15f20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61  if( (pFunc = pPa
15f30 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
15f40 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d  nc)!=0 && pFunc-
15f50 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
15f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15f70 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
15f80 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68  gInit, 0, i, (ch
15f90 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55  ar*)pFunc, P3_FU
15fa0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NCDEF);.      }.
15fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
15fc0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
15fd0 69 6e 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28  int sz = sizeof(
15fe0 4b 65 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f 75  KeyInfo) + pGrou
15ff0 70 42 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f  pBy->nExpr*sizeo
16000 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 20  f(CollSeq*);.   
16010 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
16020 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71   = (KeyInfo *)sq
16030 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  liteMalloc(sz);.
16040 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65        if( 0==pKe
16050 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  y ){.        got
16060 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
16070 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4b 65 79      }.      pKey
16080 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  ->enc = pParse->
16090 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 70  db->enc;.      p
160a0 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 47  Key->nField = pG
160b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
160c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
160d0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
160e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
160f0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
16100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
16110 65 71 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  eq(pParse, pGrou
16120 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
16130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
16140 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  Key->aColl[i] ){
16150 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d  .          pKey-
16160 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72  >aColl[i] = pPar
16170 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
16180 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
16190 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
161a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
161b0 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
161c0 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
161d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d  _HANDOFF);.    }
161e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
161f0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
16200 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66 6f   cell to NULL fo
16210 72 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20 66  r SRT_Mem or 0 f
16220 6f 72 20 53 52 54 5f 45 78 69 73 74 73 0a 20 20  or SRT_Exists.  
16230 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
16240 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
16250 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  ==SRT_Exists ){.
16260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16270 64 64 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d 53  ddOp(v, eDest==S
16280 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f 53 74 72 69  RT_Mem ? OP_Stri
16290 6e 67 38 20 3a 20 4f 50 5f 49 6e 74 65 67 65 72  ng8 : OP_Integer
162a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
162b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
162c0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
162d0 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
162e0 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  /* Open a tempor
162f0 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65  ary table to use
16300 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
16310 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
16320 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
16330 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
16340 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
16350 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78     openTempIndex
16360 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73 74  (pParse, p, dist
16370 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  inct, 0);.  }els
16380 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
16390 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
163a0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
163b0 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
163c0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
163d0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
163e0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
163f0 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  re,.            
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
16420 26 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 46  &pOrderBy, p->pF
16430 65 74 63 68 29 3b 0a 20 20 69 66 28 20 70 57 49  etch);.  if( pWI
16440 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
16450 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
16460 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
16470 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77   inner loop if w
16480 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e  e are not dealin
16490 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72  g with.  ** aggr
164a0 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66  egates.  */.  if
164b0 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  ( !isAgg ){.    
164c0 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
164d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
164e0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
164f0 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
16500 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
16510 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
16520 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  m, pWInfo->iCont
16530 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
16540 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20  reak, aff) ){.  
16550 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
16560 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
16570 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
16580 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
16590 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
165a0 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
165b0 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
165c0 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
165d0 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78   else{.    AggEx
165e0 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66  pr *pAgg;.    if
165f0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
16600 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
16610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16620 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
16630 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
16640 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16650 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
16660 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
16670 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f     }.      /* No
16680 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
16690 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
166a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50  the following OP
166b0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20  _MakeRecord .   
166c0 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65     ** because we
166d0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
166e0 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20  do any coercion 
166f0 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f  of datatypes. */
16700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16710 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
16720 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70  keRecord, pGroup
16730 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  By->nExpr, 0);. 
16740 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
16750 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16760 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16770 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16780 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
16790 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
167a0 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
167b0 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
167c0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
167d0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g++){.        if
167e0 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20  ( pAgg->isAgg ) 
167f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16800 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16810 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e  e(pParse, pAgg->
16820 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
16830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16840 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
16850 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
16860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
16870 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
16880 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bl1);.    }.    
16890 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
168a0 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
168b0 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
168c0 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
168d0 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
168e0 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
168f0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
16900 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 2d        if( !pAgg-
16910 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  >isAgg ) continu
16920 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
16930 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20   pAgg->pFunc!=0 
16940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16950 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53   pAgg->pFunc->xS
16960 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tep!=0 );.      
16970 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75  pDef = pAgg->pFu
16980 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  nc;.      pE = p
16990 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Agg->pExpr;.    
169a0 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
169b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
169c0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
169d0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
169e0 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
169f0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
16a00 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
16a10 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ist);.      sqli
16a20 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16a30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
16a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
16a50 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
16a60 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
16a70 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
16a80 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
16a90 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70       for(j=0; !p
16aa0 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b  Coll && j<nExpr;
16ab0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
16ac0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
16ad0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
16ae0 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61  se, pE->pList->a
16af0 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
16b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16b10 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
16b20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
16b30 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
16b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
16b50 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
16b60 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
16b70 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
16b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16b90 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
16ba0 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
16bb0 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
16bc0 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  Def, P3_POINTER)
16bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16be0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
16bf0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
16c00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
16c10 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
16c20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72   /* If we are pr
16c30 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
16c40 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  tes, we need to 
16c50 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20  set up a second 
16c60 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61  loop.  ** over a
16c70 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  ll of the aggreg
16c80 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70  ate values and p
16c90 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a  rocess them..  *
16ca0 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
16cb0 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20  .    int endagg 
16cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16cd0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
16ce0 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
16cf0 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
16d00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16d10 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65  OP_AggNext, 0, e
16d20 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72  ndagg);.    pPar
16d30 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a  se->useAgg = 1;.
16d40 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
16d50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16d60 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
16d70 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
16d80 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
16d90 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
16da0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
16db0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
16dc0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
16dd0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
16e00 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29  , endagg, aff) )
16e10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
16e20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
16e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16e40 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
16e50 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20  0, startagg);.  
16e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16e70 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
16e80 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
16e90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16ea0 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
16eb0 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
16ec0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
16ed0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
16ee0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
16ef0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
16f00 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
16f10 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
16f20 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
16f30 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
16f40 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
16f50 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
16f60 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
16f70 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
16f80 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
16f90 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66  iParm);.  }..#if
16fa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16fb0 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49  _SUBQUERY.  /* I
16fc0 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
16fd0 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
16fe0 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
16ff0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
17000 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
17010 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74  table.  So delet
17020 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73  e the subquery s
17030 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
17040 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f  e parent.  ** to
17050 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75   prevent this su
17060 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e  bquery from bein
17070 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  g evaluated agai
17080 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74  n and to force t
17090 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20  he.  ** the use 
170a0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
170b0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
170c0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
170d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
170e0 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
170f0 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
17100 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
17110 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
17120 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
17130 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
17140 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20  ctDelete(p);.   
17150 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
17160 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
17170 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  lect = 0;.  }.#e
17180 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20 53  ndif..  /* The S
17190 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
171a0 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
171b0 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
171c0 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
171d0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
171e0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
171f0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
17200 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
17210 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
17220 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
17230 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
17240 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
17250 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
17260 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
17270 0a 20 20 72 65 73 74 6f 72 65 41 67 67 72 65 67  .  restoreAggreg
17280 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ateInfo(pParse, 
17290 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 72 65  &sAggInfo);.  re
172a0 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.