/ Hex Artifact Content
Login

Artifact 16c750c000f0d6aa543c778e2c752154b7272336:


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 38  select.c,v 1.238
0200: 20 32 30 30 35 2f 30 32 2f 30 34 20 30 34 3a 30   2005/02/04 04:0
0210: 37 3a 31 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  7:17 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 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
4410: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4420: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4430: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4440: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4450: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4460: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4470: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
4480: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
4490: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
44a0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
44b0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
44c0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
44d0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
44e0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
44f0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4500: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4510: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4520: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4530: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4560: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4570: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4580: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4590: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
45a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
45b0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
45c0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
45d0: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
45e0: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
45f0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
4600: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
4610: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
4620: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
4630: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
4640: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
4650: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
4660: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
4670: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
4680: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4690: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
46a0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
46b0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
46c0: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
46d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
46e0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
46f0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4700: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
4710: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4720: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
4730: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
4740: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
4750: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4760: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   nColumn,     /*
4770: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4780: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
4790: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
47a0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
47b0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
47c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  e */.  int iParm
47d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
47e0: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73  nal parameter as
47f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44  sociated with eD
4800: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
4810: 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56 64  end1 = sqlite3Vd
4820: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4830: 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c    int end2 = sql
4840: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4850: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
4860: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
4870: 66 6f 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  fo;.  ExprList *
4880: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
4890: 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74  nCol, i;.  sqlit
48a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
48b0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65 44 65 73  >db;..  if( eDes
48c0: 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20  t==SRT_Sorter ) 
48d0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72 64 65 72  return;.  pOrder
48e0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
48f0: 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f 72 64 65  ;.  nCol = pOrde
4900: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  rBy->nExpr;.  pI
4910: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
4920: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  oc( sizeof(*pInf
4930: 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f  o) + nCol*(sizeo
4940: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
4950: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30  ;.  if( pInfo==0
4960: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
4970: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
4980: 20 28 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e   (char*)&pInfo->
4990: 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  aColl[nCol];.  p
49a0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
49b0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
49c0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
49d0: 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74    /* If a collat
49e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
49f0: 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c 69   specified expli
4a00: 63 69 74 79 2c 20 74 68 65 6e 20 69 74 0a 20 20  city, then it.  
4a10: 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69    ** is stored i
4a20: 6e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  n pOrderBy->a[i]
4a30: 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73  .zName. Otherwis
4a40: 65 2c 20 75 73 65 20 74 68 65 20 64 65 66 61 75  e, use the defau
4a50: 6c 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  lt.    ** collat
4a60: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 74 68 65  ion type for the
4a70: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20   expression..   
4a80: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   */.    pInfo->a
4a90: 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
4aa0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4ab0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
4ac0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
4ad0: 69 66 28 20 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c  if( !pInfo->aCol
4ae0: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 49  l[i] ){.      pI
4af0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
4b00: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4b10: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4b20: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
4b30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
4b40: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ortOrder;.  }.  
4b50: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4b60: 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c  , OP_Sort, 0, 0,
4b70: 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20 50   (char*)pInfo, P
4b80: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
4b90: 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  F);.  addr = sql
4ba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4bb0: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4bc0: 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c 69   end1);.  codeLi
4bd0: 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64 64 72  miter(v, p, addr
4be0: 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73 77  , end2, 1);.  sw
4bf0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4c00: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4c10: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4c20: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
4c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c40: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
4c50: 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  no, iParm, 0);. 
4c60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4c70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4c80: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4ca0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
4cb0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4cc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ce0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
4cf0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4d10: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4d20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d30: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
4d40: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  , -1, sqlite3Vdb
4d50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
4d60: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4d70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4d80: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
4d90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4da0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4db0: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
4dc0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
4dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4de0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
4df0: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e  Record, 1, 0, "n
4e00: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
4e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
4e30: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
4e40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e50: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
4e60: 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  ey, (iParm&0x000
4e70: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4e90: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
4ea0: 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ts:.    case SRT
4eb0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
4ec0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4ed0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4ee0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4ef0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4f00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4f10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4f20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31  OP_Goto, 0, end1
4f30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4f40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4f50: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4f60: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
4f70: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
4f80: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fa0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4fb0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
4fc0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
4fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4fe0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
4ff0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5000: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
5010: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5030: 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69  _Column, -1-i, i
5040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5050: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5060: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
5070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5080: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
5090: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
50a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
50b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
50c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
50d0: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
50e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
50f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5100: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
5110: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5120: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5130: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
5140: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
5150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5160: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5170: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
5180: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
5190: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
51a0: 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20  bel(v, end2);.  
51b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51c0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
51d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
51e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
51f0: 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  end1);.  sqlite3
5200: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5210: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
5220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5230: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5240: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
5250: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
5260: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
5270: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5280: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
5290: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
52a0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
52b0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
52c0: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
52d0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
52e0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
52f0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
5300: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
5310: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
5320: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
5330: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5340: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
5350: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
5360: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
5370: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
5380: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
5390: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
53a0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
53b0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
53c0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
53d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
53e0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
53f0: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
5400: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
5410: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
5420: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
5430: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
5440: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
5450: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
5460: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
5470: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
5480: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
5490: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
54a0: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
54b0: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
54c0: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
54d0: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
54e0: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
54f0: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
5500: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
5510: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
5520: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
5530: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
5540: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
5550: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
5560: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
5570: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
5580: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
5590: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
55a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
55b0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
55c0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
55d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
55e0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
55f0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
5600: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
5610: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
5620: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
5630: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
5640: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
5650: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5660: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
5670: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5680: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
5690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56a0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
56b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
56c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
56d0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
56e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
56f0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
5700: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
5710: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
5720: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5730: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
5740: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5750: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
5760: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
5770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5780: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
5790: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
57a0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
57b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
57c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
57d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
57e0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
57f0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
5800: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
5810: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
5820: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
5830: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
5840: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
5850: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
5860: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
5870: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
5880: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e  nType(&sNC, pS->
5890: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
58a0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
58b0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
58c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
58d0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
58e0: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
58f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
5900: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5910: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5920: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
5930: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
5940: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5950: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
5960: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
5970: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
5980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5990: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
59a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
59b0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
59c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
59d0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
59e0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
59f0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5a00: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5a10: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5a20: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5a30: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
5a40: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
5a50: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
5a60: 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28  pTabList;.  for(
5a70: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5a90: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
5aa0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5ab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5ac0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
5ad0: 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69  (&sNC, p);.    i
5ae0: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
5af0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
5b00: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
5b10: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
5b20: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
5b30: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
5b40: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
5b50: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
5b60: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
5b70: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
5b80: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5b90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5ba0: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
5bb0: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
5bc0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
5bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5be0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5bf0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5c00: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5c10: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5c20: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
5c30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
5c40: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
5c50: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
5c60: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
5c70: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
5c80: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
5c90: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
5ca0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5cb0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5cc0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
5cd0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
5ce0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
5cf0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5d00: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
5d10: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5d20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5d30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5d40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5d50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
5d60: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5d70: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
5d80: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
5d90: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
5da0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
5db0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5dc0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
5dd0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
5de0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
5df0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
5e00: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
5e10: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5e20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
5e30: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
5e40: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
5e50: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5e60: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5e70: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5e80: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
5e90: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5ea0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
5eb0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
5ec0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5ed0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
5ee0: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
5ef0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
5f00: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
5f10: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
5f20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5f30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5f40: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
5f50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5f60: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5f70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5f80: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5f90: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5fa0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5fb0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5fd0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
5fe0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
5ff0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
6000: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6010: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
6020: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
6030: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
6040: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
6050: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
6060: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
6070: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
6080: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
6090: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
60a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
60b0: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
60c0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
60d0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
60e0: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
60f0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6100: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
6110: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
6120: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
6130: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
6140: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
6150: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
6160: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
6170: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
6180: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
6190: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
61a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
61b0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
61c0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
61d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
61e0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
61f0: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
6200: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6210: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
6220: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
6230: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
6240: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
6250: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6260: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
6270: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
6280: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
6290: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
62a0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
62b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
62c0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
62d0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
62e0: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
62f0: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
6300: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
6310: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6330: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
6340: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
6350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
6360: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6370: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6380: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
6390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
63b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
63c0: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
63d0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
63e0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
63f0: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6400: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
6410: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6420: 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e  me(v, i, p->span
6430: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
6440: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
6450: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
6460: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
6470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6480: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
6490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
64a0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
64b0: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
64c0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
64d0: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
64e0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
64f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6500: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6510: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
6520: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
6530: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
6540: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
6550: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6560: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6570: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
6580: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
6590: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
65a0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
65b0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
65c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
65d0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
65e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
65f0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
6600: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
6610: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
6620: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
6630: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
6640: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
6650: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
6660: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
6670: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
6680: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
6690: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
66a0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
66b0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
66c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
66d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
66e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
66f0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
6700: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
6710: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
6720: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
6730: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
6740: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
6750: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6760: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6770: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
6780: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
6790: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
67a0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
67b0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
67c0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
67d0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
67e0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
67f0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
6800: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6810: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
6820: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
6830: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
6840: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
6850: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
6860: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
6870: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
6880: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6890: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
68a0: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65  olve(pParse, pSe
68b0: 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  lect, 0) ){.    
68c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
68d0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
68e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
68f0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
6900: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6910: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
6920: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
6930: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
6940: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6950: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6960: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6970: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
6980: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
6990: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
69a0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
69b0: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
69c0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  Malloc( sizeof(p
69d0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
69e0: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f  ab->nCol );.  fo
69f0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
6a00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6a10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
6a20: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
6a30: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
6a40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
6a50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73  ;.    char *zBas
6a60: 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63  ename;.    int c
6a70: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
6a80: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
6a90: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
6aa0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
6ab0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
6ac0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
6ad0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
6ae0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
6af0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
6b00: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
6b10: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
6b20: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
6b30: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
6b40: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6b50: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
6b60: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
6b70: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
6b80: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
6b90: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
6ba0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
6bb0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6bc0: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
6bd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
6be0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
6bf0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
6c00: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
6c10: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
6c20: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
6c30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
6c40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
6c50: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
6c60: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
6c70: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
6c80: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
6c90: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
6ca0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
6cb0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
6cc0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
6cd0: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
6ce0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
6cf0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
6d00: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
6d10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6d20: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
6d30: 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  , &p->span);.   
6d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
6d50: 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69   If all else fai
6d60: 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61  ls, make up a na
6d70: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6d80: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
6d90: 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  tf("column%d", i
6da0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
6db0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
6dc0: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  ame);..    /* Ma
6dd0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
6de0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
6df0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
6e00: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
6e10: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
6e20: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
6e30: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
6e40: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
6e50: 20 20 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61    */.    zBasena
6e60: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
6e70: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
6e80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
6e90: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6ea0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
6eb0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6ec0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6ed0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a  ite3MPrintf("%s:
6ee0: 25 64 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20  %d", zBasename, 
6ef0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
6f00: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  j = -1;.      }.
6f10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42      }.    if( zB
6f20: 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20 29  asename!=zName )
6f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6f40: 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b 0a 20  ee(zBasename);. 
6f50: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
6f60: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
6f70: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
6f80: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
6f90: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
6fa0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
6fb0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
6fc0: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
6fd0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
6fe0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
6ff0: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
7000: 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70  StrDup(columnTyp
7010: 65 28 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20  e(&sNC, p));.   
7020: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
7030: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
7040: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
7050: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
7060: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f  );.    pCol->pCo
7070: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
7080: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7090: 70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  p);.    if( !pCo
70a0: 6c 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  l->pColl ){.    
70b0: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
70c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
70d0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  tColl;.    }.  }
70e0: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
70f0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54   -1;.  return pT
7100: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ab;.}../*.** Pre
7110: 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74  pare a SELECT st
7120: 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
7130: 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20  essing by doing 
7140: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
7150: 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20   things:.**.**  
7160: 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
7170: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
7180: 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
7190: 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
71a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
71b0: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
71c0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
71d0: 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
71e0: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
71f0: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
7200: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
7210: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
7220: 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
7230: 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
7240: 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
7250: 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
7260: 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
7270: 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
7280: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
7290: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
72a0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
72b0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
72c0: 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
72d0: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
72e0: 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
72f0: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
7300: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
7310: 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
7320: 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
7330: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
7340: 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
7350: 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
7360: 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
7370: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
7380: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
7390: 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
73a0: 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
73b0: 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
73c0: 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
73d0: 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
73e0: 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
73f0: 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
7400: 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
7410: 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
7420: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
7430: 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
7440: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7450: 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
7460: 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
7470: 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
7480: 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
7490: 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
74a0: 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
74b0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
74c0: 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
74d0: 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
74e0: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
74f0: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
7500: 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
7510: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
7520: 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
7530: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  ** Return 0 on s
7540: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72  uccess.  If ther
7550: 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20  e are problems, 
7560: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
7570: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
7580: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
7590: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
75a0: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
75b0: 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61  tStmt(Parse *pPa
75c0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
75d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
75e0: 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rc;.  SrcList *p
75f0: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
7600: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
7610: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74  able *pTab;.  st
7620: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7630: 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28  m *pFrom;..  if(
7640: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
7650: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
7660: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
7670: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
7680: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
7690: 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
76a0: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
76b0: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
76c0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
76d0: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
76e0: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
76f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
7700: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
7710: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
7720: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
7730: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
7740: 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
7750: 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
7760: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
7770: 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
7780: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
7790: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
77a0: 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
77b0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
77c0: 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
77d0: 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
77e0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
77f0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
7800: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
7810: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
7820: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
7830: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7840: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
7850: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
7860: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
7870: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
7880: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7890: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
78a0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
78b0: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
78c0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
78d0: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
78e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
78f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
7900: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
7910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7920: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7930: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
7940: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
7950: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
7960: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
7970: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
7980: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
7990: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
79a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
79b0: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
79c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
79d0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
79e0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
79f0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
7a00: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
7a10: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
7a20: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
7a30: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
7a40: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7a50: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
7a60: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
7a70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7a90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7aa0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
7ab0: 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69  Transient flag i
7ac0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
7ad0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
7ae0: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
7af0: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
7b00: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
7b10: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
7b20: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
7b30: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
7b40: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
7b50: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
7b60: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
7b70: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
7b80: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
7b90: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
7ba0: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
7bb0: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
7bc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
7bd0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
7be0: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
7bf0: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
7c00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7c10: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
7c20: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
7c30: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
7c40: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
7c50: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
7c60: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
7c70: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
7c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7c90: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69  rn 1;.      }.#i
7ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7cb0: 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66 28  T_VIEW.      if(
7cc0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
7cd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
7ce0: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
7cf0: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
7d00: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
7d10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7d20: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
7d30: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
7d40: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
7d50: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d70: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
7d80: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
7d90: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
7da0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
7db0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
7dc0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
7dd0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
7de0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
7df0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
7e00: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
7e10: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
7e20: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
7e30: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
7e40: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
7e50: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7e60: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
7e70: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
7e80: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
7e90: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7ea0: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
7eb0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7ec0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
7ed0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
7ee0: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
7ef0: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
7f00: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7f10: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
7f20: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
7f30: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
7f40: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
7f50: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
7f60: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
7f70: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
7f80: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
7f90: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
7fa0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7fb0: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
7fc0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
7fd0: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
7fe0: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
7ff0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
8000: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
8010: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
8020: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
8030: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
8040: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
8050: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
8060: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
8070: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
8080: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
8090: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
80a0: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
80b0: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
80c0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
80d0: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
80e0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
80f0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
8100: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
8110: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
8120: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
8130: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
8140: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
8150: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
8160: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
8170: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
8180: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
8190: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
81a0: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
81b0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
81c0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
81d0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
81e0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
81f0: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
8200: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
8210: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
8220: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
8230: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
8240: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
8250: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
8260: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
8270: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
8280: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
8290: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
82a0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
82b0: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
82c0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
82d0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
82e0: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
82f0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8300: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
8310: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
8320: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
8330: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
8340: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8350: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
8360: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
8370: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
8380: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
8390: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
83a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
83b0: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
83c0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
83d0: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
83e0: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
83f0: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
8400: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
8410: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
8420: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
8430: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
8440: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
8450: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
8460: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
8470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
8480: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8490: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61  stAppend(pNew, a
84a0: 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
84b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
84c0: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
84d0: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
84e0: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  ;.        a[k].p
84f0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
8500: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
8510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8520: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
8530: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
8540: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
8550: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
8560: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
8570: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
8580: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
8590: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
85a0: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
85b0: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
85c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
85d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
85e0: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
85f0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
8600: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
8610: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
8620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
8630: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
8640: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d  meFromToken(&pE-
8650: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pLeft->token);.
8660: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8670: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
8680: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
8690: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
86a0: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
86b0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
86c0: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
86d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
86e0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
86f0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
8700: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
8710: 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
8720: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
8730: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
8740: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
8750: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  { .            z
8760: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
8770: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
8780: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
8790: 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62   zTName && (zTab
87a0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
87b0: 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20  ame[0]==0 || .  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
87d0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
87e0: 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
87f0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
8800: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8810: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8820: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
8830: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
8840: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
8850: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
8860: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
8870: 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  , *pLeft, *pRigh
8880: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
8890: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
88a0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
88b0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
88c0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
88d0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
88e0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
88f0: 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  ft = &pTabList->
8900: 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  a[i-1];.        
8910: 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74        if( (pLeft
8920: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
8930: 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20  NATURAL)!=0 &&. 
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
8960: 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20  ex(pLeft->pTab, 
8970: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8990: 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
89a0: 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
89b0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
89c0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
89d0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
89e0: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8a00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8a20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
8a30: 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74  dListIndex(pLeft
8a40: 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
8a50: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
8a60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
8a70: 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
8a80: 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
8a90: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8ab0: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
8ac0: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
8ad0: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
8af0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8b20: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
8b30: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
8b40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
8b50: 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30     if( pRight==0
8b60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8b70: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
8b80: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  pRight->token, z
8b90: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8ba0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
8bb0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8bc0: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
8bd0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
8be0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
8bf0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
8c00: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
8c10: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
8c20: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
8c30: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
8c40: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
8c50: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
8c60: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
8c70: 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c  n(&pLeft->token,
8c80: 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
8c90: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
8ca0: 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  en(&pExpr->span,
8cb0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8cc0: 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
8cd0: 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
8ce0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8cf0: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8d10: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
8d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8d30: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
8d40: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
8d50: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
8d60: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
8d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8d80: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
8d90: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
8da0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
8db0: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
8dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
8de0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8df0: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70  stAppend(pNew, p
8e00: 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74  Expr, &pRight->t
8e10: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
8e20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8e30: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
8e40: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
8e50: 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
8e60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8e70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8e80: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
8e90: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
8ec0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ed0: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
8ee0: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
8ef0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f00: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8f20: 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29  liteFree(zTName)
8f30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8f50: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
8f60: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
8f70: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
8f80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8f90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8fa0: 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69  recursively unli
8fb0: 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70  nks the Select.p
8fc0: 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69  Src.a[].pTab poi
8fd0: 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65  nters.** in a se
8fe0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
8ff0: 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68   It just sets th
9000: 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55  e pointers to NU
9010: 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  LL.  This.** rou
9020: 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76  tine is recursiv
9030: 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  e in the sense t
9040: 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63  hat if the Selec
9050: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65  t.pSrc.a[].pSele
9060: 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73  ct.** pointer is
9070: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20   not NULL, this 
9080: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9090: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
90a0: 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a   that pointer..*
90b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
90c0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  e is called on t
90d0: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
90e0: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
90f0: 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72   a.** VIEW in or
9100: 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20  der to undo any 
9110: 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c  bindings to tabl
9120: 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  es.  This is nec
9130: 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73  essary.** becaus
9140: 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d  e those tables m
9150: 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62  ight be DROPed b
9160: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53  y a subsequent S
9170: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49  QL command..** I
9180: 66 20 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61  f the bindings a
9190: 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20  re not removed, 
91a0: 74 68 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  then the Select.
91b0: 70 53 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  pSrc->a[].pTab f
91c0: 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ield.** will be 
91d0: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
91e0: 20 61 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54   a deallocated T
91f0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
9200: 66 74 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50  fter the.** DROP
9210: 20 61 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20   and a coredump 
9220: 77 69 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e  will occur the n
9230: 65 78 74 20 74 69 6d 65 20 74 68 65 20 56 49 45  ext time the VIE
9240: 57 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  W is used..*/.#i
9250: 66 20 30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  f 0.void sqlite3
9260: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
9270: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
9280: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
9290: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73  c = p->pSrc;.  s
92a0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
92b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 54 61 62  em *pItem;.  Tab
92c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
92d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
92e0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
92f0: 70 53 72 63 2d 3e 61 3b 20 69 3c 70 53 72 63 2d  pSrc->a; i<pSrc-
9300: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
9310: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
9320: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
9330: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  b)!=0 ){.      i
9340: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
9350: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ient ){.        
9360: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
9370: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
9380: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d     }.      pItem
9390: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
93a0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
93b0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
93c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
93d0: 69 6e 64 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ind(pItem->pSele
93e0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
93f0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
9400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9410: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9420: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
9430: 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74  routine associat
9440: 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e  es entries in an
9450: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
9460: 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a  sion list with.*
9470: 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72  * columns in a r
9480: 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68  esult.  For each
9490: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
94a0: 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65  sion, the opcode
94b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
94c0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61  evel node is cha
94d0: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
94e0: 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d  N and the iColum
94f0: 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  n value of.** th
9500: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
9510: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
9520: 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  th column number
9530: 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a   and the iTable.
9540: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
9550: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
9560: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54  s filled with iT
9570: 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  able parameter..
9580: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
9590: 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20  re prior SELECT 
95a0: 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72  clauses, they ar
95b0: 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73  e processed firs
95c0: 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69  t.  A match.** i
95d0: 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c  n an earlier SEL
95e0: 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64  ECT takes preced
95f0: 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65  ence over a late
9600: 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  r SELECT..**.** 
9610: 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64  Any entry that d
9620: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73  oes not match is
9630: 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65   flagged as an e
9640: 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  rror.  The numbe
9650: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69  r.** of errors i
9660: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
9670: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
9680: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
9690: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
96a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
96b0: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
96c0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
96d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
96e0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
96f0: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
9700: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
9710: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
9720: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
9730: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
9740: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
9750: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
9760: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
9770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
9780: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
9790: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
97a0: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
97b0: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
97c0: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
97d0: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
97e0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
97f0: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
9800: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9810: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
9820: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
9830: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
9840: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
9850: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
9860: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9870: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
9880: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9890: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
98a0: 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
98b0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
98c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
98d0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
98e0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
98f0: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
9900: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
9910: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
9920: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
9930: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
9940: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9950: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
9960: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
9970: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
9980: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
9990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
99a0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
99b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
99c0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
99d0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
99e0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
99f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
9a00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
9a10: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
9a20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
9a30: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
9a40: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
9a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9a60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9a70: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
9a80: 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68  Y position %d sh
9a90: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
9aa0: 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  1 and %d",.     
9ab0: 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73       iCol, pELis
9ac0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
9ad0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
9ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9af0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73  }.      if( !mus
9b00: 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74  tComplete ) cont
9b10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c  inue;.      iCol
9b20: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
9b30: 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26  r(j=0; iCol<0 &&
9b40: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
9b50: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9b60: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ( pEList->a[j].z
9b70: 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d  Name && (pE->op=
9b80: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70  =TK_ID || pE->op
9b90: 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a  ==TK_STRING) ){.
9ba0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
9bb0: 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20  ame, *zLabel;.  
9bc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
9bd0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
9be0: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c  ;.        zLabel
9bf0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
9c00: 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b  omToken(&pE->tok
9c10: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  en);.        ass
9c20: 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29  ert( zLabel!=0 )
9c30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
9c40: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
9c50: 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29  me, zLabel)==0 )
9c60: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  { .          iCo
9c70: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d  l = j;.        }
9c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9c90: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
9ca0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
9cb0: 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33  Col<0 && sqlite3
9cc0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20  ExprCompare(pE, 
9cd0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
9ce0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pr) ){.        i
9cf0: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  Col = j;.      }
9d00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
9d10: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
9d20: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
9d30: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43  MN;.      pE->iC
9d40: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
9d50: 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d      pE->iTable =
9d60: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70   iTable;.      p
9d70: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
9d80: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
9d90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
9da0: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
9db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9dc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9dd0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
9de0: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
9df0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
9e00: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
9e10: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
9e20: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
9e30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
9e40: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
9e50: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
9e60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9e70: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9e80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
9e90: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
9ea0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
9eb0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
9ec0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
9ed0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
9ee0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
9ef0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
9f00: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
9f10: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
9f20: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
9f30: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
9f40: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9f50: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
9f60: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
9f70: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
9f80: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
9f90: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
9fa0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a   return v;.}../*
9fb0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
9fc0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9fd0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
9fe0: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
9ff0: 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74 20 61   the.** nLimit a
a000: 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65 6c 64  nd nOffset field
a010: 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e  s.  nLimit and n
a020: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
a030: 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68 61 74  integers.** that
a040: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
a050: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
a060: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
a070: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
a080: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
a090: 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31 20 61  r that hold -1 a
a0a0: 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20 6b 65  nd 0 if those ke
a0b0: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
a0c0: 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  ed..** iLimit an
a0d0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 74 68  d iOffset are th
a0e0: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
a0f0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
a100: 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74 65 72  s for.** counter
a110: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
a120: 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  e the limit and 
a130: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
a140: 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d 69 74  e is no.** limit
a150: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
a160: 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e 64 20  then iLimit and 
a170: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
a180: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
a190: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
a1a0: 20 74 68 65 20 76 61 6c 75 65 73 20 69 66 20 69   the values if i
a1b0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
a1c0: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
a1d0: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
a1e0: 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c 69  s defined by nLi
a1f0: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e  mit and nOffset.
a200: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
a210: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
a220: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
a230: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
a240: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a  efault values.**
a250: 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f   (usually but no
a260: 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69  t always -1) pri
a270: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
a280: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f  is routine..** O
a290: 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30  nly if nLimit>=0
a2a0: 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f   or nOffset>0 do
a2b0: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
a2c0: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
a2d0: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
a2e0: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
a2f0: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
a300: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
a310: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
a320: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
a330: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
a340: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
a350: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
a360: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
a370: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
a380: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
a390: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a3a0: 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  *p){.  /* .  ** 
a3b0: 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  If the compariso
a3c0: 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74 3e 30  n is p->nLimit>0
a3d0: 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20   then "LIMIT 0" 
a3e0: 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c 20 72  shows.  ** all r
a3f0: 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68 65 20  ows.  It is the 
a400: 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d 69 74  same as no limit
a410: 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  . If the compari
a420: 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 2d 3e  sion is.  ** p->
a430: 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e 20 22  nLimit>=0 then "
a440: 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20 6e 6f  LIMIT 0" show no
a450: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a 20 20   rows at all..  
a460: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
a470: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
a480: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
a490: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
a4a0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
a4b0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
a4c0: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
a4d0: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
a4e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
a4f0: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
a500: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
a510: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
a520: 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e    if( p->nLimit>
a530: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  =0 ){.    int iM
a540: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
a550: 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  m++;.    Vdbe *v
a560: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a570: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
a580: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a5a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a5b0: 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74  eger, -p->nLimit
a5c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a5d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a5e0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
a5f0: 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   1);.    VdbeCom
a600: 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49  ment((v, "# LIMI
a610: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
a620: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d    p->iLimit = iM
a630: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  em;.  }.  if( p-
a640: 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20  >nOffset>0 ){.  
a650: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
a660: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
a670: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
a680: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a690: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
a6a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
a6b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a6c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70  , OP_Integer, -p
a6d0: 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  ->nOffset, 0);. 
a6e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a6f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
a700: 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  re, iMem, 1);.  
a710: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
a720: 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e  , "# OFFSET coun
a730: 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69  ter"));.    p->i
a740: 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20  Offset = iMem;. 
a750: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
a760: 72 61 74 65 20 56 44 42 45 20 69 6e 73 74 72 75  rate VDBE instru
a770: 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c 6c  ctions that will
a780: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   open a transien
a790: 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20  t table that.** 
a7a0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
a7b0: 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f 20   an index or to 
a7c0: 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73 75  store keyed resu
a7d0: 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  lts for a compou
a7e0: 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20 49  nd.** select.  I
a7f0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f  n other words, o
a800: 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20  pen a transient 
a810: 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64 73  table that needs
a820: 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74   a.** KeyInfo st
a830: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e 75  ructure.  The nu
a840: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a850: 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69  in the KeyInfo i
a860: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
a870: 62 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  by the result se
a880: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
a890: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
a8a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a8b0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63  ..**.** Specific
a8c0: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
a8d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a8e0: 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74 61  open an index ta
a8f0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54 49  ble for.** DISTI
a900: 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54 45  NCT, UNION, INTE
a910: 52 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54  RSECT and EXCEPT
a920: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
a930: 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a 20  ts (but not .** 
a940: 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a  UNION ALL)..**.*
a950: 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 74  * Make the new t
a960: 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61 74 61  able a KeyAsData
a970: 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41 73 44   table if keyAsD
a980: 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ata is true..**.
a990: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
a9a0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 61 64 64  urned is the add
a9b0: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f  ress of the OP_O
a9c0: 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63 74  penTemp instruct
a9d0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
a9e0: 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78  nt openTempIndex
a9f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
aa00: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
aa10: 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73 44 61  Tab, int keyAsDa
aa20: 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ta){.  KeyInfo *
aa30: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  pKeyInfo;.  int 
aa40: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69 74  nColumn;.  sqlit
aa50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
aa60: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
aa70: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
aa80: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 61  ->pVdbe;.  int a
aa90: 64 64 72 3b 0a 0a 20 20 69 66 28 20 70 72 65 70  ddr;..  if( prep
aaa0: 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
aab0: 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
aac0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 6f  urn 0;.  }.  nCo
aad0: 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69 73 74  lumn = p->pEList
aae0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65 79 49  ->nExpr;.  pKeyI
aaf0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
ab00: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  oc( sizeof(*pKey
ab10: 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a 73 69  Info)+nColumn*si
ab20: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 29  zeof(CollSeq*) )
ab30: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
ab40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ab50: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
ab60: 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65  = db->enc;.  pKe
ab70: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
ab80: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72 28 69  nColumn;.  for(i
ab90: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
aba0: 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66  ++){.    pKeyInf
abb0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
abc0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
abd0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
abe0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
abf0: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
ac00: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
ac10: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
ac20: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70  aColl[i] = db->p
ac30: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
ac40: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 73 71 6c    }.  addr = sql
ac50: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ac60: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54 61 62  P_OpenTemp, iTab
ac70: 2c 20 30 2c 20 0a 20 20 20 20 20 20 28 63 68 61  , 0, .      (cha
ac80: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
ac90: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
aca0: 3b 0a 20 20 69 66 28 20 6b 65 79 41 73 44 61 74  ;.  if( keyAsDat
acb0: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
acd0: 4b 65 79 41 73 44 61 74 61 2c 20 69 54 61 62 2c  KeyAsData, iTab,
ace0: 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
acf0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 6e 64  n addr;.}..#ifnd
ad00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ad10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
ad20: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 61 64 64  *.** Add the add
ad30: 72 65 73 73 20 22 61 64 64 72 22 20 74 6f 20 74  ress "addr" to t
ad40: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 4f 70  he set of all Op
ad50: 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65 20 61 64  enTemp opcode ad
ad60: 64 72 65 73 73 65 73 0a 2a 2a 20 74 68 61 74 20  dresses.** that 
ad70: 61 72 65 20 62 65 69 6e 67 20 61 63 63 75 6d 75  are being accumu
ad80: 6c 61 74 65 64 20 69 6e 20 70 2d 3e 70 70 4f 70  lated in p->ppOp
ad90: 65 6e 54 65 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  enTemp..*/.stati
ada0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
adb0: 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 53 65  tOpenTempAddr(Se
adc0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 61 64 64  lect *p, int add
add0: 72 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c  r){.  IdList *pL
ade0: 69 73 74 20 3d 20 2a 70 2d 3e 70 70 4f 70 65 6e  ist = *p->ppOpen
adf0: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49 64  Temp = sqlite3Id
ae00: 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70  ListAppend(*p->p
ae10: 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b 0a 20  pOpenTemp, 0);. 
ae20: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
ae30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ae40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
ae50: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
ae60: 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61 64 64  nId-1].idx = add
ae70: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
ae80: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
ae90: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
aea0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
aeb0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
aec0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
aed0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
aee0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
aef0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
af00: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
af10: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
af20: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
af30: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
af40: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
af50: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
af60: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
af70: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
af80: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
af90: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
afa0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
afb0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
afc0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
afd0: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
afe0: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
aff0: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
b000: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
b010: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
b020: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
b030: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
b040: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
b050: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
b060: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
b070: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
b080: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
b090: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
b0a0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
b0b0: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
b0c0: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
b0d0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
b0e0: 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30   }.  if( pRet==0
b0f0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
b100: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
b110: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
b120: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
b130: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
b140: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
b150: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b160: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
b170: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b180: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b190: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
b1a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b1b0: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
b1c0: 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20  a query that is 
b1d0: 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e  really the union
b1e0: 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74  .** or intersect
b1f0: 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ion of two or mo
b200: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
b210: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  ies..**.** "p" p
b220: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
b230: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
b240: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
b250: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
b260: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
b270: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
b280: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
b290: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
b2a0: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
b2b0: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
b2c0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
b2d0: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
b2e0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
b2f0: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
b300: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
b310: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
b320: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
b330: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
b340: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
b350: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
b360: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
b370: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
b380: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
b390: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
b3a0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
b3b0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
b3c0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
b3d0: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
b3e0: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
b3f0: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
b400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
b410: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
b420: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
b430: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
b440: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
b460: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b470: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
b480: 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
b490: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
b4a0: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
b4b0: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
b4c0: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
b4d0: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
b4e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b4f0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
b500: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
b510: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
b520: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
b530: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
b540: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
b550: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
b560: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
b570: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
b580: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
b590: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
b5a0: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
b5b0: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
b5c0: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
b5d0: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
b5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
b5f0: 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
b600: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b610: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b620: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
b630: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
b640: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
b650: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
b660: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
b670: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
b680: 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53        /* \___  S
b690: 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75 6c  tore query resul
b6a0: 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20  ts as specified 
b6b0: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
b6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20             /* / 
b6d0: 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77 6f      by these two
b6e0: 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20   parameters.    
b6f0: 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a       */.  char *
b700: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
b710: 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
b720: 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
b730: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
b740: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
b750: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
b760: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
b770: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
b780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
b790: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
b7a0: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
b7b0: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
b7c0: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b7e0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b7f0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
b800: 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 54 65   IdList *pOpenTe
b810: 6d 70 20 3d 20 30 3b 2f 2a 20 4f 50 5f 4f 70 65  mp = 0;/* OP_Ope
b820: 6e 54 65 6d 70 20 6f 70 63 6f 64 65 73 20 74 68  nTemp opcodes th
b830: 61 74 20 6e 65 65 64 20 61 20 4b 65 79 49 6e 66  at need a KeyInf
b840: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 41 64 64 72  o */.  int aAddr
b850: 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  [5];         /* 
b860: 41 64 64 72 65 73 73 65 73 20 6f 66 20 53 65 74  Addresses of Set
b870: 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f 70 65 72 61  NumColumns opera
b880: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  tors */.  int nA
b890: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ddr = 0;        
b8a0: 2f 2a 20 4e 75 6d 62 65 72 20 75 73 65 64 20 2a  /* Number used *
b8b0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
b8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b8d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
b8e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
b8f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
b900: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
b910: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
b920: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
b930: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
b940: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
b950: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
b960: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
b970: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
b980: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
b990: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
b9a0: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
b9b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
b9c0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b9d0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
b9e0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
b9f0: 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  or;.  if( pPrior
ba00: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
ba10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ba20: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
ba30: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
ba40: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
ba50: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
ba60: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
ba70: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
ba80: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
ba90: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
baa0: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
bab0: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70 50  >nLimit>=0 || pP
bac0: 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  rior->nOffset>0 
bad0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bae0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
baf0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
bb00: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
bb10: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
bb20: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
bb30: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
bb40: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
bb50: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bb60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
bb70: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
bb80: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
bb90: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
bba0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
bbb0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
bbc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
bbd0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
bbe0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
bbf0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
bc00: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
bc10: 49 66 20 2a 70 20 74 68 69 73 20 69 73 20 74 68  If *p this is th
bc20: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c  e right-most sel
bc30: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ect statement, t
bc40: 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20  hen initialize. 
bc50: 20 2a 2a 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d   ** p->ppOpenTem
bc60: 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 70 4f  p to point to pO
bc70: 70 65 6e 54 65 6d 70 2e 20 20 49 66 20 2a 70 20  penTemp.  If *p 
bc80: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
bc90: 20 6d 6f 73 74 0a 20 20 2a 2a 20 73 74 61 74 65   most.  ** state
bca0: 6d 65 6e 74 20 74 68 65 6e 20 70 2d 3e 70 70 4f  ment then p->ppO
bcb0: 70 65 6e 54 65 6d 70 20 77 69 6c 6c 20 68 61 76  penTemp will hav
bcc0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  e already been i
bcd0: 6e 69 74 69 61 6c 69 7a 65 64 0a 20 20 2a 2a 20  nitialized.  ** 
bce0: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  by a prior call 
bcf0: 74 6f 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  to this same pro
bd00: 63 65 64 75 72 65 2e 20 20 50 61 73 73 20 61 6c  cedure.  Pass al
bd10: 6f 6e 67 20 74 68 65 20 70 4f 70 65 6e 54 65 6d  ong the pOpenTem
bd20: 70 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  p.  ** pointer t
bd30: 6f 20 70 50 72 69 6f 72 2c 20 74 68 65 20 6e 65  o pPrior, the ne
bd40: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  xt statement to 
bd50: 6f 75 72 20 6c 65 66 74 2e 0a 20 20 2a 2f 0a 20  our left..  */. 
bd60: 20 69 66 28 20 70 2d 3e 70 70 4f 70 65 6e 54 65   if( p->ppOpenTe
bd70: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  mp==0 ){.    p->
bd80: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 26 70 4f  ppOpenTemp = &pO
bd90: 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  penTemp;.  }.  p
bda0: 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d  Prior->ppOpenTem
bdb0: 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  p = p->ppOpenTem
bdc0: 70 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  p;..  /* Create 
bdd0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
bde0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
bdf0: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
be00: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
be10: 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
be20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
be30: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
be40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
be50: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
be60: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  arm, 0);.    ass
be70: 65 72 74 28 20 6e 41 64 64 72 3d 3d 30 20 29 3b  ert( nAddr==0 );
be80: 0a 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72  .    aAddr[nAddr
be90: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
bea0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
beb0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72  NumColumns, iPar
bec0: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74  m, 0);.    eDest
bed0: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
bee0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
bef0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
bf00: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
bf10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
bf20: 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
bf30: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
bf40: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
bf50: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
bf60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
bf70: 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20  Prior->nLimit = 
bf80: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
bf90: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73     pPrior->nOffs
bfa0: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
bfb0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
bfc0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
bfd0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
bfe0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
bff0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
c000: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c010: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c020: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
c040: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
c050: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
c060: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
c070: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
c080: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
c090: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
c0a0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
c0b0: 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65         p->nOffse
c0c0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
c0d0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c0e0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
c0f0: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
c100: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
c110: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
c120: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
c130: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c140: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c150: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c160: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
c170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c180: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
c190: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
c1a0: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
c1b0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
c1c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c1d0: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
c1e0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
c1f0: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
c200: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
c210: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
c220: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
c230: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
c240: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
c250: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
c260: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
c270: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
c280: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
c290: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
c2a0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
c2b0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
c2c0: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
c2d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  /.      int nLim
c2e0: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20  it, nOffset; /* 
c2f0: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
c300: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
c310: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
c320: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
c330: 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52  erBy;  /* The OR
c340: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
c350: 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45  r the right SELE
c360: 43 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  CT */.      int 
c370: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
c380: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
c390: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
c3a0: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
c3b0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
c3c0: 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72  riorOp && p->pOr
c3d0: 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e  derBy==0 && p->n
c3e0: 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f  Limit<0 && p->nO
c3f0: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
c400: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
c410: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
c420: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
c430: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
c440: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
c450: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
c460: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
c470: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20   = iParm;.      
c480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
c490: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
c4a0: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
c4b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c4c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
c4d0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
c4e0: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
c4f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c500: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
c510: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
c520: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
c530: 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20  rBy .        && 
c540: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
c550: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
c560: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p->pOrderBy, uni
c570: 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20  onTab, 1) ){.   
c580: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
c590: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
c5a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c5b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c5c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c5d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c5e0: 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54  OpenTemp, unionT
c5f0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
c600: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  if( p->op!=TK_AL
c610: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  L ){.          r
c620: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
c630: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
c640: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
c650: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c660: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
c670: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c680: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
c690: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
c6a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c6b0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
c6c0: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20  unionTab, 1);.  
c6d0: 20 20 20 20 20 20 7d 0a 09 61 73 73 65 72 74 28        }..assert(
c6e0: 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41   nAddr<sizeof(aA
c6f0: 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64  ddr)/sizeof(aAdd
c700: 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  r[0]) );.       
c710: 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20   aAddr[nAddr++] 
c720: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c730: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
c740: 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62  olumns, unionTab
c750: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
c760: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c770: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
c780: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
c790: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
c7a0: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
c7b0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
c7c0: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
c7d0: 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63  erBy );.      rc
c7e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c7f0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
c800: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
c810: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  ab, 0, 0, 0, aff
c820: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
c830: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c840: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c850: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c860: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
c870: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
c880: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
c890: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
c8a0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
c8b0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
c8c0: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
c8d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c8e0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
c8f0: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
c900: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
c910: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
c920: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
c930: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
c940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c950: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
c960: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
c970: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
c980: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
c990: 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74   0;.      nLimit
c9a0: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
c9b0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
c9c0: 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65  -1;.      nOffse
c9d0: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
c9e0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
c9f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
ca00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ca10: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
ca20: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
ca30: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
ca40: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
ca50: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
ca60: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
ca70: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
ca80: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
ca90: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
caa0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
cab0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
cac0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
cad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
cae0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
caf0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
cb00: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
cb10: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
cb20: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
cb30: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
cb40: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
cb50: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
cb60: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
cb70: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
cb80: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
cb90: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
cba0: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
cbb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
cbc0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
cbd0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
cbe0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cbf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
cc00: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
cc10: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
cc20: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
cc30: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
cc40: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
cc50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
cc60: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
cc70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cc80: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
cc90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
cca0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
ccb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ccc0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
ccd0: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
cce0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
ccf0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
cd00: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
cd10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
cd20: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
cd30: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
cd40: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
cd50: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
cd60: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
cd70: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
cd80: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
cdb0: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
cdc0: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
cdf0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
ce00: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
ce10: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
ce20: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ce30: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
ce40: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
ce50: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ce60: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
ce70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
ce90: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
cea0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
ceb0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cec0: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
ced0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cee0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cef0: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
cf00: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
cf10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
cf30: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
cf40: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
cf50: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
cf60: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
cf70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
cf80: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  it, nOffset;.   
cf90: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
cfa0: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
cfb0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
cfc0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
cfd0: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
cfe0: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
cff0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
d000: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
d010: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
d020: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
d030: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
d040: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
d050: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d060: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
d070: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
d080: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
d090: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
d0a0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
d0b0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
d0c0: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
d0d0: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
d0e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d0f0: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
d100: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d110: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d120: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d130: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
d140: 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 30  penTemp, tab1, 0
d150: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75  );.      rc = mu
d160: 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d  ltiSelectOpenTem
d170: 70 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a  pAddr(p, addr);.
d180: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d1a0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d1b0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d1c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
d1d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
d1e0: 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20  eyAsData, tab1, 
d1f0: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
d200: 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61  ( nAddr<sizeof(a
d210: 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64  Addr)/sizeof(aAd
d220: 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20  dr[0]) );.      
d230: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
d240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d250: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
d260: 6c 75 6d 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b  lumns, tab1, 0);
d270: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d280: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
d290: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
d2a0: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
d2b0: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
d2c0: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
d2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
d2e0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d2f0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
d300: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
d310: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  1, 0, 0, 0, aff)
d320: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d330: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d340: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d350: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d360: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
d370: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
d380: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d390: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
d3a0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d3c0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
d3d0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b2, 0);.      rc
d3e0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
d3f0: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
d400: 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
d410: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d420: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d430: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d460: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
d470: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  ab2, 1);.      a
d480: 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a  ssert( nAddr<siz
d490: 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f  eof(aAddr)/sizeo
d4a0: 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20  f(aAddr[0]) );. 
d4b0: 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72       aAddr[nAddr
d4c0: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
d4d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
d4e0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32  NumColumns, tab2
d4f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
d500: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d510: 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69   nLimit = p->nLi
d520: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  mit;.      p->nL
d530: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
d540: 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f   nOffset = p->nO
d550: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d560: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
d570: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d580: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
d590: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
d5a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
d5b0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
d5c0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
d5d0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69   p->nLimit = nLi
d5e0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  mit;.      p->nO
d5f0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
d600: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d610: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d620: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d630: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d640: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d650: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
d660: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
d670: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
d680: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
d690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
d6a0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d6b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
d6c0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
d6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
d6e0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
d6f0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
d700: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
d710: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
d720: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d730: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
d740: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
d750: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d770: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
d780: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
d790: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
d7a0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
d7b0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
d7c0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
d7d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7e0: 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30  FullKey, tab1, 0
d7f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d800: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d810: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
d820: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
d830: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
d840: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
d850: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
d860: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
d870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
d890: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
d8a0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
d8d0: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
d8e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d8f0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
d900: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d910: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d920: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d930: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d940: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
d950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d960: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
d970: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
d980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d990: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d9a0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d9b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d9c0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
d9d0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
d9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d9f0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
da00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
da10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
da20: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
da30: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
da40: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
da50: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
da60: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
da70: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
da80: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
da90: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
daa0: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
dab0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
dac0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
dad0: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
dae0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
daf0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
db00: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
db10: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
db20: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
db30: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
db40: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
db50: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
db60: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
db70: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
db80: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
db90: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
dba0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
dbb0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
dbc0: 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
dbd0: 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
dbe0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
dbf0: 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41 64  pr;.  while( nAd
dc00: 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64 64  dr>0 ){.    nAdd
dc10: 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r--;.    sqlite3
dc20: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
dc30: 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e 43  aAddr[nAddr], nC
dc40: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
dc50: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
dc60: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
dc70: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
dc80: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
dc90: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
dca0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
dcb0: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
dcc0: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
dcd0: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
dce0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
dcf0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
dd00: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
dd10: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
dd20: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
dd30: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
dd40: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
dd50: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
dd60: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
dd70: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
dd80: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
dd90: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
dda0: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
ddb0: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
ddc0: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
ddd0: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
dde0: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
ddf0: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
de00: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
de10: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
de20: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
de30: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
de40: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
de50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
de60: 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65  OrderBy || (pOpe
de70: 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65  nTemp && pOpenTe
de80: 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20  mp->nId>0) ){.  
de90: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
dec0: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
ded0: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
dee0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
def0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
df00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
df10: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
df20: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 3d 20 26  >ppOpenTemp == &
df30: 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a 20 20 20  pOpenTemp );.   
df40: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
df50: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
df60: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
df70: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
df80: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
df90: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
dfa0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
dfb0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
dfc0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
dfd0: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
dfe0: 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  o->enc = pParse-
dff0: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4b  >db->enc;.    pK
e000: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
e010: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
e020: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
e030: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
e040: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  o->aColl[i] = mu
e050: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e060: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
e070: 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79 49        if( !pKeyI
e080: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
e090: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
e0a0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  o->aColl[i] = pP
e0b0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
e0c0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
e0d0: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
e0e0: 20 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 69 3c   pOpenTemp && i<
e0f0: 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b 20  pOpenTemp->nId; 
e100: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
e110: 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f 50  p3type = (i==0?P
e120: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
e130: 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  F:P3_KEYINFO);. 
e140: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
e150: 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d 2e  pOpenTemp->a[i].
e160: 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  idx;.      sqlit
e170: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
e180: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
e190: 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79 70 65  pKeyInfo, p3type
e1a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e1b0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
e1c0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
e1d0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 72  prList_item *pOr
e1e0: 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d 3e 70  derByTerm = p->p
e1f0: 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
e200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e210: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
e220: 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79 54 65   i++, pOrderByTe
e230: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
e240: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
e250: 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78 70 72  derByTerm->pExpr
e260: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
e270: 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72 42 79  zName = pOrderBy
e280: 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Term->zName;.   
e290: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e2a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e2b0: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  N && pExpr->iCol
e2c0: 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  umn<nCol );.    
e2d0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
e2e0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 20  pExpr->pColl ); 
e2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
e300: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e310: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
e320: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
e330: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e  llSeq(pParse, zN
e340: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
e350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e360: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
e370: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
e380: 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
e390: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
e3a0: 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72     }.      gener
e3b0: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
e3c0: 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  se, p, v, p->pEL
e3d0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
e3e0: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d  t, iParm);.    }
e3f0: 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e  ..    if( !pOpen
e400: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Temp ){.      /*
e410: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   This happens fo
e420: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
e430: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
e440: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
e450: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  yInfo);.    }.  
e460: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
e470: 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e  end:.  if( pOpen
e480: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
e490: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
e4a0: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a  pOpenTemp);.  }.
e4b0: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
e4c0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
e4d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e4e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e4f0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
e500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e510: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61  T_VIEW./*.** Sca
e520: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
e530: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
e540: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
e550: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
e560: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
e570: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
e580: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
e590: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
e5a0: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
e5b0: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
e5c0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
e5d0: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
e5e0: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
e5f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e600: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
e610: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
e620: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
e630: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
e640: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e650: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
e660: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
e670: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
e680: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
e690: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
e6a0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
e6b0: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
e6c0: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
e6d0: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
e6e0: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
e6f0: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
e700: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
e710: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
e720: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
e730: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
e740: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
e750: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
e760: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
e770: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
e780: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
e790: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
e7a0: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
e7b0: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
e7c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
e7d0: 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
e7e0: 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
e7f0: 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64   *);  /* Forward
e800: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
e810: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
e820: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
e830: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
e840: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
e850: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
e860: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
e870: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e880: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e890: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
e8a0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
e8b0: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
e8c0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
e8d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e8e0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
e8f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
e900: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
e910: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
e920: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
e930: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e940: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
e950: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
e960: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
e970: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
e980: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
e990: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
e9a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
e9b0: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
e9c0: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
e9d0: 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
e9e0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
e9f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
ea00: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
ea10: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
ea20: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
ea30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
ea40: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
ea50: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
ea60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
ea70: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
ea80: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ea90: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
eaa0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
eab0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
eac0: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
ead0: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
eae0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
eaf0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
eb00: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
eb10: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
eb20: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
eb30: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
eb40: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
eb50: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
eb60: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
eb70: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
eb80: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
eb90: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
eba0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  span);.    }.  }
ebb0: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
ebc0: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
ebd0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ebe0: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
ebf0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
ec00: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ec10: 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74  .    substSelect
ec20: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
ec30: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ec40: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
ec50: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
ec60: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ec70: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
ec80: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
ec90: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
eca0: 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
ecb0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ecc0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
ecd0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
ece0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
ecf0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
ed00: 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
ed10: 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
ed20: 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
ed30: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
ed40: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
ed50: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
ed60: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
ed70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
ed80: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
ed90: 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
eda0: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  st(p->pEList, iT
edb0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
edc0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
edd0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
ede0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
edf0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
ee00: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
ee10: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
ee20: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
ee30: 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
ee40: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28  t);.  substExpr(
ee50: 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
ee60: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
ee70: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
ee80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
ee90: 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  W) */..#ifndef S
eea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
eeb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
eec0: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
eed0: 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
eee0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
eef0: 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
ef00: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
ef10: 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
ef20: 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
ef30: 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
ef40: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
ef50: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
ef60: 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
ef70: 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
ef80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
ef90: 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
efa0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
efb0: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
efc0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
efd0: 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
efe0: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
eff0: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
f000: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
f010: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
f020: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
f030: 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
f040: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
f050: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
f060: 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
f070: 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
f080: 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
f090: 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
f0a0: 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
f0b0: 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
f0c0: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
f0d0: 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
f0e0: 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
f0f0: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
f100: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
f110: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f120: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
f130: 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
f140: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
f150: 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
f160: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
f170: 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
f180: 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
f190: 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
f1a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
f1b0: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
f1c0: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
f1d0: 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
f1e0: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
f1f0: 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
f200: 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
f210: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
f220: 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
f230: 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
f240: 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
f250: 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
f260: 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
f270: 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
f280: 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
f290: 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
f2a0: 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
f2b0: 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
f2c0: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
f2d0: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
f2e0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
f2f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
f300: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
f310: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f320: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
f330: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
f340: 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
f350: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
f360: 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
f370: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
f380: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
f390: 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
f3a0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
f3b0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
f3c0: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
f3d0: 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
f3e0: 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
f3f0: 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
f400: 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
f410: 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
f420: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f430: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
f440: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f450: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
f460: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
f470: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
f480: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
f490: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
f4a0: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
f4b0: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
f4c0: 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
f4d0: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
f4e0: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
f4f0: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
f500: 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
f510: 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
f520: 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
f530: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
f540: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
f550: 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
f560: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
f570: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
f580: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
f590: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
f5a0: 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
f5b0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f5c0: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
f5d0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
f5e0: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
f5f0: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
f600: 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
f610: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
f620: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
f630: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f640: 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
f650: 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
f660: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
f670: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
f680: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f690: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
f6a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f6b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
f6c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f6d0: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
f6e0: 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
f6f0: 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
f700: 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
f710: 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
f720: 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
f730: 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
f740: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
f750: 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
f760: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
f770: 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
f780: 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
f790: 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
f7a0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
f7b0: 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
f7c0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f7d0: 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
f7e0: 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
f7f0: 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
f800: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
f810: 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
f820: 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
f830: 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
f840: 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
f850: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
f860: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
f870: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f880: 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
f890: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
f8a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
f8b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
f8c0: 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
f8d0: 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
f8e0: 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
f8f0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
f900: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
f910: 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
f920: 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
f930: 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
f940: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
f950: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
f960: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
f970: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
f980: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
f990: 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
f9a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
f9b0: 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
f9c0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
f9d0: 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
f9e0: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
f9f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
fa00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
fa10: 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
fa20: 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
fa30: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
fa40: 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
fa50: 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
fa60: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
fa70: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
fa80: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
fa90: 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
faa0: 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
fab0: 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
fac0: 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
fad0: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
fae0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
faf0: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
fb00: 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
fb10: 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
fb20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
fb30: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
fb40: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
fb50: 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
fb60: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
fb70: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
fb80: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
fb90: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
fba0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
fbb0: 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
fbc0: 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
fbd0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
fbe0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fbf0: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
fc00: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fc20: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
fc30: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
fc40: 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
fc50: 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
fc60: 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43  query */..  /* C
fc70: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
fc80: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
fc90: 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
fca0: 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
fcb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
fcc0: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
fcd0: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
fce0: 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
fcf0: 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
fd00: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
fd10: 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
fd20: 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d  iFrom];.  pSub =
fd30: 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
fd40: 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
fd50: 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
fd60: 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
fd70: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
fd80: 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  ;.  if( subquery
fd90: 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
fda0: 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
fdb0: 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ;.  pSubSrc = pS
fdc0: 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
fdd0: 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
fde0: 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
fdf0: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
fe00: 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69  ;.  if( (pSub->i
fe10: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
fe20: 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  b->nLimit>=0) &&
fe30: 20 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20    (pSrc->nSrc>1 
fe40: 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
fe50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
fe60: 20 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74    if( (p->isDist
fe70: 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69  inct || p->nLimi
fe80: 74 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65 72  t>=0) && subquer
fe90: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
fea0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  0;.  if( p->pOrd
feb0: 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
fec0: 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
fed0: 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  0;..  /* Restric
fee0: 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
fef0: 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
ff00: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
ff10: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
ff20: 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
ff30: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
ff40: 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
ff50: 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
ff60: 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
ff70: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
ff80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
ff90: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
ffa0: 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
ffb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
ffc0: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
ffd0: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
ffe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
fff0: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
10000 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
10010 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
10020 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
10030 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
10040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
10050 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69  Src->nSrc>1 && i
10060 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
10070 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
10080 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
10090 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
100a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
100b0 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
100c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
100d0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
100e0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
100f0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
10100 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
10110 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
10120 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
10130 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
10140 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
10150 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
10160 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
10170 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
10180 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
10190 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
101a0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
101b0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
101c0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
101d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
101e0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
101f0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
10200 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
10210 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
10220 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
10230 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
10240 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
10250 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
10260 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
10270 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
10280 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
10290 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  .  if( iFrom>0 &
102a0 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
102b0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
102c0 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
102d0 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65     && pSub->pWhe
102e0 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
102f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
10300 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
10310 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
10320 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
10330 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
10340 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
10350 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
10360 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
10370 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
10380 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
10390 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
103a0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
103b0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
103c0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
103d0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
103e0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
103f0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
10400 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
10410 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
10420 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
10430 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
10440 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
10450 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
10460 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
10470 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
10480 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
10490 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
104a0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
104b0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
104c0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
104d0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
104e0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
104f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
10500 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
10510 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
10520 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
10530 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
10540 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
10550 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
10560 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
10570 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
10580 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
10590 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
105a0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
105b0 70 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  pe;.    Table *p
105c0 54 61 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Tab = pSubitem->
105d0 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70  pTab;..    if( p
105e0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 73 54  Tab && pTab->isT
105f0 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
10600 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
10610 61 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d  able(0, pSubitem
10620 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->pTab);.    }. 
10630 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
10640 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
10650 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
10660 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  ee(pSubitem->zNa
10670 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
10680 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ree(pSubitem->zA
10690 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e  lias);.    if( n
106a0 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
106b0 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53    int extra = nS
106c0 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20  ubSrc - 1;.     
106d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62   for(i=1; i<nSub
106e0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
106f0 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
10700 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
10710 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Src, 0, 0);.    
10720 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72    }.      p->pSr
10730 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20  c = pSrc;.      
10740 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
10750 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72  -1; i-extra>=iFr
10760 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  om; i--){.      
10770 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70    pSrc->a[i] = p
10780 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b  Src->a[i-extra];
10790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
107a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
107b0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
107c0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
107d0 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
107e0 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
107f0 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
10800 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
10810 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
10820 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
10830 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e  From+nSubSrc-1].
10840 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
10850 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ype;.  }..  /* N
10860 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
10870 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
10880 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
10890 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20  sions for .  ** 
108a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
108b0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
108c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
108d0 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65  ** .  ** Example
108e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
108f0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
10900 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
10910 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
10920 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
10930 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20  >b;.  **   \    
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
10960 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
10970 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
10980 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
10990 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
109a0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
109b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
109c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a  _________/.  **.
109d0 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
109e0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
109f0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
10a00 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
10a10 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20  ace we see.  ** 
10a20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
10a30 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
10a40 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
10a50 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
10a60 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20   "y+10"..  */.  
10a70 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10a80 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
10a90 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10aa0 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45  .  pList = p->pE
10ab0 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
10ac0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
10ad0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
10ae0 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  *pExpr;.    if( 
10af0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
10b00 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d  e==0 && (pExpr =
10b10 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
10b20 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29  pr)->span.z!=0 )
10b30 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  {.      pList->a
10b40 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
10b50 74 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d  teStrNDup(pExpr-
10b60 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
10b70 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  span.n);.    }. 
10b80 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29   }.  if( isAgg )
10b90 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
10ba0 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
10bb0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
10bc0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
10bd0 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
10be0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
10bf0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
10c00 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
10c10 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
10c20 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
10c30 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
10c40 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
10c50 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
10c60 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
10c70 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
10c80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
10c90 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
10ca0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
10cb0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10cc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
10cd0 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
10ce0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
10cf0 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68  xprDup(pSub->pWh
10d00 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ere);.  }else{. 
10d10 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
10d20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72   }.  if( subquer
10d30 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73  yIsAgg ){.    as
10d40 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67  sert( p->pHaving
10d50 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48  ==0 );.    p->pH
10d60 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72  aving = p->pWher
10d70 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  e;.    p->pWhere
10d80 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73   = pWhere;.    s
10d90 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
10da0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
10db0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
10dc0 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
10dd0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e  lite3ExprAnd(p->
10de0 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33  pHaving, sqlite3
10df0 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48  ExprDup(pSub->pH
10e00 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73  aving));.    ass
10e10 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
10e20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
10e30 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
10e40 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
10e50 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
10e60 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
10e70 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
10e80 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
10e90 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57  List);.    p->pW
10ea0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
10eb0 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c  prAnd(p->pWhere,
10ec0 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20   pWhere);.  }.. 
10ed0 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
10ee0 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
10ef0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
10f00 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
10f10 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
10f20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
10f30 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  */.  p->isDistin
10f40 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
10f50 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69  ct || pSub->isDi
10f60 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72  stinct;..  /* Tr
10f70 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d 69 74  ansfer the limit
10f80 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
10f90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
10fa0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20   the outer.  ** 
10fb0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  query..  */.  if
10fc0 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d  ( pSub->nLimit>=
10fd0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
10fe0 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20  nLimit<0 ){.    
10ff0 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53    p->nLimit = pS
11000 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->nLimit;.    
11010 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69  }else if( p->nLi
11020 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e  mit+p->nOffset >
11030 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53   pSub->nLimit+pS
11040 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20  ub->nOffset ){. 
11050 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
11060 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20   pSub->nLimit + 
11070 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20  pSub->nOffset - 
11080 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->nOffset;.    
11090 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73  }.  }.  p->nOffs
110a0 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66  et += pSub->nOff
110b0 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  set;..  /* Finia
110c0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
110d0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
110e0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
110f0 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
11100 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11110 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
11120 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
11130 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11140 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
11150 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
11160 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11170 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
11180 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
11190 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
111a0 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
111b0 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
111c0 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
111d0 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
111e0 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
111f0 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
11200 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
11210 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
11220 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
11230 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
11240 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
11250 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
11260 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
11270 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
11280 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
11290 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
112a0 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
112b0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
112c0 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
112d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
112e0 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
112f0 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
11300 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
11310 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
11320 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
11330 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
11340 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
11350 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
11360 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
11370 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
11380 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
11390 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
113a0 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
113b0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
113c0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
113d0 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
113e0 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
113f0 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
11400 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
11410 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
11420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
11430 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
11440 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
11450 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
11460 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
11470 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
11480 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
11490 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
114a0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
114b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
114c0 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
114d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
114e0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
114f0 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
11500 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
11510 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
11520 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
11530 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
11540 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
11550 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
11560 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
11570 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
11580 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
11590 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
115a0 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
115b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
115c0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
115d0 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
115e0 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
115f0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
11600 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
11610 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
11620 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
11630 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
11640 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
11650 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
11660 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
11670 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
11680 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
11690 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
116a0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
116b0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
116c0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
116d0 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
116e0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
116f0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
11700 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
11710 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
11720 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
11730 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
11740 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
11750 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11760 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
11770 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
11780 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
11790 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  3StrNICmp(pExpr-
117a0 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33  >token.z,"min",3
117b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
117c0 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a  Op = OP_Rewind;.
117d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
117e0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
117f0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
11800 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
11810 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
11820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
11830 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
11840 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  pr = pList->a[0]
11850 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
11860 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
11870 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
11880 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
11890 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  Column;.  pTab =
118a0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
118b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
118c0 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
118d0 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
118e0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
118f0 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
11900 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
11910 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
11920 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
11930 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
11940 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
11950 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
11960 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
11970 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
11980 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
11990 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
119a0 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
119b0 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
119c0 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
119d0 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
119e0 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
119f0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
11a00 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
11a10 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53  }else{.    CollS
11a20 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
11a30 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
11a40 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
11a50 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
11a60 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11a70 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11a80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11a90 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
11aa0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
11ab0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
11ac0 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e  ==iCol && pIdx->
11ad0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
11ae0 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ==pColl ) break;
11af0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11b00 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Idx==0 ) return 
11b10 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65  0;.  }..  /* Ide
11b20 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70  ntify column typ
11b30 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
11b40 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62   using the callb
11b50 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
11b60 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
11b70 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
11b80 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
11b90 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
11ba0 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c  ll..  ** The col
11bb0 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61  umn names have a
11bc0 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
11bd0 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c  rated in the cal
11be0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ling function.. 
11bf0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11c00 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11c10 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
11c20 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49  eturn 0;..  /* I
11c30 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
11c40 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
11c50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
11c60 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
11c70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
11c80 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
11c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11ca0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
11cb0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
11cc0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11cd0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
11ce0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
11cf0 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
11d00 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
11d10 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
11d20 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
11d30 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
11d40 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11d50 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
11d60 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
11d70 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
11d80 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
11d90 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
11da0 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
11db0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11dc0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
11dd0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
11de0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
11df0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
11e00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
11e10 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11e20 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29  arse, pTab->iDb)
11e30 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d  ;.  base = pSrc-
11e40 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
11e50 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11e60 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11e70 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  );.  if( pSrc->a
11e80 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [0].pSelect==0 )
11e90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  {.    sqlite3Ope
11ea0 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67  nTableForReading
11eb0 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62 29 3b  (v, base, pTab);
11ec0 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71  .  }.  cont = sq
11ed0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11ee0 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64  el(v);.  if( pId
11ef0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
11f00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11f10 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
11f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
11f30 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
11f40 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
11f50 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
11f60 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
11f70 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
11f80 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
11f90 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
11fa0 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
11fb0 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
11fc0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
11fd0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
11fe0 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
11ff0 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
12000 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
12010 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
12020 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
12030 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
12040 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
12050 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
12060 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
12070 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70  dx;.    iIdx = p
12080 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
120a0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
120b0 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
120c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
120d0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
120e0 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
120f0 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
12100 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
12110 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c  )&pIdx->keyInfo,
12120 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
12130 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
12140 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
12150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12160 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12170 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
12180 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12190 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
121a0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65  1, 0);.      see
121b0 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b  kOp = OP_MoveGt;
121c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
121d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
121e0 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b  eekOp, iIdx, 0);
121f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12200 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
12210 65 63 6e 6f 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ecno, iIdx, 0);.
12220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12230 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
12240 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
12250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12260 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
12270 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
12280 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
12290 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
122a0 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
122b0 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
122c0 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
122d0 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
122e0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
122f0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
12300 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
12310 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
12320 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
12330 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a  cont, cont, 0);.
12340 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12350 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
12360 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
12370 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
12380 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
12390 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
123a0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
123b0 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
123c0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
123d0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
123e0 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
123f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
12400 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
12410 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
12420 47 52 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69  GROUP BY is a li
12430 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
12440 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65  s.  If any expre
12450 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69  ssion.** is an i
12460 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c  nteger constant,
12470 20 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65   then that expre
12480 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65  ssion is replace
12490 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72  d by the.** corr
124a0 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20  esponding entry 
124b0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
124c0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
124d0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
124e0 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
124f0 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
12500 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   Name context of
12510 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12520 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72  ement. */.  Expr
12530 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
12540 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
12550 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
12560 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
12570 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
12580 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
12590 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52  /* Either "ORDER
125a0 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73  " or "GROUP", as
125b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
125c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
125d0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
125e0 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20   pNC->pEList;   
125f0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
12600 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
12610 54 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  T */.  Parse *pP
12620 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
12630 73 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  se;     /* The r
12640 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
12650 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73   SELECT */.  ass
12660 65 72 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a  ert( pEList );..
12670 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
12680 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12690 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
126a0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
126b0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  {.    int iCol;.
126c0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
126d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
126e0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
126f0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12700 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
12710 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30        if( iCol>0
12720 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
12730 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
12740 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
12750 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
12760 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
12770 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
12780 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
12790 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70  ist->a[iCol-1].p
127a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
127b0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
127c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
127d0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
127e0 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  "%s BY column nu
127f0 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
12800 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
12810 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
12820 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
12830 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70  , zType, iCol, p
12840 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
12850 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
12860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12870 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12880 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70  prResolveNames(p
12890 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  NC, pE) ){.     
128a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
128b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
128c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
128d0 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  E) ){.      sqli
128e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
128f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  se,.          "%
12900 73 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20  s BY terms must 
12910 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67  not be non-integ
12920 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a  er constants", z
12930 54 79 70 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Type);.      ret
12940 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
12950 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12960 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12970 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20  ne resolves any 
12980 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68  names used in th
12990 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
129a0 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20  the.** supplied 
129b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
129c0 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  . If the SELECT 
129d0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
129e0 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61  resolved.** is a
129f0 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65   sub-select, the
12a00 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20  n pOuterNC is a 
12a10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e  pointer to the N
12a20 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f  ameContext .** o
12a30 66 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c  f the parent SEL
12a40 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ECT..*/.int sqli
12a50 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
12a60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12a70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
12a80 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
12a90 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ab0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
12ac0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
12ad0 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
12ae0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
12af0 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20   The outer name 
12b00 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20  context. May be 
12b10 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78  NULL. */.){.  Ex
12b20 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
12b30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12b40 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74  lt set. */.  int
12b50 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
12b60 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c          /* For-l
12b70 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65  oop variable use
12b80 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  d in multiple pl
12b90 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  aces */.  NameCo
12ba0 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
12bb0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61       /* Local na
12bc0 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20  me-context */.. 
12bd0 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
12be0 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
12bf0 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  re, return immed
12c00 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28  iately. */.  if(
12c10 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29   p->isResolved )
12c20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
12c30 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72  OuterNC );.    r
12c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12c50 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f  .  }.  p->isReso
12c60 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  lved = 1;..  /* 
12c70 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c  If there have al
12c80 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72  ready been error
12c90 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  s, do nothing. *
12ca0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
12cb0 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
12cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12cd0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  R;.  }..  /* Pre
12ce0 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20  pare the select 
12cf0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
12d00 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61  call will alloca
12d10 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20  te all cursors. 
12d20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20   ** required to 
12d30 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65  handle the table
12d40 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
12d50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12d60 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
12d70 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
12d80 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12da0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
12db0 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c  Set up the local
12dc0 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f   name-context to
12dd0 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73   pass to ExprRes
12de0 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 20 20 2a 2f  olveNames().  */
12df0 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70  .  sNC.pNext = p
12e00 4f 75 74 65 72 4e 43 3b 0a 20 20 73 4e 43 2e 70  OuterNC;.  sNC.p
12e10 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
12e20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
12e30 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
12e40 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
12e50 73 4e 43 2e 68 61 73 41 67 67 20 3d 20 30 3b 0a  sNC.hasAgg = 0;.
12e60 20 20 73 4e 43 2e 6e 45 72 72 20 3d 20 30 3b 0a    sNC.nErr = 0;.
12e70 20 20 73 4e 43 2e 6e 52 65 66 20 3d 20 30 3b 0a    sNC.nRef = 0;.
12e80 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 30    sNC.pEList = 0
12e90 3b 0a 0a 20 20 2f 2a 20 4e 61 6d 65 43 6f 6e 74  ;..  /* NameCont
12ea0 65 78 74 2e 6e 44 65 70 74 68 20 73 74 6f 72 65  ext.nDepth store
12eb0 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 72  s the depth of r
12ec0 65 63 75 72 73 69 6f 6e 20 66 6f 72 20 74 68 69  ecursion for thi
12ed0 73 20 71 75 65 72 79 2e 20 46 6f 72 0a 20 20 2a  s query. For.  *
12ee0 2a 20 61 6e 20 6f 75 74 65 72 20 71 75 65 72 79  * an outer query
12ef0 20 28 65 2e 67 2e 20 53 45 4c 45 43 54 20 2a 20   (e.g. SELECT * 
12f00 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
12f10 65 72 29 20 74 68 69 73 20 69 73 20 31 2e 20 46  er) this is 1. F
12f20 6f 72 0a 20 20 2a 2a 20 61 20 73 75 62 71 75 65  or.  ** a subque
12f30 72 79 20 69 74 20 69 73 20 32 2e 20 46 6f 72 20  ry it is 2. For 
12f40 61 20 73 75 62 71 75 65 72 79 20 6f 66 20 61 20  a subquery of a 
12f50 73 75 62 71 75 65 72 79 2c 20 33 2e 20 41 6e 64  subquery, 3. And
12f60 20 73 6f 20 6f 6e 2e 20 0a 20 20 2a 2a 20 50 61   so on. .  ** Pa
12f70 72 73 65 2e 6e 4d 61 78 44 65 70 74 68 20 69 73  rse.nMaxDepth is
12f80 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 70   the maximum dep
12f90 74 68 20 66 6f 72 20 61 6e 79 20 73 75 62 71 75  th for any subqu
12fa0 65 72 79 20 72 65 73 6f 6c 76 65 64 20 73 6f 0a  ery resolved so.
12fb0 20 20 2a 2a 20 66 61 72 2e 20 54 68 69 73 20 69    ** far. This i
12fc0 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
12fd0 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
12fe0 66 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  f aggregate cont
12ff0 65 78 74 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  exts.  ** requir
13000 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 20  ed at runtime.. 
13010 20 2a 2f 0a 20 20 73 4e 43 2e 6e 44 65 70 74 68   */.  sNC.nDepth
13020 20 3d 20 28 70 4f 75 74 65 72 4e 43 3f 70 4f 75   = (pOuterNC?pOu
13030 74 65 72 4e 43 2d 3e 6e 44 65 70 74 68 2b 31 3a  terNC->nDepth+1:
13040 31 29 3b 0a 20 20 69 66 28 20 73 4e 43 2e 6e 44  1);.  if( sNC.nD
13050 65 70 74 68 3e 70 50 61 72 73 65 2d 3e 6e 4d 61  epth>pParse->nMa
13060 78 44 65 70 74 68 20 29 7b 0a 20 20 20 20 70 50  xDepth ){.    pP
13070 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 20  arse->nMaxDepth 
13080 3d 20 73 4e 43 2e 6e 44 65 70 74 68 3b 0a 20 20  = sNC.nDepth;.  
13090 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
130a0 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
130b0 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
130c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
130d0 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
130e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
130f0 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
13100 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
13110 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
13120 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
13130 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13140 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13150 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
13160 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
13170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13180 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
13190 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
131a0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
131b0 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
131c0 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
131d0 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
131e0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
131f0 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
13200 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
13210 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
13220 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
13230 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
13240 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  ;.  if( p->pGrou
13250 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
13260 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
13270 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
13280 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
13290 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
132a0 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
132b0 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
132c0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
132d0 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
132e0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
132f0 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
13300 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
13310 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13320 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
13330 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
13340 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
13350 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65  HAVING");.    re
13360 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13370 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  R;.  }..  /* Add
13380 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13390 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
133a0 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
133b0 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  parsing the.  **
133c0 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
133d0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
133e0 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
133f0 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a   is so that.  **
13400 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
13410 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13420 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65   (etc.) can refe
13430 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  r to expressions
13440 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73   by.  ** aliases
13450 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
13460 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69  et..  **.  ** Mi
13470 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
13480 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
13490 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
134a0 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
134b0 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
134c0 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
134d0 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73   to it..  */.  s
134e0 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
134f0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
13500 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13510 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
13520 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73  here) ||.      s
13530 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13540 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
13550 70 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20  pHaving) ||.    
13560 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
13570 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70  oupBy(&sNC, p->p
13580 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
13590 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
135a0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
135b0 73 4e 43 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  sNC, p->pGroupBy
135c0 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a  , "GROUP").  ){.
135d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
135e0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
135f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
13610 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
13620 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 20 69  llowing struct i
13630 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  s used by sqlite
13640 33 53 65 6c 65 63 74 28 29 0a 2a 2a 20 74 6f 20  3Select().** to 
13650 73 61 76 65 20 61 67 67 72 65 67 61 74 65 20 72  save aggregate r
13660 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  elated informati
13670 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  on from the Pars
13680 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 74 20 74  e object.** at t
13690 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
136a0 20 63 61 6c 6c 20 61 6e 64 20 74 6f 20 72 65 73   call and to res
136b0 74 6f 72 65 20 69 74 20 61 74 20 74 68 65 20 65  tore it at the e
136c0 6e 64 2e 20 53 65 65 0a 2a 2a 20 73 61 76 65 41  nd. See.** saveA
136d0 67 67 72 65 67 61 74 65 49 6e 66 6f 28 29 20 61  ggregateInfo() a
136e0 6e 64 20 72 65 73 74 6f 72 65 41 67 67 72 65 67  nd restoreAggreg
136f0 61 74 65 49 6e 66 6f 28 29 2e 0a 2a 2f 20 0a 73  ateInfo()..*/ .s
13700 74 72 75 63 74 20 41 67 67 72 65 67 61 74 65 49  truct AggregateI
13710 6e 66 6f 20 7b 0a 20 20 75 38 20 75 73 65 41 67  nfo {.  u8 useAg
13720 67 3b 0a 20 20 69 6e 74 20 6e 41 67 67 3b 0a 20  g;.  int nAgg;. 
13730 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a   AggExpr *aAgg;.
13740 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  };.typedef struc
13750 74 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20  t AggregateInfo 
13760 41 67 67 72 65 67 61 74 65 49 6e 66 6f 3b 0a 0a  AggregateInfo;..
13770 2f 2a 20 0a 2a 2a 20 43 6f 70 79 20 61 67 67 72  /* .** Copy aggr
13780 65 67 61 74 65 20 72 65 6c 61 74 65 64 20 69 6e  egate related in
13790 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
137a0 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
137b0 72 65 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 41  re.** into the A
137c0 67 67 72 65 67 61 74 65 49 6e 66 6f 20 73 74 72  ggregateInfo str
137d0 75 63 74 75 72 65 2e 20 5a 65 72 6f 20 74 68 65  ucture. Zero the
137e0 20 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74   aggregate relat
137f0 65 64 0a 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20  ed.** values in 
13800 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
13810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13820 20 73 61 76 65 41 67 67 72 65 67 61 74 65 49 6e   saveAggregateIn
13830 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
13840 2c 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20  , AggregateInfo 
13850 2a 70 49 6e 66 6f 29 7b 0a 20 20 70 49 6e 66 6f  *pInfo){.  pInfo
13860 2d 3e 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d  ->aAgg = pParse-
13870 3e 61 41 67 67 3b 0a 20 20 70 49 6e 66 6f 2d 3e  >aAgg;.  pInfo->
13880 6e 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nAgg = pParse->n
13890 41 67 67 3b 0a 20 20 70 49 6e 66 6f 2d 3e 75 73  Agg;.  pInfo->us
138a0 65 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 75  eAgg = pParse->u
138b0 73 65 41 67 67 3b 0a 20 20 70 50 61 72 73 65 2d  seAgg;.  pParse-
138c0 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61  >aAgg = 0;.  pPa
138d0 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20  rse->nAgg = 0;. 
138e0 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
138f0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 0;.}../*.** Co
13900 70 79 20 61 67 67 72 65 67 61 74 65 20 72 65 6c  py aggregate rel
13910 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ated information
13920 20 66 72 6f 6d 20 74 68 65 20 41 67 67 72 65 67   from the Aggreg
13930 61 74 65 49 6e 66 6f 20 73 74 72 75 63 74 0a 2a  ateInfo struct.*
13940 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  * back into the 
13950 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
13960 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 72   The aggregate r
13970 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  elated informati
13980 6f 6e 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  on.** currently 
13990 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61  stored in the Pa
139a0 72 73 65 20 73 74 72 75 63 74 75 72 65 20 69 73  rse structure is
139b0 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
139c0 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65  tic void restore
139d0 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 50 61  AggregateInfo(Pa
139e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
139f0 72 65 67 61 74 65 49 6e 66 6f 20 2a 70 49 6e 66  regateInfo *pInf
13a00 6f 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  o){.  sqliteFree
13a10 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b 0a  (pParse->aAgg);.
13a20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
13a30 20 70 49 6e 66 6f 2d 3e 61 41 67 67 3b 0a 20 20   pInfo->aAgg;.  
13a40 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 70  pParse->nAgg = p
13a50 49 6e 66 6f 2d 3e 6e 41 67 67 3b 0a 20 20 70 50  Info->nAgg;.  pP
13a60 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 70  arse->useAgg = p
13a70 49 6e 66 6f 2d 3e 75 73 65 41 67 67 3b 0a 7d 0a  Info->useAgg;.}.
13a80 20 20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74    ./*.** Generat
13a90 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
13aa0 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
13ab0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
13ac0 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
13ad0 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
13ae0 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
13af0 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ng on the.** val
13b00 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  ue of eDest and 
13b10 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
13b20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20   eDest Value    
13b30 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
13b40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
13b50 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
13b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
13b80 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
13b90 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
13ba0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
13bb0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
13bc0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
13bd0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
13be0 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
13bf0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
13c00 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
13c10 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
13c20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
13c30 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69   keys of table i
13c40 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
13c50 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
13c60 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
13c70 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
13c80 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
13c90 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
13ca0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
13cb0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
13cc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
13cd0 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
13ce0 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
13cf0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
13d00 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
13d10 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
13d20 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76  * The table abov
13d30 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e  e is incomplete.
13d40 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69    Additional eDi
13d50 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65  st value have be
13d60 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20   added.** since 
13d70 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
13d80 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74   written.  See t
13d90 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
13da0 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
13db0 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20  r.** a complete 
13dc0 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61  listing of the a
13dd0 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
13de0 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
13df0 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
13e00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
13e10 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
13e20 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
13e30 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
13e40 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
13e50 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
13e60 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
13e70 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
13e80 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
13e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13ea0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
13eb0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
13ec0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
13ed0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
13ee0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
13ef0 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
13f00 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
13f10 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
13f20 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
13f30 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
13f40 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
13f50 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
13f60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13f70 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
13f80 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
13f90 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
13fa0 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
13fb0 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
13fc0 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
13fd0 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
13fe0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
13ff0 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
14000 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
14010 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
14020 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
14030 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
14040 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
14050 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
14060 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
14070 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
14080 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
14090 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
140a0 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
140b0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
140c0 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
140d0 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
140e0 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
140f0 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
14110 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
14120 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
14130 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20   /.**     \     
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
14180 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14190 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
141a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
141b0 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
141c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
141d0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
141e0 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
141f0 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
14200 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
14210 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
14220 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
14230 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
14240 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
14250 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
14260 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
14270 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
14280 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
14290 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
142a0 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
142b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
142c0 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
142d0 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
142e0 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
142f0 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
14300 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
14310 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
14320 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
14330 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
14340 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
14350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
14360 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
14370 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
14380 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
14390 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
143a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
143b0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
143c0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
143d0 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
143e0 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
143f0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
14400 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
14410 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
14420 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
14430 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73  * A parameter us
14440 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20  ed by the eDest 
14450 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
14460 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
14470 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
14480 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
14490 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
144a0 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
144b0 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
144c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
144d0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
144e0 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
144f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
14500 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
14510 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
14520 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
14530 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
14540 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
14550 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
14560 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
14570 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
14580 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  g */.){.  int i;
14590 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
145a0 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
145b0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
145c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
145d0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
145e0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
145f0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
14600 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
14610 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
14620 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
14630 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
14640 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
14650 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
14660 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
14670 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
14680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
14690 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
146a0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
146b0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
146c0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
146d0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
146e0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
146f0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
14700 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
14710 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
14720 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
14730 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
14740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
14750 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
14760 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
14770 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
14780 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14790 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
147a0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
147b0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
147c0 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
147d0 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
147e0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
147f0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
14800 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
14810 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
14820 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
14830 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 72 65 67 61  ion */.  Aggrega
14840 74 65 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  teInfo sAggInfo;
14850 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
14860 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c  malloc_failed ||
14870 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
14880 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   p==0 ) return 1
14890 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
148a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
148b0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
148c0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
148d0 6e 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  n 1;..#ifndef SQ
148e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
148f0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
14900 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
14910 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
14920 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
14930 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
14940 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
14950 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
14960 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
14970 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
14980 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
14990 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 61 76   }.#endif..  sav
149a0 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 70  eAggregateInfo(p
149b0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
149c0 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
149d0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
149e0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  f( eDest==SRT_Un
149f0 69 6f 6e 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ion || eDest==SR
14a00 54 5f 45 78 63 65 70 74 20 7c 7c 20 65 44 65 73  T_Except || eDes
14a10 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
14a20 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  {.    p->pOrderB
14a30 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
14a40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
14a50 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
14a60 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
14a70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
14a80 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
14a90 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
14aa0 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
14ab0 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
14ac0 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
14ad0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
14ae0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
14af0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
14b00 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
14b10 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
14b20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
14b30 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d  aving;.  isAgg =
14b40 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44   p->isAgg;.  isD
14b50 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
14b60 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73  istinct;.  pELis
14b70 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
14b80 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
14b90 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
14ba0 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
14bb0 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
14bc0 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
14bd0 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
14be0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
14bf0 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
14c00 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
14c10 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
14c20 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
14c30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
14c40 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
14c50 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
14c60 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
14c70 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
14c80 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
14c90 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
14ca0 0a 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74  .  assert( eDest
14cb0 21 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  !=SRT_Exists || 
14cc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
14cd0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
14ce0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14cf0 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
14d00 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
14d10 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
14d20 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
14d30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14d40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
14d50 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
14d60 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
14d70 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
14d80 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
14d90 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
14da0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
14db0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
14dc0 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  f..  /* ORDER BY
14dd0 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
14de0 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
14df0 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
14e00 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
14e10 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20  ase SRT_Union:. 
14e20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
14e30 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  pt:.    case SRT
14e40 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20  _Discard:.      
14e50 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
14e60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
14e70 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72  efault:.      br
14e80 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  eak;.  }..  /* B
14e90 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
14ea0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
14eb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14ec0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14ed0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
14ee0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65  t_end;..  /* Ide
14ef0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
14f00 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
14f10 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
14f20 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
14f30 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
14f40 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
14f50 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
14f60 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
14f70 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
14f80 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
14f90 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
14fa0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
14fb0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
14fc0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
14fd0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14fe0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
14ff0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
15000 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
15010 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15020 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15030 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
15040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
15050 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
15060 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
15070 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
15080 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
15090 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
150a0 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43  int needRestoreC
150b0 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69 66 28  ontext;..    if(
150c0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
150d0 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e  pSelect==0 ) con
150e0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
150f0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
15100 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
15110 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
15120 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
15130 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  hContext;.      
15140 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
15150 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73 74 2d  text = pTabList-
15160 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
15170 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
15180 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
15190 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
151a0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
151b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
151c0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
151d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  se, pTabList->a[
151e0 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  i].pSelect, SRT_
151f0 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20 20  TempTable, .    
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
15210 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
15220 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67  sor, p, i, &isAg
15230 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  g, 0);.    if( n
15240 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
15250 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  t ){.      pPars
15260 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
15270 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
15280 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
15290 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
152a0 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  c;.    pWhere = 
152b0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69  p->pWhere;.    i
152c0 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55 6e  f( eDest!=SRT_Un
152d0 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53 52  ion && eDest!=SR
152e0 54 5f 45 78 63 65 70 74 20 26 26 20 65 44 65 73  T_Except && eDes
152f0 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t!=SRT_Discard )
15300 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
15310 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
15320 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70      }.    pGroup
15330 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
15340 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20  ;.    pHaving = 
15350 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20  p->pHaving;.    
15360 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
15370 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  isDistinct;.  }.
15380 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
15390 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
153a0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
153b0 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
153c0 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
153d0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
153e0 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
153f0 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
15400 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
15410 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
15420 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
15430 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
15440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
15450 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
15460 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
15470 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
15480 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
15490 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
154a0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
154b0 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
154c0 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
154d0 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
154e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
154f0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
15500 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
15510 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
15520 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
15530 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
15540 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
15550 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
15560 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
15570 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
15580 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
15590 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
155a0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
155b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
155c0 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20  clause, resolve 
155d0 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
155e0 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d  quences.  ** nam
155f0 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
15600 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  n explicitly spe
15610 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  cified..  */.  i
15620 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
15630 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
15640 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
15650 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
15660 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e  OrderBy->a[i].zN
15670 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ame ){.        p
15680 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
15690 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20  xpr->pColl = .  
156a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
156b0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
156c0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
156d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29  >a[i].zName, -1)
156e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
156f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
15700 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f  nErr ){.      go
15710 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
15720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
15730 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
15740 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69    */.  computeLi
15750 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
15760 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49  rse, p);..  /* I
15770 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
15780 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
15790 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
157a0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
157b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
157c0 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
157d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
157e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
157f0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
15800 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
15810 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
15820 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
15830 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
15840 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  pr);.  }..  /* D
15850 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
15860 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65   aggregate expre
15870 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
15880 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f  f( isAgg || pGro
15890 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65  upBy ){.    asse
158a0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  rt( pParse->nAgg
158b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67  ==0 );.    isAgg
158c0 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 1;.    for(i=
158d0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
158e0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
158f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
15900 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
15910 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
15920 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
15930 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
15940 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
15950 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15960 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
15970 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
15980 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
15990 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
159a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
159b0 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
159c0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
159d0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
159e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
159f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
15a00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15a10 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
15a20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  && sqlite3ExprAn
15a30 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
15a40 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29  pParse, pHaving)
15a50 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
15a60 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
15a70 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
15a80 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
15a90 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
15aa0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15ab0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
15ac0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
15ad0 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f  gates(pParse, pO
15ae0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
15af0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
15b00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15b30 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67   /* Reset the ag
15b40 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20  gregator.  */.  
15b50 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
15b60 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
15b70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15b80 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 28 70 47  OP_AggReset, (pG
15b90 72 6f 75 70 42 79 3f 30 3a 31 29 2c 20 70 50 61  roupBy?0:1), pPa
15ba0 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20  rse->nAgg);.    
15bb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
15bc0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
15bd0 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46       FuncDef *pF
15be0 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28  unc;.      if( (
15bf0 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  pFunc = pParse->
15c00 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d  aAgg[i].pFunc)!=
15c10 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e  0 && pFunc->xFin
15c20 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
15c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
15c40 70 33 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74  p3(v, OP_AggInit
15c50 2c 20 30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70  , 0, i, (char*)p
15c60 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46  Func, P3_FUNCDEF
15c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15c80 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
15c90 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  y ){.      int s
15ca0 7a 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e  z = sizeof(KeyIn
15cb0 66 6f 29 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e  fo) + pGroupBy->
15cc0 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c  nExpr*sizeof(Col
15cd0 6c 53 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65  lSeq*);.      Ke
15ce0 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
15cf0 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d  eyInfo *)sqliteM
15d00 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20  alloc(sz);.     
15d10 20 69 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a   if( 0==pKey ){.
15d20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
15d30 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
15d40 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63  .      pKey->enc
15d50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
15d60 6e 63 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  nc;.      pKey->
15d70 6e 46 69 65 6c 64 20 3d 20 70 47 72 6f 75 70 42  nField = pGroupB
15d80 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
15d90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
15da0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
15db0 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e  {.        pKey->
15dc0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
15dd0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
15de0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
15df0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
15e00 20 20 20 20 20 69 66 28 20 21 70 4b 65 79 2d 3e       if( !pKey->
15e10 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
15e20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
15e30 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64  l[i] = pParse->d
15e40 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
15e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15e70 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
15e80 72 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c  r, (char *)pKey,
15e90 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
15ea0 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OFF);.    }.  }.
15eb0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
15ec0 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
15ed0 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 53 52 54   to NULL for SRT
15ee0 5f 4d 65 6d 20 6f 72 20 30 20 66 6f 72 20 53 52  _Mem or 0 for SR
15ef0 54 5f 45 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20  T_Exists.  */.  
15f00 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
15f10 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
15f20 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 73  _Exists ){.    s
15f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15f40 76 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  v, eDest==SRT_Me
15f50 6d 20 3f 20 4f 50 5f 53 74 72 69 6e 67 38 20 3a  m ? OP_String8 :
15f60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
15f70 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
15f80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
15f90 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
15fa0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  1);.  }..  /* Op
15fb0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  en a temporary t
15fc0 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
15fd0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
15fe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
15ff0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64  istinct ){.    d
16000 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
16010 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 6f 70  ->nTab++;.    op
16020 65 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61 72  enTempIndex(pPar
16030 73 65 2c 20 70 2c 20 64 69 73 74 69 6e 63 74 2c  se, p, distinct,
16040 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
16050 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
16060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
16070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
16080 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  an.  */.  pWInfo
16090 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
160a0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
160b0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 0a 20  bList, pWhere,. 
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 20 20 20 20 20 20 20 20 20 20 70 47 72 6f              pGro
160e0 75 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64  upBy ? 0 : &pOrd
160f0 65 72 42 79 2c 20 70 2d 3e 70 46 65 74 63 68 29  erBy, p->pFetch)
16100 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
16110 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
16120 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74  end;..  /* Use t
16130 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
16140 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65  r loop if we are
16150 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74   not dealing wit
16160 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  h.  ** aggregate
16170 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  s.  */.  if( !is
16180 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Agg ){.    if( s
16190 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
161a0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
161b0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
161c0 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
161d0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
161e0 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
161f0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
16200 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
16210 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20   aff) ){.       
16220 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
16230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16240 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   If we are deali
16250 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74  ng with aggregat
16260 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  es, then do the 
16270 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74  special aggregat
16280 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  e.  ** processin
16290 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  g.  .  */.  else
162a0 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 70  {.    AggExpr *p
162b0 41 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72  Agg;.    if( pGr
162c0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
162d0 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66  nt lbl1;.      f
162e0 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
162f0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
16300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16310 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
16320 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
16330 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
16340 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69        /* No affi
16350 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61  nity string is a
16360 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66  ttached to the f
16370 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65  ollowing OP_Make
16380 52 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a  Record .      **
16390 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e   because we do n
163a0 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e  ot need to do an
163b0 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61  y coercion of da
163c0 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20  tatypes. */.    
163d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163e0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
163f0 6f 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  ord, pGroupBy->n
16400 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
16410 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64  lbl1 = sqlite3Vd
16420 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16440 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
16450 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b  Focus, 0, lbl1);
16460 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
16470 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67  pAgg=pParse->aAg
16480 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  g; i<pParse->nAg
16490 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b  g; i++, pAgg++){
164a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67  .        if( pAg
164b0 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  g->isAgg ) conti
164c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
164d0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
164e0 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72  rse, pAgg->pExpr
164f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16500 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16510 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b  P_AggSet, 0, i);
16520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16530 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16540 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b  eLabel(v, lbl1);
16550 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
16560 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d  =0, pAgg=pParse-
16570 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d  >aAgg; i<pParse-
16580 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67  >nAgg; i++, pAgg
16590 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
165a0 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  *pE;.      int n
165b0 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e 63  Expr;.      Func
165c0 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
165d0 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41 67   if( !pAgg->isAg
165e0 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
165f0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
16600 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20  ->pFunc!=0 );.  
16610 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
16620 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d  ->pFunc->xStep!=
16630 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  0 );.      pDef 
16640 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20  = pAgg->pFunc;. 
16650 20 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d 3e       pE = pAgg->
16660 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
16670 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
16680 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
16690 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
166a0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  ION );.      nEx
166b0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
166c0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
166d0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b  rse, pE->pList);
166e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
166f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
16700 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
16710 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
16720 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
16730 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
16740 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oll = 0;.       
16750 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
16760 66 6f 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20  for(j=0; !pColl 
16770 26 26 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  && j<nExpr; j++)
16780 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
16790 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
167a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
167b0 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
167c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
167d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
167e0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
167f0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
16800 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  oll;.        sql
16810 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
16820 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
16830 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
16840 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
16850 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16860 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16870 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70  AggFunc, 0, nExp
16880 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
16890 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
168a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64   }.  }..  /* End
168b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
168c0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
168d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
168e0 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
168f0 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73  f we are process
16900 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20  ing aggregates, 
16910 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75  we need to set u
16920 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a  p a second loop.
16930 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
16940 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76   the aggregate v
16950 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73  alues and proces
16960 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  s them..  */.  i
16970 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
16980 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c  int endagg = sql
16990 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
169a0 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  l(v);.    int st
169b0 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72  artagg;.    star
169c0 74 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64  tagg = sqlite3Vd
169d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
169e0 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67  gNext, 0, endagg
169f0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75  );.    pParse->u
16a00 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69  seAgg = 1;.    i
16a10 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
16a20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
16a30 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
16a40 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67  Having, startagg
16a50 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
16a60 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
16a70 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
16a80 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
16a90 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
16aa0 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
16ac0 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64  m, startagg, end
16ad0 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  agg, aff) ){.   
16ae0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
16af0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
16b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16b10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
16b20 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
16b30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16b40 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b  abel(v, endagg);
16b50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16b60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
16b70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
16b80 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b  rse->useAgg = 0;
16b90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16ba0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
16bb0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
16bc0 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
16bd0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
16be0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
16bf0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
16c00 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
16c10 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
16c20 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
16c30 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
16c40 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
16c50 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
16c60 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
16c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16c80 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
16c90 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
16ca0 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
16cb0 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
16cc0 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
16cd0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16ce0 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65  .  So delete the
16cf0 20 73 75 62 71 75 65 72 79 20 73 74 72 75 63 74   subquery struct
16d00 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ure from the par
16d10 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ent.  ** to prev
16d20 65 6e 74 20 74 68 69 73 20 73 75 62 71 75 65 72  ent this subquer
16d30 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61  y from being eva
16d40 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64  luated again and
16d50 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20   to force the.  
16d60 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 74 68  ** the use of th
16d70 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
16d80 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
16d90 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  arent ){.    ass
16da0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
16db0 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54  rc->nSrc>parentT
16dc0 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ab );.    assert
16dd0 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
16de0 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
16df0 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20  elect==p );.    
16e00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16e10 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ete(p);.    pPar
16e20 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
16e30 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20  entTab].pSelect 
16e40 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
16e50 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
16e60 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
16e70 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
16e80 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
16e90 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
16ea0 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
16eb0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
16ec0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
16ed0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
16ee0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
16ef0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
16f00 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
16f10 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
16f20 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
16f30 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65  select_end:.  re
16f40 73 74 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e  storeAggregateIn
16f50 66 6f 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  fo(pParse, &sAgg
16f60 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
16f70 72 63 3b 0a 7d 0a                                rc;.}.