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

Artifact f02a65af34231031896e8442161cb5251e191e75:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 39 35  select.c,v 1.195
0200: 20 32 30 30 34 2f 30 36 2f 32 31 20 31 30 3a 34   2004/06/21 10:4
0210: 35 3a 30 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  5:09 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 73 74   *p;.  static st
0a00: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
0a10: 20 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b   char *zKeyword;
0a20: 0a 20 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  .    int nChar;.
0a30: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
0a40: 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b  } keywords[] = {
0a50: 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22  .    { "natural"
0a60: 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20  , 7, JT_NATURAL 
0a70: 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c  },.    { "left",
0a80: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0a90: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0aa0: 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a   "right",   5, J
0ab0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0ac0: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22   },.    { "full"
0ad0: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0ae0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0af0: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65  R },.    { "oute
0b00: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45  r",   5, JT_OUTE
0b10: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65  R },.    { "inne
0b20: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  r",   5, JT_INNE
0b30: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73  R },.    { "cros
0b40: 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  s",   5, JT_INNE
0b50: 52 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  R },.  };.  int 
0b60: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
0b70: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
0b80: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
0b90: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
0ba0: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
0bb0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
0bc0: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
0bd0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65   for(j=0; j<size
0be0: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0bf0: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0c00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
0c10: 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73  ( p->n==keywords
0c20: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
0c30: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
0c40: 74 72 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65  trNICmp(p->z, ke
0c50: 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f  ywords[j].zKeywo
0c60: 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  rd, p->n)==0 ){.
0c70: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
0c80: 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e   |= keywords[j].
0c90: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
0ca0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
0cb0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69   }.    if( j>=si
0cc0: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73  zeof(keywords)/s
0cd0: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30  izeof(keywords[0
0ce0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e  ]) ){.      join
0cf0: 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52  type |= JT_ERROR
0d00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0d10: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20     }.  }.  if(. 
0d20: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
0d30: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
0d40: 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c  ER))==(JT_INNER|
0d50: 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20  JT_OUTER) ||.   
0d60: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54    (jointype & JT
0d70: 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a  _ERROR)!=0.  ){.
0d80: 20 20 20 20 73 74 61 74 69 63 20 54 6f 6b 65 6e      static Token
0d90: 20 64 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20   dummy = { 0, 0 
0da0: 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 70  };.    char *zSp
0db0: 31 20 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d  1 = " ", *zSp2 =
0dc0: 20 22 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42   " ";.    if( pB
0dd0: 3d 3d 30 20 29 7b 20 70 42 20 3d 20 26 64 75 6d  ==0 ){ pB = &dum
0de0: 6d 79 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a  my; zSp1 = 0; }.
0df0: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
0e00: 20 70 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53   pC = &dummy; zS
0e10: 70 32 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71  p2 = 0; }.    sq
0e20: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
0e30: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0e40: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
0e50: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e60: 79 70 65 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20  ype: ", 0,.     
0e70: 20 20 70 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20    pA->z, pA->n, 
0e80: 7a 53 70 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20  zSp1, 1, pB->z, 
0e90: 70 42 2d 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20  pB->n, zSp2, 1, 
0ea0: 70 43 2d 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29  pC->z, pC->n, 0)
0eb0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
0ec0: 72 72 2b 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  rr++;.    jointy
0ed0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0ee0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0ef0: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
0f20: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
0f30: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
0f40: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0f50: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
0f60: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f70: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
0f80: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
0f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
0fb0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
0fc0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
0fd0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
0fe0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
0ff0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1000: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1010: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1020: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1030: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1050: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1060: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1070: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1080: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
1090: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
10c0: 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52  term to the WHER
10d0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  E expression in 
10e0: 2a 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71  *ppExpr that req
10f0: 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f  uires the.** zCo
1100: 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65  l column to be e
1110: 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20  qual in the two 
1120: 74 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64  tables pTab1 and
1130: 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69   pTab2..*/.stati
1140: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1150: 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  erm(.  const cha
1160: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  r *zCol,        
1170: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
1180: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
1190: 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20   Table *pTab1,  
11a0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62      /* First tab
11b0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  le */.  const Ta
11c0: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
11d0: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
11e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
11f0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
1200: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
1210: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
1220: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
1230: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1240: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1250: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1260: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1270: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1280: 70 45 3b 0a 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d  pE;..  dummy.z =
1290: 20 7a 43 6f 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e   zCol;.  dummy.n
12a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b   = strlen(zCol);
12b0: 0a 20 20 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30  .  dummy.dyn = 0
12c0: 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74  ;.  pE1a = sqlit
12d0: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
12e0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70   0, &dummy);.  p
12f0: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  E2a = sqlite3Exp
1300: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
1310: 64 75 6d 6d 79 29 3b 0a 20 20 64 75 6d 6d 79 2e  dummy);.  dummy.
1320: 7a 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  z = pTab1->zName
1330: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1340: 72 6c 65 6e 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20  rlen(dummy.z);. 
1350: 20 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 45   pE1b = sqlite3E
1360: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1370: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 64 75 6d 6d   &dummy);.  dumm
1380: 79 2e 7a 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61  y.z = pTab2->zNa
1390: 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20  me;.  dummy.n = 
13a0: 73 74 72 6c 65 6e 28 64 75 6d 6d 79 2e 7a 29 3b  strlen(dummy.z);
13b0: 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65  .  pE2b = sqlite
13c0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
13d0: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45  0, &dummy);.  pE
13e0: 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1c = sqlite3Expr
13f0: 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70  (TK_DOT, pE1b, p
1400: 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20  E1a, 0);.  pE2c 
1410: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1420: 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61  _DOT, pE2b, pE2a
1430: 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c  , 0);.  pE = sql
1440: 69 74 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20  ite3Expr(TK_EQ, 
1450: 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a  pE1c, pE2c, 0);.
1460: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1470: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
1480: 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70 45 78 70  n);.  if( *ppExp
1490: 72 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  r ){.    *ppExpr
14a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
14b0: 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72 2c 20  K_AND, *ppExpr, 
14c0: 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pE, 0);.  }else{
14d0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
14e0: 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
14f0: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
1500: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
1510: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1520: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1530: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
1540: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1550: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
1560: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
1570: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
1580: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
1590: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
15a0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
15b0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
15c0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
15d0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
15e0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
15f0: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
1600: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
1610: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
1620: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
1630: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
1640: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
1650: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
1660: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
1670: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
1680: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1690: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
16a0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
16b0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
16c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
16d0: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
16e0: 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  pr *p){.  while(
16f0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
1700: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
1710: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73  FromJoin);.    s
1720: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
1730: 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  eft);.    p = p-
1740: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
1750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1760: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
1770: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
1780: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
1790: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
17a0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
17b0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
17c0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
17d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
17e0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
17f0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
1800: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
1810: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1830: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
1840: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
1850: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
1860: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
1870: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
1880: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
1890: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
18a0: 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  *pSrc;.  int i, 
18b0: 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  j;.  pSrc = p->p
18c0: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
18d0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i<pSrc->nSrc-1; 
18e0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
18f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1900: 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Term = &pSrc->a[
1910: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
1920: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 74  rcList_item *pOt
1930: 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  her = &pSrc->a[i
1940: 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  +1];..    if( pT
1950: 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20  erm->pTab==0 || 
1960: 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d 30 20  pOther->pTab==0 
1970: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
1980: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
1990: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
19a0: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
19b0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
19c0: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
19d0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
19e0: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
19f0: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
1a00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1a10: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1a20: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
1a30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1a40: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1a50: 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 55 73  On || pTerm->pUs
1a60: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
1a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a80: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
1a90: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
1aa0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
1ab0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
1ac0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
1ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
1af0: 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61 62  ab = pTerm->pTab
1b00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1b10: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1b30: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74   columnIndex(pOt
1b40: 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62 2d  her->pTab, pTab-
1b50: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3e  >aCol[j].zName)>
1b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b70: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54 61  addWhereTerm(pTa
1b80: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1b90: 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e  , pTab, pOther->
1ba0: 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65  pTab, &p->pWhere
1bb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1bd0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
1be0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1bf0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1c00: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
1c10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1c20: 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e   && pTerm->pUsin
1c30: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
1c40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c50: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1c60: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1c70: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c80: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c90: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1ca0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1cb0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1cc0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1cd0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1ce0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1cf0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1d00: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1d10: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1d20: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1d30: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1d40: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1d50: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1d70: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d80: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d90: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1da0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1db0: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
1dc0: 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c  ere, pTerm->pOn,
1dd0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1de0: 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20     pTerm->pOn = 
1df0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1e00: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
1e10: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
1e20: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
1e30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
1e40: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
1e50: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
1e60: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
1e70: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1e80: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
1e90: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
1ea0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
1eb0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
1ec0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
1ed0: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
1ee0: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
1ef0: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
1f00: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
1f10: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
1f20: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
1f30: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1f40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1f50: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
1f60: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
1f70: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1f80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1f90: 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67  f( pTerm->pUsing
1fa0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
1fb0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69   *pList;.      i
1fc0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1fd0: 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  rt( i<pSrc->nSrc
1fe0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  -1 );.      pLis
1ff0: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e  t = pTerm->pUsin
2000: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
2010: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
2020: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2030: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ( columnIndex(pT
2040: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  erm->pTab, pList
2050: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
2060: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ||.            c
2070: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65  olumnIndex(pOthe
2080: 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e  r->pTab, pList->
2090: 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b  a[j].zName)<0 ){
20a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20c0: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
20d0: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
20e0: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
20f0: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2100: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2110: 65 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  es", pList->a[j]
2120: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
2130: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2150: 64 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73  ddWhereTerm(pLis
2160: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[j].zName, p
2170: 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68  Term->pTab, pOth
2180: 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57  er->pTab, &p->pW
2190: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
21a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
21c0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
21d0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
21e0: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
21f0: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
2200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2210: 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74  ectDelete(Select
2220: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
2230: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2240: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2250: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
2260: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
2270: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
2280: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2290: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
22a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22b0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
22c0: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
22d0: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
22e0: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
22f0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2300: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2310: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2320: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
2330: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
2340: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
2350: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
2360: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67  ** Delete the ag
2370: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2380: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ion from the par
2390: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
23a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
23b0: 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
23c0: 52 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61  Reset(Parse *pPa
23d0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  rse){.  sqliteFr
23e0: 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29  ee(pParse->aAgg)
23f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67  ;.  pParse->aAgg
2400: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2410: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
2420: 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
2430: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2440: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2450: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2460: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2470: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2480: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2490: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
24a0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
24b0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
24c0: 20 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69   Vdbe *v, ExprLi
24d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
24e0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
24f0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
2500: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2510: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2520: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2530: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
2550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
2560: 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79  Record, pOrderBy
2570: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73  ->nExpr, 0);.  s
2580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2590: 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30  v, OP_SortPut, 0
25a0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
25b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
25c0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
25d0: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
25e0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
25f0: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
2600: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
2610: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
2620: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
2630: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
2640: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
2650: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
2660: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
2670: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
2680: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
2690: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
26a0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
26b0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
26c0: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
26d0: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
26e0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2700: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
2710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2730: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2740: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
2770: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
2780: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
2790: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
27a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
27b0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
27c0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
27d0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
27e0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
27f0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
2800: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
2810: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2820: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2830: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
2840: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
2850: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2860: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
2870: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
2880: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
2890: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
28a0: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
28b0: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
28c0: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
28d0: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
28e0: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
28f0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
2900: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
2910: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
2920: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
2930: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
2940: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
2950: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
2960: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2970: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2980: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
2990: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
29a0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20  .  int iBreak,  
29b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
29c0: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
29d0: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
29e0: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72  r loop */.  char
29f0: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
2a00: 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20      /* affinity 
2a10: 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20  string if eDest 
2a20: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a  is SRT_Union */.
2a30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2a40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2a50: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 76 3d  int i;..  if( v=
2a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2a70: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
2a80: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
2a90: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
2aa0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
2ab0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
2ac0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
2ad0: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
2ae0: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
2af0: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
2b00: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
2b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
2b20: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a  ->iOffset>=0 ){.
2b30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
2b40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2b50: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b70: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2b80: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
2b90: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+2);.      sql
2ba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2bb0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
2bc0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20  ntinue);.    }. 
2bd0: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
2be0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=0 ){.      sql
2bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2c00: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2c10: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2c20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c30: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
2c40: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
2c50: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
2c60: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
2c70: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
2c80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ca0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
2cb0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
2cc0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  e{.    nColumn =
2cd0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
2ce0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2cf0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
2d00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2d10: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2d20: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
2d30: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2d40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
2d50: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
2d60: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
2d70: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2d80: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
2d90: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
2da0: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
2db0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
2dc0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
2dd0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
2de0: 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63  */.  if( distinc
2df0: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
2e00: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
2e10: 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c  0 ){.#if NULL_AL
2e20: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20  WAYS_DISTINCT.  
2e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e40: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
2e50: 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c   -pEList->nExpr,
2e60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2e70: 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a 23  entAddr(v)+7);.#
2e80: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65 6c  endif.    /* Del
2e90: 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65 20  iberately leave 
2ea0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
2eb0: 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20 66  ing off of the f
2ec0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
2ed0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a 2f  OP_MakeRecord */
2ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
2f00: 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d 3e  Record, pEList->
2f10: 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b 0a  nExpr * -1, 0);.
2f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69  ddOp(v, OP_Disti
2f40: 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73  nct, distinct, s
2f50: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f60: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
2f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f80: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c  p(v, OP_Pop, pEL
2f90: 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29  ist->nExpr+1, 0)
2fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2fb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
2fc0: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
2fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2fe0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
2ff0: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
3000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3010: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
3020: 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b  y, distinct, 0);
3030: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
3040: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
3050: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
3060: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
3070: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
3080: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
3090: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
30a0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
30b0: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
30c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
30d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
30f0: 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  umn, NULL_ALWAYS
3100: 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20  _DISTINCT);.    
3110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3120: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
3130: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
3140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3150: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
3160: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
3170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3180: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
3190: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
31a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31b0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
31c0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
31d0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
31e0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
31f0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
3200: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
3210: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
3220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3230: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3240: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
3250: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3260: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
3270: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3280: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3290: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
32a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
32c0: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
32d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
32e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
32f0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
3300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3320: 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d  PutIntKey, iParm
3330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3350: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
3360: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
3370: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
3380: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
3390: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
33a0: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
33b0: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
33c0: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
33d0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
33e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
33f0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
3400: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
3410: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
3420: 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
3430: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3440: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3450: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
3460: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3470: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3480: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
3490: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
34a0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
34b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
34c0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50   OP_NotFound, iP
34d0: 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  arm, addr+3);.  
34e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
3500: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
3510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3520: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
3530: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
3540: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
3550: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
3560: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
3570: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
3580: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
3590: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
35a0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
35b0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
35c0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
35d0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
35e0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
35f0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
3600: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
3610: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3620: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  dr(v);.      int
3630: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
3640: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
3650: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
3660: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3670: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
3680: 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73  ddr1+3);.      s
3690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
36a0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
36b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
36c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36d0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
36e0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
36f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3700: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3710: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3720: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3730: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
3740: 20 63 6f 6e 73 74 20 2a 61 66 66 53 74 72 3b 0a   const *affStr;.
3750: 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
3760: 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30   = (iParm>>16)&0
3770: 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66  xFF;.        aff
3780: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
3790: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
37a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66  ->a[0].pExpr, af
37b0: 66 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 53  f);.        affS
37c0: 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  tr = sqlite3Affi
37d0: 6e 69 74 79 53 74 72 69 6e 67 28 61 66 66 29 3b  nityString(aff);
37e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37f0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
3800: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
3810: 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54 49  affStr, P3_STATI
3820: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
3830: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3840: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
3850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3870: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50  P_PutStrKey, (iP
3880: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
3890: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
38a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
38b0: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c  angeP2(v, addr2,
38c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
38d0: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
38e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
38f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
3900: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
3910: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
3920: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
3930: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
3940: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
3950: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
3960: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
3970: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
3980: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
3990: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
39a0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
39b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
39c0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
39d0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
39e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
39f0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3a00: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3a10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
3a40: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
3a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3a60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3a70: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
3a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3a90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3aa0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
3ab0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
3ac0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
3ad0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3ae0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
3af0: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
3b00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
3b10: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3b20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3b40: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
3b50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3b60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3b70: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b90: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
3ba0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
3bb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3bc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3bd0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
3be0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n, 0);.      }. 
3bf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c00: 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  }..    /* Invoke
3c10: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
3c20: 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75   handle the resu
3c30: 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75  lts.  The subrou
3c40: 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20  tine itself.    
3c50: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
3c60: 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68  e for popping th
3c70: 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66  e results off of
3c80: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
3c90: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3ca0: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
3cb0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
3cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ce0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3cf0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
3d00: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3d10: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3d20: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3d30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3d40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3d50: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
3d60: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
3d70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d80: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
3d90: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
3da0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
3db0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3dc0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
3dd0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
3de0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
3df0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
3e00: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
3e10: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
3e20: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
3e30: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
3e40: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
3e50: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
3e60: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
3e70: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
3e80: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
3e90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
3ea0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
3eb0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
3ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ed0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3ee0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
3ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
3f20: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
3f30: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
3f40: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
3f50: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
3f60: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
3f70: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
3f80: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
3f90: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
3fa0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
3fb0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
3fc0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
3fd0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
3fe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
3ff0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
4000: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
4010: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
4020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
4030: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
4040: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4050: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
4060: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
4070: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f  lect *p,       /
4080: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
4090: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
40a0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *v,         /* 
40b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
40c0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
40d0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
40e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
40f0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
4100: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
4110: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
4120: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
4130: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
4140: 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  iParm        /* 
4150: 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74  Optional paramet
4160: 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
4170: 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20  th eDest */.){. 
4180: 20 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69   int end1 = sqli
4190: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
41a0: 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20  (v);.  int end2 
41b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
41c0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
41d0: 20 61 64 64 72 3b 0a 20 20 4b 65 79 49 6e 66 6f   addr;.  KeyInfo
41e0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78 70 72 4c   *pInfo;.  ExprL
41f0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
4200: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20   int nCol, i;.  
4210: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
4220: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4230: 65 44 65 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65  eDest==SRT_Sorte
4240: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  r ) return;.  pO
4250: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
4260: 65 72 42 79 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70  erBy;.  nCol = p
4270: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
4280: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
4290: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
42a0: 70 49 6e 66 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73  pInfo) + nCol*(s
42b0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
42c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
42d0: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
42e0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
42f0: 65 72 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  er = (char*)&pIn
4300: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b  fo->aColl[nCol];
4310: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  .  pInfo->nField
4320: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66 6f 72 28 69   = nCol;.  for(i
4330: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
4340: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f  {.    /* If a co
4350: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4360: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 65   was specified e
4370: 78 70 6c 69 63 69 74 79 2c 20 74 68 65 6e 20 69  xplicity, then i
4380: 74 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72  t.    ** is stor
4390: 65 64 20 69 6e 20 70 4f 72 64 65 72 42 79 2d 3e  ed in pOrderBy->
43a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65  a[i].zName. Othe
43b0: 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 64  rwise, use the d
43c0: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 63 6f  efault.    ** co
43d0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  llation type for
43e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
43f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
4400: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
4410: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
4420: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4430: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
4440: 20 20 20 20 69 66 28 20 21 70 49 6e 66 6f 2d 3e      if( !pInfo->
4450: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
4460: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
4470: 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  ] = db->pDfltCol
4480: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
4490: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
44a0: 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
44b0: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
44c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  }.  sqlite3VdbeO
44d0: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30  p3(v, OP_Sort, 0
44e0: 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 49 6e 66  , 0, (char*)pInf
44f0: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
4500: 4e 44 4f 46 46 29 3b 0a 20 20 61 64 64 72 20 3d  NDOFF);.  addr =
4510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4520: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74  p(v, OP_SortNext
4530: 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20 69 66  , 0, end1);.  if
4540: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
4550: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4570: 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65  mIncr, p->iOffse
4580: 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20  t, addr+4);.    
4590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45a0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
45b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
45c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
45d0: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
45e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  }.  if( p->iLimi
45f0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t>=0 ){.    sqli
4600: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4610: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
4620: 4c 69 6d 69 74 2c 20 65 6e 64 32 29 3b 0a 20 20  Limit, end2);.  
4630: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
4640: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
4650: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
4660: 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a  e SRT_TempTable:
4670: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4690: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
46a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
46b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
46c0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
46d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
46e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
46f0: 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  ntKey, iParm, 0)
4700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4710: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
4720: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
4730: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4740: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4750: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4760: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
4770: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4780: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
4790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
47a0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
47b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
47c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
47d0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
47e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
47f0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
4800: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4810: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4820: 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53   1, 0, "n", P3_S
4830: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
4840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4850: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
4860: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4870: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4880: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50  P_PutStrKey, (iP
4890: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
48a0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
48b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
48c0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
48d0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
48e0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
48f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4900: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4910: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4930: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4940: 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62 72 65  end1);.      bre
4950: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4960: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4970: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
4980: 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  broutine: {.    
4990: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
49a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
49b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
49c0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
49d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
49e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
49f0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
4a00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4a10: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
4a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4a30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4a40: 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a  lumn, -1-i, i);.
4a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4a60: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
4a70: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
4a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a90: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
4aa0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4ab0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
4ae0: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
4af0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4b00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4b10: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
4b20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4b30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4b40: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
4b50: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
4b60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4b70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b80: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4b90: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
4ba0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
4bb0: 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73 71 6c  (v, end2);.  sql
4bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4bd0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
4be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
4bf0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
4c00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
4c10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
4c20: 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a 7d  tReset, 0, 0);.}
4c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
4c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
4c50: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
4c60: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
4c70: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
4c80: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
4c90: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
4ca0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
4cb0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
4cc0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ller..**.** If t
4cd0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
4ce0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
4cf0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
4d00: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
4d10: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69  rom.** the origi
4d20: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
4d30: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
4d40: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
4d50: 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a  a column..** .**
4d60: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
4d70: 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70   type for an exp
4d80: 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65  ression is eithe
4d90: 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43 20  r TEXT, NUMERIC 
4da0: 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20 64  or ANY..** The d
4db0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
4dc0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
4dd0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f  d is INTEGER..*/
4de0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4df0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 50  ar *columnType(P
4e00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
4e10: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4e20: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4e30: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
4e40: 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  pe;.  int j;.  i
4e50: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
4e60: 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  TabList==0 ) ret
4e70: 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68  urn 0;..  switch
4e80: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
4e90: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
4ea0: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
4eb0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e   *pTab;.      in
4ec0: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
4ed0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
4ee0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
4ef0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
4f00: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
4f10: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
4f20: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
4f30: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
4f40: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
4f50: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
4f60: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
4f70: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
4f80: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
4f90: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
4fa0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
4fb0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
4fc0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
4fd0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
4fe0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
4ff0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
5000: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5010: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
5020: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
5030: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5040: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5050: 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20 20    case TK_AS:.  
5060: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
5070: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20 70  mnType(pParse, p
5080: 54 61 62 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e  TabList, pExpr->
5090: 70 4c 65 66 74 29 3b 20 0a 20 20 20 20 20 20 62  pLeft); .      b
50a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
50b0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
50c0: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
50d0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
50e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
50f0: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20  umnType(pParse, 
5100: 70 53 2d 3e 70 53 72 63 2c 20 70 53 2d 3e 70 45  pS->pSrc, pS->pE
5110: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
5120: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
5130: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
5140: 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79 70 65 20  lt:.      zType 
5150: 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  = 0;.  }.  .  re
5160: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
5170: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5180: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
5190: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
51a0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
51b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
51c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
51d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51e0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
51f0: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
5200: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5210: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5220: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
5230: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
5240: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
5250: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
5260: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
5270: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
5280: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
5290: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
52a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
52b0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
52c0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
52d0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
52e0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
52f0: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
5300: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63   char *zType = c
5310: 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65  olumnType(pParse
5320: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 29 3b 0a  , pTabList, p);.
5330: 20 20 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30      if( zType==0
5340: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5350: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
5360: 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e 20  t make it's own 
5370: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
5380: 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61 73 65  mn-type, in case
5390: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 63 68   the .    ** sch
53a0: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
53b0: 6f 72 65 20 74 68 69 73 20 76 69 72 74 75 61 6c  ore this virtual
53c0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
53d0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
53e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
53f0: 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73  lName(v, i+pELis
5400: 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c  t->nExpr, zType,
5410: 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b   strlen(zType));
5420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
5430: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5440: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5450: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
5460: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
5470: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
5480: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
5490: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
54a0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
54b0: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
54c0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
54d0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
54e0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
54f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5500: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
5510: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
5520: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
5530: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
5540: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
5550: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
5560: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5570: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5580: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5590: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
55a0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
55b0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
55c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
55d0: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
55e0: 4e 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  Names;..  /* If 
55f0: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
5600: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
5610: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
5620: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
5630: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
5640: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
5650: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
5660: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
5670: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
5680: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
5690: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
56a0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
56b0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
56c0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
56d0: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
56e0: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
56f0: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
5700: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
5710: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
5720: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
5730: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
5740: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
5750: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
5760: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
5770: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
5780: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5790: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
57a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
57b0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
57c0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
57d0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
57e0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
57f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5800: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5810: 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  i, zName, strlen
5820: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  (zName));.      
5830: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
5840: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
5850: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
5860: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
5870: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
5880: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
5890: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
58a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
58b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
58c0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
58d0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
58e0: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
58f0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
5900: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
5910: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
5920: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5930: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
5940: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
5950: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
5960: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5970: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
5980: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
5990: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
59a0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
59b0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
59c0: 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20  _ROWID_";.      
59d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
59e0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
59f0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
5a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5a10: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
5a20: 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e  fullNames && p->
5a30: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
5a40: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
5a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
5a60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d  ColName(v, i, p-
5a70: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
5a80: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
5a90: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
5aa0: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
5ab0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
5ac0: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
5ad0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
5ae0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
5af0: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
5b00: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5b10: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
5b20: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
5b30: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
5b40: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
5b50: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
5b60: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
5b70: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
5b80: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
5b90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
5ba0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61  olName(v, i, zNa
5bb0: 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  me, P3_DYNAMIC);
5bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5be0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
5bf0: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
5c00: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
5c10: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
5c20: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
5c50: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
5c60: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a  pan.n);.      /*
5c70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
5c80: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
5c90: 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  r); */.    }else
5ca0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61  {.      char zNa
5cb0: 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73  me[30];.      as
5cc0: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
5cd0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69  COLUMN || pTabLi
5ce0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  st==0 );.      s
5cf0: 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63  printf(zName, "c
5d00: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
5d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
5d30: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
5d40: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
5d50: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
5d60: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
5d70: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EList);.}../*.**
5d80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
5d90: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
5da0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
5db0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
5dc0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5dd0: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
5de0: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
5df0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
5e00: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
5e10: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
5e20: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
5e30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
5e40: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
5e50: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
5e60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5e70: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
5e80: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
5e90: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
5ea0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
5eb0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
5ec0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
5ed0: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn z;.}../*.** F
5ee0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
5ef0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
5f00: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
5f10: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
5f20: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
5f30: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
5f40: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
5f50: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
5f60: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
5f70: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
5f80: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
5f90: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
5fa0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
5fb0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
5fc0: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
5fd0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
5fe0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
5ff0: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ab;.  int i, j;.
6000: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6010: 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43  st;.  Column *aC
6020: 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49  ol;..  if( fillI
6030: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72  nColumnList(pPar
6040: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
6050: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6060: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
6070: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
6080: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
6090: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
60a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
60b0: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61  Tab->zName = zTa
60c0: 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74  bName ? sqliteSt
60d0: 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a  rDup(zTabName) :
60e0: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
60f0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
6100: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
6110: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
6120: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6130: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
6140: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
6150: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6160: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
6170: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
6180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
6190: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
61a0: 20 20 20 45 78 70 72 20 2a 70 52 3b 0a 20 20 20     Expr *pR;.   
61b0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
61c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
61d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
61e0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
61f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
6200: 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d      aCol[i].zNam
6210: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6220: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  (pEList->a[i].zN
6230: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
6240: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  if( p->op==TK_DO
6250: 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T .             
6260: 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67    && (pR=p->pRig
6270: 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f  ht)!=0 && pR->to
6280: 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b  ken.z && pR->tok
6290: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
62a0: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 20 20   int cnt;.      
62b0: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
62c0: 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  g(&aCol[i].zName
62d0: 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  , pR->token.z, p
62e0: 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  R->token.n, 0);.
62f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d        for(j=cnt=
6300: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
6310: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6320: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
6330: 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69 5d 2e  .zName, aCol[i].
6340: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6350: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
6360: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75          char zBu
6370: 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[30];.         
6380: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f   sprintf(zBuf,"_
6390: 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  %d",++cnt);.    
63a0: 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
63b0: 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
63c0: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
63d0: 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ing(&aCol[i].zNa
63e0: 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c  me, pR->token.z,
63f0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 7a 42   pR->token.n, zB
6400: 75 66 2c 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  uf,n,0);.       
6410: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
6420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6430: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
6440: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
6450: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
6460: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
6470: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &pTab->aCol[i].z
6480: 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  Name, p->span.z,
6490: 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a   p->span.n, 0);.
64a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
64b0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
64c0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
64d0: 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  uf, "column%d", 
64e0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62  i+1);.      pTab
64f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20  ->aCol[i].zName 
6500: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
6510: 42 75 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Buf);.    }..   
6520: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53   zType = sqliteS
6530: 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65  trDup(columnType
6540: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
6550: 2d 3e 70 53 72 63 20 2c 70 29 29 3b 0a 20 20 20  ->pSrc ,p));.   
6560: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
6570: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
6580: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
6590: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
65a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
65b0: 20 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a     if( zType ){.
65c0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
65d0: 5b 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 73  [i].affinity = s
65e0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
65f0: 70 65 28 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e  pe(zType, strlen
6600: 28 7a 54 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a  (zType));.    }.
6610: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
6620: 5d 2e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ].pColl = sqlite
6630: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
6640: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
6650: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e   !pTab->aCol[i].
6660: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
6670: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f  Tab->aCol[i].pCo
6680: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
6690: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
66a0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
66b0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
66c0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
66d0: 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * For the given 
66e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
66f0: 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67  , do three thing
6700: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
6710: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
6720: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
6730: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
6740: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
6750: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74         defines t
6760: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
6770: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
6780: 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69  scanned.  For vi
6790: 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ews,.**         
67a0: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
67b0: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
67c0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
67d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
67e0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
67f0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
6800: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
6810: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
6820: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
6830: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
6840: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
6850: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
6860: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
6870: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
6880: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
6890: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
68a0: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
68b0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
68c0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
68d0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
68e0: 28 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (2)  Add terms t
68f0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
6900: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
6910: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
6920: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
6930: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
6940: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
6950: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
6960: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61  *.**    (3)  Sca
6970: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
6980: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
6990: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
69a0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
69b0: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
69c0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
69d0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
69e0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
69f0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
6a00: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
6a10: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
6a20: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
6a30: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
6a40: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
6a50: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
6a60: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
6a70: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
6a80: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
6a90: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
6aa0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
6ab0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
6ac0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
6ad0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
6ae0: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
6af0: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
6b00: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
6b10: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
6b20: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
6b30: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
6b40: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
6b50: 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66  ble *pTab;..  if
6b60: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
6b70: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
6b80: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
6b90: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
6ba0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
6bb0: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
6bc0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
6bd0: 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ble list..  */. 
6be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
6bf0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
6c00: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  {.    if( pTabLi
6c10: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b  st->a[i].pTab ){
6c20: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72  .      /* This r
6c30: 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62  outine has run b
6c40: 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20  efore!  No need 
6c50: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20  to continue */. 
6c60: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6c70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
6c80: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
6c90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e==0 ){.      /*
6ca0: 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
6cb0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
6cc0: 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
6cd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
6ce0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6cf0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
6d00: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
6d10: 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a  i].zAlias==0 ){.
6d20: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61          char zFa
6d30: 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20  keName[60];.    
6d40: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b      sprintf(zFak
6d50: 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  eName, "sqlite_s
6d60: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20  ubquery_%p_",.  
6d70: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
6d80: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6d90: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
6da0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
6db0: 67 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  g(&pTabList->a[i
6dc0: 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e  ].zAlias, zFakeN
6dd0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ame, 0);.      }
6de0: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
6df0: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
6e00: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
6e10: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
6e20: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
6e30: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6e40: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
6e70: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6e80: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
6e90: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
6ea0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68     }.      /* Th
6ec0: 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c  e isTransient fl
6ed0: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
6ee0: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
6ef0: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
6f00: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
6f10: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
6f20: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
6f30: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
6f40: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
6f50: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
6f60: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
6f70: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
6f80: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
6f90: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
6fa0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
6fb0: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
6fc0: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
6fd0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
6fe0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
6ff0: 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
7000: 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
7010: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
7020: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
7030: 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  i].pTab = pTab =
7040: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
7050: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
7060: 72 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b  rse,pTabList->a[
7070: 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73  i].zName,pTabLis
7080: 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73  t->a[i].zDatabas
7090: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
70a0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
70b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
70c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61   }.      if( pTa
70d0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
70e0: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
70f0: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
7100: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
7110: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
7120: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7130: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
7140: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
7150: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
7160: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
7180: 49 66 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  If pTabList->a[i
7190: 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ].pSelect!=0 it 
71a0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
71b0: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
71c0: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
71d0: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
71e0: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
71f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7200: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
7210: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
7220: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
7230: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
7240: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
7250: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
7260: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
7270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
7280: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
7290: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
72a0: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
72b0: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
72c0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
72d0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
72e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
72f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7300: 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
7310: 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
7320: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
7330: 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
7340: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72  /.  if( sqlitePr
7350: 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
7360: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
7370: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
7380: 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
7390: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
73a0: 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
73b0: 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
73c0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
73d0: 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
73e0: 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
73f0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
7400: 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
7410: 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
7420: 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
7430: 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
7440: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
7450: 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
7460: 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
7470: 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
7480: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
7490: 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
74a0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
74b0: 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
74c0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
74d0: 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
74e0: 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
74f0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
7500: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
7510: 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
7520: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
7530: 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
7540: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
7550: 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
7560: 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
7570: 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
7580: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
7590: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
75a0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
75b0: 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
75c0: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
75d0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
75e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
75f0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
7600: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
7610: 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
7620: 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
7630: 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
7640: 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
7650: 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
7660: 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
7670: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
7680: 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
7690: 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
76a0: 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
76b0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
76c0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
76d0: 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
76e0: 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
76f0: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
7700: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
7710: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
7720: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
7730: 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
7740: 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
7750: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
7760: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
7770: 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
7780: 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
7790: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66  *pNew = 0;.    f
77a0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
77b0: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
77c0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
77d0: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
77e0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
77f0: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
7800: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
7810: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
7820: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
7830: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
7840: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
7850: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
7860: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
7870: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
7880: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
7890: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
78b0: 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d  ppend(pNew, a[k]
78c0: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
78d0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
78e0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
78f0: 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
7900: 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
7910: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  r = 0;.        a
7920: 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
7930: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7940: 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
7950: 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
7960: 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
7970: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
7980: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
7990: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
79a0: 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
79b0: 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
79c0: 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
79d0: 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
79e0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
7a00: 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
7a10: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
7a20: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
7a30: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
7a40: 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20            pName 
7a50: 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  = &pE->pLeft->to
7a60: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ken;.        }el
7a70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7a80: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
7a90: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
7aa0: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
7ab0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7ac0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7ad0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
7ae0: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  i].pTab;.       
7af0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
7b00: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
7b10: 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  i].zAlias;.     
7b20: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
7b30: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
7b40: 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  [0]==0 ){ .     
7b50: 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
7b60: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7b70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7b80: 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26       if( pName &
7b90: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
7ba0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
7bb0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
7bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
7bd0: 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  NICmp(pName->z, 
7be0: 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  zTabName, pName-
7bf0: 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20  >n)!=0 ||.      
7c00: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
7c10: 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30  ame[pName->n]!=0
7c20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7c30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7c50: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
7c60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7c70: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
7c80: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7c90: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
7ca0: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
7cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
7cc0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
7cd0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
7ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7cf0: 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73   i>0 && (pTabLis
7d00: 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  t->a[i-1].jointy
7d10: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
7d20: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
7d30: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
7d40: 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  ex(pTabList->a[i
7d50: 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  -1].pTab, zName)
7d60: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
7d70: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
7d80: 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
7d90: 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
7da0: 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
7db0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
7dc0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
7dd0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
7de0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7e00: 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 73      if( i>0 && s
7e10: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
7e20: 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d  x(pTabList->a[i-
7e30: 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  1].pUsing, zName
7e40: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
7e50: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
7e60: 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
7e70: 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
7e80: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
7e90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
7ea0: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
7eb0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
7ec0: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
7ed0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7ee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
7f00: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
7f10: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
7f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7f30: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72  ( pRight==0 ) br
7f40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
7f50: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a   pRight->token.z
7f60: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
7f70: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
7f80: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
7f90: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
7fa0: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
7fb0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
7fc0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
7fd0: 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  me && pTabList->
7fe0: 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
7ff0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
8000: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
8010: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
8020: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8030: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
8040: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
8050: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
8060: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
8070: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
8090: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61  t->token.z = zTa
80a0: 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  bName;.         
80b0: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
80c0: 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61  n.n = strlen(zTa
80d0: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
80e0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
80f0: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
8100: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8110: 33 53 65 74 53 74 72 69 6e 67 28 28 63 68 61 72  3SetString((char
8120: 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e  **)&pExpr->span.
8130: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22  z, zTabName, "."
8140: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
8150: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8160: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65  ->span.n = strle
8170: 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29  n(pExpr->span.z)
8180: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8190: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
81a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
81b0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
81c0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
81d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
81e0: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
81f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
8200: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
8210: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8230: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8250: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
8260: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8280: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8290: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
82a0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  New, pExpr, 0);.
82b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
82c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
82d0: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
82e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
82f0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
8300: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8310: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
8320: 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20  uch table: %T", 
8330: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  pName);.        
8340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8350: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8360: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8370: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
8380: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
8390: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
83a0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
83b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
83c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
83d0: 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20  lete(pEList);.  
83e0: 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
83f0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
8400: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
8410: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72  is routine recur
8420: 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74  sively unlinks t
8430: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
8440: 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73  [].pTab pointers
8450: 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20  .** in a select 
8460: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a  structure.  It j
8470: 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69  ust sets the poi
8480: 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20  nters to NULL.  
8490: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
84a0: 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20  is recursive in 
84b0: 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
84c0: 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  f the Select.pSr
84d0: 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a  c.a[].pSelect.**
84e0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
84f0: 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69  NULL, this routi
8500: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
8510: 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74  ursively on that
8520: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
8530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8540: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65  called on the Se
8550: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74  lect structure t
8560: 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a  hat defines a.**
8570: 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74   VIEW in order t
8580: 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69  o undo any bindi
8590: 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20  ngs to tables.  
85a0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
85b0: 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f  y.** because tho
85c0: 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20  se tables might 
85d0: 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73  be DROPed by a s
85e0: 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f  ubsequent SQL co
85f0: 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65  mmand..** If the
8600: 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f   bindings are no
8610: 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20  t removed, then 
8620: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d  the Select.pSrc-
8630: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a  >a[].pTab field.
8640: 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  ** will be left 
8650: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65  pointing to a de
8660: 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20  allocated Table 
8670: 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 20  structure after 
8680: 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20  the.** DROP and 
8690: 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20  a coredump will 
86a0: 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74 20 74  occur the next t
86b0: 69 6d 65 20 74 68 65 20 56 49 45 57 20 69 73 20  ime the VIEW is 
86c0: 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
86d0: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
86e0: 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  d(Select *p){.  
86f0: 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
8700: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
8710: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
8720: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8730: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
8740: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
8750: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
8760: 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  ab = pSrc->a[i].
8770: 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  pTab)!=0 ){.    
8780: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72    if( pTab->isTr
8790: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
87a0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
87b0: 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a  Table(0, pTab);.
87c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
87d0: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  rc->a[i].pTab = 
87e0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  0;.      if( pSr
87f0: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  c->a[i].pSelect 
8800: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8810: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  e3SelectUnbind(p
8820: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
8830: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8840: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
8850: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f  his routine asso
8860: 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69  ciates entries i
8870: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78  n an ORDER BY ex
8880: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69  pression list wi
8890: 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  th.** columns in
88a0: 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20   a result.  For 
88b0: 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78  each ORDER BY ex
88c0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70  pression, the op
88d0: 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  code of.** the t
88e0: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
88f0: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
8900: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43  OLUMN and the iC
8910: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a  olumn value of.*
8920: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
8930: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69  node is filled i
8940: 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75  n with column nu
8950: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61  mber and the iTa
8960: 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ble.** value of 
8970: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
8980: 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  de is filled wit
8990: 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74  h iTable paramet
89a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
89b0: 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c  re are prior SEL
89c0: 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65  ECT clauses, the
89d0: 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  y are processed 
89e0: 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a  first.  A match.
89f0: 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72  ** in an earlier
8a00: 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72   SELECT takes pr
8a10: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20  ecedence over a 
8a20: 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a  later SELECT..**
8a30: 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68  .** Any entry th
8a40: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  at does not matc
8a50: 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20  h is flagged as 
8a60: 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e  an error.  The n
8a70: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
8a80: 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  rs is returned..
8a90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
8aa0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
8ab0: 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
8ac0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8ad0: 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76   A place to leav
8ae0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
8af0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
8b00: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  elect,        /*
8b10: 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74   Match to result
8b20: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73   columns of this
8b30: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70   SELECT */.  Exp
8b40: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
8b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
8b60: 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d  R BY values to m
8b70: 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c  atch against col
8b80: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  umns */.  int iT
8b90: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
8ba0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73    /* Insert this
8bb0: 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65   value in iTable
8bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f   */.  int mustCo
8bd0: 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a  mplete        /*
8be0: 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44   If TRUE all ORD
8bf0: 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63  ER BYs must matc
8c00: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  h */.){.  int nE
8c10: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  rr = 0;.  int i,
8c20: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
8c30: 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
8c40: 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72  Select==0 || pOr
8c50: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
8c60: 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43  n 1;.  if( mustC
8c70: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66  omplete ){.    f
8c80: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
8c90: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
8ca0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8cb0: 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a  done = 0; }.  }.
8cc0: 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75    if( fillInColu
8cd0: 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  mnList(pParse, p
8ce0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
8cf0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
8d00: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
8d10: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
8d20: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
8d30: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
8d40: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
8d50: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
8d60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8d70: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
8d80: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
8d90: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
8da0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
8db0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8dc0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
8dd0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8de0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
8df0: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
8e00: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8e10: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8e20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
8e30: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
8e40: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
8e50: 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
8e60: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
8e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8e80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8e90: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f  se,.          "O
8ea0: 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e  RDER BY position
8eb0: 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65   %d should be be
8ec0: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
8ed0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c  .          iCol,
8ee0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
8ef0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
8f00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8f20: 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  ( !mustComplete 
8f30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8f40: 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a    iCol--;.    }.
8f50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f      for(j=0; iCo
8f60: 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d  l<0 && j<pEList-
8f70: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
8f80: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8f90: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
8fa0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
8fb0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
8fc0: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
8fd0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62  ar *zName, *zLab
8fe0: 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  el;.        zNam
8ff0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  e = pEList->a[j]
9000: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
9010: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
9020: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
9030: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  E->token);.     
9040: 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65     assert( zLabe
9050: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
9060: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9070: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
9080: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
9090: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
90a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
90b0: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
90c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
90d0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
90e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
90f0: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
9100: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
9110: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
9120: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9130: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
9140: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
9150: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
9160: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
9170: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
9180: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
9190: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
91a0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
91b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
91c0: 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65  <0 && mustComple
91d0: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
91e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
91f0: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44  se,.        "ORD
9200: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
9210: 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  r %d does not ma
9220: 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63  tch any result c
9230: 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20  olumn", i+1);.  
9240: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
9250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
9270: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ;  .}../*.** Get
9280: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
9290: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
92a0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
92b0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
92c0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
92d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
92e0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
92f0: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
9300: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
9310: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
9320: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
9330: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9340: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
9350: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
9360: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
9370: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
9380: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
9390: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
93a0: 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 2a 2a 2a 2a  }..#if 0  /*****
93b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
93c0: 65 64 73 20 64 65 6c 65 74 69 6e 67 20 2a 2a 2a  eds deleting ***
93d0: 2a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  **/.static void 
93e0: 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66 69 6e  multiSelectAffin
93f0: 69 74 79 28 53 65 6c 65 63 74 20 2a 70 2c 20 63  ity(Select *p, c
9400: 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 69 6e  har *zAff){.  in
9410: 74 20 69 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  t i;..  if( !p )
9420: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 75 6c 74 69   return;.  multi
9430: 53 65 6c 65 63 74 41 66 66 69 6e 69 74 79 28 70  SelectAffinity(p
9440: 2d 3e 70 50 72 69 6f 72 2c 20 7a 41 66 66 29 3b  ->pPrior, zAff);
9450: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
9460: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
9470: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
9480: 41 66 66 5b 69 5d 3d 3d 27 5c 30 27 20 29 7b 0a  Aff[i]=='\0' ){.
9490: 20 20 20 20 20 20 7a 41 66 66 5b 69 5d 20 3d 20        zAff[i] = 
94a0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
94b0: 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  ity(p->pEList->a
94c0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
94d0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
94e0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
94f0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
9500: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
9510: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
9520: 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74  on the.** nLimit
9530: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65   and nOffset fie
9540: 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64  lds.  nLimit and
9550: 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   nOffset hold th
9560: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68  e integers.** th
9570: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
9580: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
9590: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
95a0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
95b0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
95c0: 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31   Or that hold -1
95d0: 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20   and 0 if those 
95e0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
95f0: 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20  tted..** iLimit 
9600: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9610: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
9620: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
9630: 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74  ers for.** count
9640: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
9650: 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  ute the limit an
9660: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
9670: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d  ere is no.** lim
9680: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
9690: 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e  , then iLimit an
96a0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
96b0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
96c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
96d0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66  es the values if
96e0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
96f0: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
9700: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
9710: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e   is defined by n
9720: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9730: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
9740: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
9750: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
9760: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
9770: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
9780: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
9790: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
97a0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
97b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
97c0: 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e   Only if nLimit>
97d0: 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20  =0 or nOffset>0 
97e0: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
97f0: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
9800: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
9810: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
9820: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
9830: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
9840: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
9850: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
9860: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
9870: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
9880: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
9890: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
98a0: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
98b0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
98c0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
98d0: 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  t *p){.  /* .  *
98e0: 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  * If the compari
98f0: 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74  son is p->nLimit
9900: 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30  >0 then "LIMIT 0
9910: 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c  " shows.  ** all
9920: 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68   rows.  It is th
9930: 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d  e same as no lim
9940: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61  it. If the compa
9950: 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70  rision is.  ** p
9960: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e  ->nLimit>=0 then
9970: 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20   "LIMIT 0" show 
9980: 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a  no rows at all..
9990: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
99a0: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
99b0: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
99c0: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
99d0: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
99e0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
99f0: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
9a00: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
9a10: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
9a20: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
9a30: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
9a40: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
9a50: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
9a60: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t>=0 ){.    int 
9a70: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
9a80: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
9a90: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
9aa0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
9ab0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
9ac0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
9ad0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9ae0: 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d  nteger, -p->nLim
9af0: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
9b00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9b10: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
9b20: 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c  m, 1);.    p->iL
9b30: 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d  imit = iMem;.  }
9b40: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65  .  if( p->nOffse
9b50: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  t>0 ){.    int i
9b60: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
9b70: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
9b80: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9b90: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
9ba0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
9bb0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
9bc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9bd0: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73  teger, -p->nOffs
9be0: 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  et, 0);.    sqli
9bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9c00: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
9c10: 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  m, 1);.    p->iO
9c20: 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
9c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
9c40: 61 74 65 20 56 44 42 45 20 69 6e 73 74 72 75 63  ate VDBE instruc
9c50: 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  tions that will 
9c60: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
9c70: 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20 77   table that.** w
9c80: 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
9c90: 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 73  an index or to s
9ca0: 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73 75 6c  tore keyed resul
9cb0: 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ts for a compoun
9cc0: 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20 49 6e  d.** select.  In
9cd0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f 70   other words, op
9ce0: 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  en a transient t
9cf0: 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64 73 20  able that needs 
9d00: 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  a.** KeyInfo str
9d10: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e 75 6d  ucture.  The num
9d20: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9d30: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69 73  n the KeyInfo is
9d40: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
9d50: 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  y the result set
9d60: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
9d70: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
9d80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
9d90: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  .**.** Specifica
9da0: 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lly, this routin
9db0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  e is called to o
9dc0: 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74 61 62  pen an index tab
9dd0: 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54 49 4e  le for.** DISTIN
9de0: 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54 45 52  CT, UNION, INTER
9df0: 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54 20  SECT and EXCEPT 
9e00: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
9e10: 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a 20 55  s (but not .** U
9e20: 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  NION ALL)..**.**
9e30: 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 74 61   Make the new ta
9e40: 62 6c 65 20 61 20 4b 65 79 41 73 44 61 74 61 20  ble a KeyAsData 
9e50: 74 61 62 6c 65 20 69 66 20 6b 65 79 41 73 44 61  table if keyAsDa
9e60: 74 61 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ta is true..**.*
9e70: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
9e80: 72 6e 65 64 20 69 73 20 74 68 65 20 61 64 64 72  rned is the addr
9e90: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 70  ess of the OP_Op
9ea0: 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63 74 69  enTemp instructi
9eb0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
9ec0: 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28  t openTempIndex(
9ed0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
9ee0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54  elect *p, int iT
9ef0: 61 62 2c 20 69 6e 74 20 6b 65 79 41 73 44 61 74  ab, int keyAsDat
9f00: 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  a){.  KeyInfo *p
9f10: 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  KeyInfo;.  int n
9f20: 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69 74 65  Column;.  sqlite
9f30: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9f40: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  b;.  int i;.  Vd
9f50: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9f60: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 61 64 64  pVdbe;.  int add
9f70: 72 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e  r;..  if( fillIn
9f80: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
9f90: 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
9fa0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 6f  urn 0;.  }.  nCo
9fb0: 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69 73 74  lumn = p->pEList
9fc0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65 79 49  ->nExpr;.  pKeyI
9fd0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
9fe0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  oc( sizeof(*pKey
9ff0: 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a 73 69  Info)+nColumn*si
a000: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 29  zeof(CollSeq*) )
a010: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
a020: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a030: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
a040: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
a050: 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  c;.  pKeyInfo->n
a060: 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  Field = nColumn;
a070: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
a080: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
a090: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
a0a0: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [i] = sqlite3Exp
a0b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
a0c0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p->pEList->a[i]
a0d0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
a0e0: 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c   !pKeyInfo->aCol
a0f0: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 4b  l[i] ){.      pK
a100: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
a110: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
a120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 64  ;.    }.  }.  ad
a130: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a140: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  Op3(v, OP_OpenTe
a150: 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20 0a 20 20  mp, iTab, 0, .  
a160: 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
a170: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
a180: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20  HANDOFF);.  if( 
a190: 6b 65 79 41 73 44 61 74 61 20 29 7b 0a 20 20 20  keyAsData ){.   
a1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a1b0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
a1c0: 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20 20 7d  a, iTab, 1);.  }
a1d0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
a1e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  }..static int mu
a1f0: 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d  ltiSelectOpenTem
a200: 70 41 64 64 72 28 53 65 6c 65 63 74 20 2a 70 2c  pAddr(Select *p,
a210: 20 69 6e 74 20 61 64 64 72 2c 20 49 64 4c 69 73   int addr, IdLis
a220: 74 20 2a 2a 70 70 4f 70 65 6e 54 65 6d 70 29 7b  t **ppOpenTemp){
a230: 0a 20 20 69 66 28 20 21 70 2d 3e 70 70 4f 70 65  .  if( !p->ppOpe
a240: 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 2a 70 70  nTemp ){.    *pp
a250: 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74  OpenTemp = sqlit
a260: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30  e3IdListAppend(0
a270: 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 70 4f  , 0);.    p->ppO
a280: 70 65 6e 54 65 6d 70 20 3d 20 70 70 4f 70 65 6e  penTemp = ppOpen
a290: 54 65 6d 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Temp;.  }else{. 
a2a0: 20 20 20 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d     *p->ppOpenTem
a2b0: 70 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  p = sqlite3IdLis
a2c0: 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70 70 4f 70  tAppend(*p->ppOp
a2d0: 65 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 7d 0a  enTemp, 0);.  }.
a2e0: 20 20 69 66 28 20 21 28 2a 70 2d 3e 70 70 4f 70    if( !(*p->ppOp
a2f0: 65 6e 54 65 6d 70 29 20 29 7b 0a 20 20 20 20 72  enTemp) ){.    r
a300: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a310: 45 4d 3b 0a 20 20 7d 0a 20 20 28 2a 70 2d 3e 70  EM;.  }.  (*p->p
a320: 70 4f 70 65 6e 54 65 6d 70 29 2d 3e 61 5b 28 2a  pOpenTemp)->a[(*
a330: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29 2d 3e  p->ppOpenTemp)->
a340: 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61 64 64  nId-1].idx = add
a350: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
a360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
a370: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
a380: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
a390: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
a3a0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
a3b0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
a3c0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
a3d0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
a3e0: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
a3f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
a400: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
a410: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 52 65  ;.  }.  if( !pRe
a420: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  t ){.    pRet = 
a430: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
a440: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
a450: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
a460: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
a470: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
a480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a490: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
a4a0: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
a4b0: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
a4c0: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
a4d0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
a4e0: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
a4f0: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
a500: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
a510: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
a520: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
a530: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
a540: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
a550: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
a560: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
a570: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
a580: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
a590: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
a5a0: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
a5b0: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
a5c0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
a5d0: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
a5e0: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
a5f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
a600: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
a610: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
a620: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
a630: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
a640: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
a650: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
a660: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
a670: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
a680: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
a690: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
a6a0: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
a6b0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
a6c0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
a6d0: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
a6e0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a6f0: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
a700: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
a710: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
a720: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
a730: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a740: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
a750: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
a760: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
a770: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
a780: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
a790: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
a7a0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
a7b0: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
a7c0: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
a7d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
a7e0: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
a7f0: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
a800: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
a810: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
a820: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
a830: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
a840: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
a850: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
a860: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
a870: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
a880: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
a890: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
a8a0: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
a8b0: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a8c0: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
a8d0: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
a8e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a8f0: 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 0a   .  Select *p, .
a900: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 0a 20 20    int eDest, .  
a910: 69 6e 74 20 69 50 61 72 6d 2c 20 0a 20 20 63 68  int iParm, .  ch
a920: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
a930: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
a940: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
a950: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
a960: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
a970: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
a980: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
a990: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
a9a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
a9b0: 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  or;     /* Anoth
a9c0: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
a9d0: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
a9e0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
a9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
aa00: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
aa10: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 49 64  his VDBE */.  Id
aa20: 4c 69 73 74 20 2a 70 4f 70 65 6e 54 65 6d 70 20  List *pOpenTemp 
aa30: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  = 0;..  /* Make 
aa40: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
aa50: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
aa60: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
aa70: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
aa80: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
aa90: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
aaa0: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
aab0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
aac0: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
aad0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
aae0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
aaf0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
ab00: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ab10: 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  }.  pPrior = p->
ab20: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50  pPrior;.  if( pP
ab30: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
ab40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ab50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
ab60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
ab70: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
ab80: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
ab90: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
aba0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
abb0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
abc0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
abd0: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
abe0: 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c  ior->nLimit>=0 |
abf0: 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65  | pPrior->nOffse
ac00: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
ac10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ac20: 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
ac30: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
ac40: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
ac50: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
ac60: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
ac70: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ac80: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ac90: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
aca0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
acb0: 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65   a valid query e
acc0: 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20  ngine.  If not, 
acd0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
ace0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
acf0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
ad00: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
ad10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
ad20: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ad30: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
ad40: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
ad50: 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
ad60: 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
ad70: 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
ad80: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65  f( eDest==SRT_Te
ad90: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61  mpTable ){.    a
ada0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
adb0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
adc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
add0: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
ade0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
adf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ae00: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
ae10: 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
ae20: 6e 45 78 70 72 29 3b 0a 20 20 20 20 65 44 65 73  nExpr);.    eDes
ae30: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
ae40: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
ae50: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
ae60: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
ae70: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
ae80: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
ae90: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
aea0: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
aeb0: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
aec0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
aed0: 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d  pPrior->nLimit =
aee0: 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20   p->nLimit;.    
aef0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66      pPrior->nOff
af00: 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74  set = p->nOffset
af10: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
af20: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70  ->ppOpenTemp = p
af30: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20  ->ppOpenTemp;.  
af40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
af50: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
af60: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
af70: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
af80: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  aff);.        if
af90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
afa0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
afb0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
afc0: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
afd0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
afe0: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
aff0: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
b000: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
b010: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
b020: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  et;.        p->n
b030: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
b040: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
b050: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
b060: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
b070: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
b080: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c   iParm, 0, 0, 0,
b090: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70   aff);.        p
b0a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
b0b0: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  r;.        if( r
b0c0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
b0d0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
b0e0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
b0f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
b110: 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e  For UNION ALL ..
b120: 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20  . ORDER BY fall 
b130: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
b140: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
b150: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
b160: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
b170: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
b180: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
b190: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
b1a0: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
b1b0: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
b1c0: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
b1d0: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20    int op = 0;   
b1e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
b1f0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
b200: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
b210: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
b220: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
b230: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
b240: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
b250: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
b260: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c       int nLimit,
b270: 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76   nOffset; /* Sav
b280: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
b290: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
b2a0: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45  ffset */.      E
b2b0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
b2c0: 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  y;  /* The ORDER
b2d0: 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74   BY clause for t
b2e0: 68 65 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  he right SELECT 
b2f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
b300: 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  r;..      priorO
b310: 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  p = p->op==TK_AL
b320: 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20  L ? SRT_Table : 
b330: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
b340: 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f   if( eDest==prio
b350: 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72  rOp && p->pOrder
b360: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d  By==0 && p->nLim
b370: 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73  it<0 && p->nOffs
b380: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
b390: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
b3a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b3b0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
b3c0: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
b3d0: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
b3e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b3f0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
b400: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
b410: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
b420: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
b430: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
b440: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
b450: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
b460: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
b470: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
b480: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
b490: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
b4a0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
b4b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
b4c0: 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74   .        && mat
b4d0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
b4e0: 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  n(pParse, p, p->
b4f0: 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54  pOrderBy, unionT
b500: 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  ab, 1) ){.      
b510: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
b520: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
b530: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
b540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
b550: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
b560: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b570: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
b580: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b590: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29   p->op!=TK_ALL )
b5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b5b0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
b5c0: 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72  TempAddr(p, addr
b5d0: 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20  , &pOpenTemp);. 
b5e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
b5f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b600: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
b610: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b620: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b640: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
b650: 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61  yAsData, unionTa
b660: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 1);.        }
b670: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b680: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
b690: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
b6a0: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
b6b0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
b6c0: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
b6d0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 70        pPrior->pp
b6e0: 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70  OpenTemp = p->pp
b6f0: 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20 20 20 20  OpenTemp;.      
b700: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
b710: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
b720: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
b730: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
b740: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
b750: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
b760: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b770: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
b780: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
b790: 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ALL ){.        s
b7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b7b0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
b7c0: 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  mns, unionTab, p
b7d0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
b7e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Expr);.      }..
b7f0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b800: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
b810: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
b820: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
b830: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
b840: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
b850: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
b860: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
b870: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
b880: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
b890: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
b8a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
b8b0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
b8c0: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
b8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b8e0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
b8f0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   0;.      pOrder
b900: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
b910: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
b920: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  rBy = 0;.      n
b930: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
b940: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
b950: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
b960: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
b970: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
b980: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
b990: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
b9a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
b9b0: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
b9c0: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
b9d0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
b9e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
b9f0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
ba00: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  By;.      p->nLi
ba10: 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  mit = nLimit;.  
ba20: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
ba30: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   nOffset;.      
ba40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ba50: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ba60: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
ba70: 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
ba80: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
ba90: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
baa0: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
bab0: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
bac0: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
bad0: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
bae0: 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
baf0: 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72     if( eDest!=pr
bb00: 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
bb10: 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  b!=iParm ){.    
bb20: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
bb30: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
bb40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bb50: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
bb60: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
bb70: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
bb80: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
bb90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
bba0: 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  rse, 0, p->pELis
bbb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
bbc0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
bbd0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
bbe0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
bbf0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
bc00: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
bc10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bc20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bc30: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
bc40: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
bc50: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
bc60: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
bc70: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74   p);.        iSt
bc80: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
bc90: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
bca0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
bcb0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
bcc0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
bcd0: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
bce0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
bd10: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
bd20: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
bd50: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
bd60: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
bd70: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
bd80: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
bd90: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bda0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bdb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
bdc0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
bdd0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
bde0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bdf0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
be00: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
be10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
be20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
be30: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
be40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be50: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
be60: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
be70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
be80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
be90: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
bea0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
beb0: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
bec0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
bed0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
bee0: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
bef0: 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
bf00: 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ddr;..      /* I
bf10: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
bf20: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
bf30: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
bf40: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
bf50: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
bf60: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
bf70: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
bf80: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
bf90: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
bfa0: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
bfb0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
bfc0: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
bfd0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
bfe0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
bff0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
c000: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
c010: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
c020: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
c030: 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c  e,p,p->pOrderBy,
c040: 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20  tab1,1) ){.     
c050: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
c060: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c070: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c080: 7d 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  }..      addr = 
c090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c0a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
c0b0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
c0c0: 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
c0d0: 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c  tOpenTempAddr(p,
c0e0: 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d   addr, &pOpenTem
c0f0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
c100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c110: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c120: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c130: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c140: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c150: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
c160: 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  b1, 1);.      as
c170: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c180: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
c190: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
c1a0: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
c1b0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
c1c0: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
c1d0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 70        pPrior->pp
c1e0: 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70  OpenTemp = p->pp
c1f0: 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20 20 20 20  OpenTemp;.      
c200: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
c210: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
c220: 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
c230: 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b1, 0, 0, 0, aff
c240: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
c250: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c260: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c270: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c280: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
c290: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
c2a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c2b0: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
c2c0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
c2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c2e0: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
c2f0: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ab2, 0);.      r
c300: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
c310: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
c320: 64 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29  ddr, &pOpenTemp)
c330: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c340: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c350: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c360: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c380: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c390: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32  _KeyAsData, tab2
c3a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 1);.      p->p
c3b0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c3c0: 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69   nLimit = p->nLi
c3d0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  mit;.      p->nL
c3e0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
c3f0: 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f   nOffset = p->nO
c400: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
c410: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
c420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c430: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
c440: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
c450: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
c460: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
c470: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
c480: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69   p->nLimit = nLi
c490: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  mit;.      p->nO
c4a0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
c4b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c4c0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c4d0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c4e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c4f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c500: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
c510: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
c520: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
c530: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
c540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
c550: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
c570: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
c580: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
c590: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
c5a0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
c5b0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
c5c0: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
c5d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
c5e0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
c5f0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
c600: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
c610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c620: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
c630: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
c640: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
c650: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
c660: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
c670: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
c680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c690: 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30  FullKey, tab1, 0
c6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c6b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c6c0: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
c6d0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
c6e0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
c6f0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
c700: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
c710: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
c720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
c740: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
c750: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
c780: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
c790: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c7a0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c7b0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c7c0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c7d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
c7e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
c7f0: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
c800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c810: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
c820: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
c830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c840: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c850: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
c860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c870: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
c880: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
c890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c8a0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
c8b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
c8c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  k;.    }.  }.  a
c8d0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c8e0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
c8f0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
c900: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
c910: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
c920: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
c930: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c940: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
c950: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c960: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
c970: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
c980: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
c990: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
c9a0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
c9b0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
c9c0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c9d0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c9e0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  }..  if( p->pOrd
c9f0: 65 72 42 79 20 7c 7c 20 28 70 4f 70 65 6e 54 65  erBy || (pOpenTe
ca00: 6d 70 20 26 26 20 70 4f 70 65 6e 54 65 6d 70 2d  mp && pOpenTemp-
ca10: 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20 20 20 69  >nId>0) ){.    i
ca20: 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
ca30: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
ca40: 69 6e 74 20 69 3b 0a 20 20 20 20 4b 65 79 49 6e  int i;.    KeyIn
ca50: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
ca60: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
ca70: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
ca80: 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  ol*sizeof(CollSe
ca90: 71 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  q*));.    if( !p
caa0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
cab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
cac0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
cad0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
cae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
caf0: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72  Info->enc = pPar
cb00: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
cb10: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
cb20: 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
cb30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
cb40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  i++){.      pKey
cb50: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
cb60: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
cb70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
cb80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4b  );.      if( !pK
cb90: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
cba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
cbb0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
cbc0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
cbd0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
cbe0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
cbf0: 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70 20 26 26  =0; pOpenTemp &&
cc00: 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49   i<pOpenTemp->nI
cc10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  d; i++){.      i
cc20: 6e 74 20 70 33 74 79 70 65 20 3d 20 28 69 3d 3d  nt p3type = (i==
cc30: 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  0?P3_KEYINFO_HAN
cc40: 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29  DOFF:P3_KEYINFO)
cc50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
cc60: 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b   = pOpenTemp->a[
cc70: 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 73 71  i].idx;.      sq
cc80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
cc90: 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
cca0: 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74   *)pKeyInfo, p3t
ccb0: 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ype);.    }..   
ccc0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
ccd0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
cce0: 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  0; i<p->pOrderBy
ccf0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
cd00: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
cd10: 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  pr = p->pOrderBy
cd20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
cd30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
cd40: 65 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  e = p->pOrderBy-
cd50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
cd60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
cd70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
cd80: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  N && pExpr->iCol
cd90: 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  umn<nCol );.    
cda0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 45 78      assert( !pEx
cdb0: 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
cdc0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
cdd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
cde0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
cdf0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
ce00: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d  pParse, zName, -
ce10: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
ce20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  e{.          pEx
ce30: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  pr->pColl = pKey
ce40: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45 78 70  Info->aColl[pExp
ce50: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20  r->iColumn];.   
ce60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ce70: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
ce80: 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
ce90: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
cea0: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
ceb0: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
cec0: 69 66 28 20 21 70 4f 70 65 6e 54 65 6d 70 20 29  if( !pOpenTemp )
ced0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
cee0: 68 61 70 70 65 6e 73 20 66 6f 72 20 55 4e 49 4f  happens for UNIO
cef0: 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20  N ALL ... ORDER 
cf00: 42 59 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  BY */.      sqli
cf10: 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  teFree(pKeyInfo)
cf20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d 75 6c  ;.    }.  }..mul
cf30: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
cf40: 20 69 66 28 20 70 4f 70 65 6e 54 65 6d 70 20 29   if( pOpenTemp )
cf50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
cf60: 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65 6e 54  istDelete(pOpenT
cf70: 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  emp);.  }.  p->p
cf80: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20  pOpenTemp = 0;. 
cf90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cfa0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
cfb0: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
cfc0: 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
cfd0: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
cfe0: 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
cff0: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
d000: 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
d010: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
d020: 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
d030: 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
d040: 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
d050: 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
d060: 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
d070: 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
d080: 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
d090: 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
d0a0: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
d0b0: 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
d0c0: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
d0d0: 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
d0e0: 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
d0f0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
d100: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
d110: 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
d120: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
d130: 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
d140: 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
d150: 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
d160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
d170: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
d180: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
d190: 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
d1a0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
d1b0: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
d1c0: 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
d1d0: 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
d1e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d1f0: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
d200: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
d210: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
d220: 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73  ist*,int,ExprLis
d230: 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  t*);  /* Forward
d240: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
d250: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
d260: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
d270: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
d280: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
d290: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
d2a0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
d2b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
d2c0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
d2d0: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
d2e0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
d2f0: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
d300: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
d310: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d320: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
d330: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
d340: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
d350: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
d360: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
d370: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
d380: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
d390: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
d3a0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
d3b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
d3c0: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
d3d0: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
d3e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
d3f0: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
d400: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
d410: 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
d420: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
d430: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
d440: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
d450: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
d460: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
d470: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
d480: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
d490: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
d4a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
d4b0: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
d4c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d4d0: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
d4e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
d4f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
d500: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
d510: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
d520: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
d530: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
d540: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
d550: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
d560: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
d570: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
d580: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
d590: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
d5a0: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
d5b0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
d5c0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
d5d0: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
d5e0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  span);.    }.  }
d5f0: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
d600: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
d610: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
d620: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
d630: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
d640: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
d650: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
d660: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
d670: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
d680: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
d690: 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69  oid .substExprLi
d6a0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
d6b0: 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
d6c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d6d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
d6e0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
d6f0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
d700: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
d710: 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
d720: 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
d730: 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
d740: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  EList);.  }.}../
d750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d760: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
d770: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
d780: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
d790: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
d7a0: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
d7b0: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
d7c0: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
d7d0: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
d7e0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
d7f0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
d800: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
d810: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
d820: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
d830: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
d840: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
d850: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
d860: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
d870: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
d880: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
d890: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
d8a0: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
d8b0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
d8c0: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
d8d0: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
d8e0: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
d8f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
d900: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
d910: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
d920: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
d930: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
d940: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
d950: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
d960: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
d970: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
d980: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
d990: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
d9a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
d9b0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d9c0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
d9d0: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
d9e0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
d9f0: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
da00: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
da10: 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
da20: 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
da30: 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
da40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
da50: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
da60: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
da70: 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
da80: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
da90: 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
daa0: 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
dab0: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
dac0: 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
dad0: 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
dae0: 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
daf0: 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
db00: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
db10: 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
db20: 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
db30: 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
db40: 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
db50: 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
db60: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
db70: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
db80: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
db90: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
dba0: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
dbb0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
dbc0: 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
dbd0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
dbe0: 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
dbf0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
dc00: 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
dc10: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
dc20: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
dc30: 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
dc40: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
dc50: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
dc60: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
dc70: 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
dc80: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
dc90: 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
dca0: 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
dcb0: 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
dcc0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
dcd0: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
dce0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
dcf0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
dd00: 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
dd10: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
dd20: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
dd30: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
dd40: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
dd50: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
dd60: 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
dd70: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
dd80: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
dd90: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
dda0: 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
ddb0: 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
ddc0: 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
ddd0: 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
dde0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
ddf0: 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
de00: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
de10: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
de20: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
de30: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
de40: 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
de50: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
de60: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
de70: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
de80: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
de90: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
dea0: 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
deb0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
dec0: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
ded0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
dee0: 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
def0: 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
df00: 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
df10: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
df20: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
df30: 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
df40: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
df50: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
df60: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
df70: 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
df80: 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
df90: 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
dfa0: 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
dfb0: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
dfc0: 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
dfd0: 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
dfe0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
dff0: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
e000: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
e010: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
e020: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
e030: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
e040: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
e050: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
e060: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
e070: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
e080: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
e090: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
e0a0: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
e0b0: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
e0c0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
e0d0: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
e0e0: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
e0f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
e100: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
e110: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
e120: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
e130: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
e140: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
e150: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
e160: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
e170: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
e180: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
e190: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
e1a0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
e1b0: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
e1c0: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
e1d0: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
e1e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
e1f0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
e200: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e210: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
e220: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
e230: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
e240: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
e250: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
e260: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
e270: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
e280: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
e290: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
e2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e2b0: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
e2c0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
e2d0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
e2e0: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
e2f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
e300: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
e310: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
e320: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
e330: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
e340: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
e350: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
e360: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
e370: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
e380: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
e390: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
e3a0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
e3b0: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
e3c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e3d0: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
e3e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e3f0: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
e400: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
e410: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
e420: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
e430: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
e440: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
e450: 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
e460: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
e470: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
e480: 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68  pWhere;..  /* Ch
e490: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
e4a0: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
e4b0: 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
e4c0: 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
e4d0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
e4e0: 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
e4f0: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
e500: 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
e510: 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
e520: 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20  >nSrc );.  pSub 
e530: 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  = pSrc->a[iFrom]
e540: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  .pSelect;.  asse
e550: 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
e560: 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
e570: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
e580: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75  turn 0;.  if( su
e590: 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
e5a0: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
e5b0: 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72  turn 0;.  pSubSr
e5c0: 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
e5d0: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
e5e0: 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53  c );.  if( pSubS
e5f0: 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
e600: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
e610: 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  Sub->isDistinct 
e620: 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  || pSub->nLimit>
e630: 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e  =0) &&  (pSrc->n
e640: 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
e650: 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
e660: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  ;.  }.  if( (p->
e670: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d  isDistinct || p-
e680: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73  >nLimit>=0) && s
e690: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
e6a0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
e6b0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
e6c0: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
e6d0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52  eturn 0;..  /* R
e6e0: 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
e6f0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
e700: 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
e710: 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
e720: 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
e730: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
e740: 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
e750: 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
e760: 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
e770: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
e780: 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
e790: 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
e7a0: 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
e7b0: 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
e7c0: 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
e7d0: 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
e7e0: 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
e7f0: 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
e800: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
e810: 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
e820: 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
e830: 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
e840: 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  thing..  */.  if
e850: 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
e860: 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20  1 && iFrom>0 && 
e870: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
e880: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
e890: 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
e8a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
e8b0: 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
e8c0: 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
e8d0: 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
e8e0: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
e8f0: 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
e900: 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
e910: 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
e920: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
e930: 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
e940: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
e950: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
e960: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
e970: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
e980: 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
e990: 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
e9a0: 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
e9b0: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
e9c0: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
e9d0: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
e9e0: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
e9f0: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
ea00: 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
ea10: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
ea20: 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
ea30: 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
ea40: 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
ea50: 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
ea60: 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
ea70: 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
ea80: 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
ea90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72  ..  */.  if( iFr
eaa0: 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
eab0: 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
eac0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
ead0: 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62  0 .      && pSub
eae0: 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
eaf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
eb00: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
eb10: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
eb20: 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
eb30: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
eb40: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
eb50: 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
eb60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
eb70: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
eb80: 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
eb90: 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
eba0: 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
ebb0: 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
ebc0: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
ebd0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
ebe0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
ebf0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
ec00: 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
ec10: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
ec20: 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
ec30: 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
ec40: 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
ec50: 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
ec60: 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
ec70: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
ec80: 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
ec90: 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
eca0: 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
ecb0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
ecc0: 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
ecd0: 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
ece0: 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
ecf0: 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
ed00: 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
ed10: 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
ed20: 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
ed30: 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
ed40: 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
ed50: 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63 2d   iParent = pSrc-
ed60: 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  >a[iFrom].iCurso
ed70: 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  r;.  {.    int n
ed80: 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
ed90: 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->nSrc;.    int 
eda0: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63 2d  jointype = pSrc-
edb0: 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
edc0: 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  pe;..    if( pSr
edd0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
ede0: 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f   && pSrc->a[iFro
edf0: 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m].pTab->isTrans
ee00: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
ee10: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
ee20: 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  (0, pSrc->a[iFro
ee30: 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  m].pTab);.    }.
ee40: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
ee50: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44  Src->a[iFrom].zD
ee60: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
ee70: 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61  liteFree(pSrc->a
ee80: 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a  [iFrom].zName);.
ee90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
eea0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41  Src->a[iFrom].zA
eeb0: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e  lias);.    if( n
eec0: 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
eed0: 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53    int extra = nS
eee0: 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20  ubSrc - 1;.     
eef0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62   for(i=1; i<nSub
ef00: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
ef10: 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
ef20: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
ef30: 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Src, 0, 0);.    
ef40: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72    }.      p->pSr
ef50: 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20  c = pSrc;.      
ef60: 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
ef70: 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72  -1; i-extra>=iFr
ef80: 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  om; i--){.      
ef90: 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70    pSrc->a[i] = p
efa0: 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b  Src->a[i-extra];
efb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
efc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
efd0: 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
efe0: 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
eff0: 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
f000: 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
f010: 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
f020: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
f030: 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
f040: 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
f050: 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e  From+nSubSrc-1].
f060: 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
f070: 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ype;.  }..  /* N
f080: 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
f090: 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
f0a0: 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
f0b0: 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20  sions for .  ** 
f0c0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
f0d0: 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
f0e0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
f0f0: 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65  ** .  ** Example
f100: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
f110: 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
f120: 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
f130: 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
f140: 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
f150: 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20  >b;.  **   \    
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
f180: 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
f190: 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
f1a0: 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
f1b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
f1c0: 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
f1d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f1e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a  _________/.  **.
f1f0: 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
f200: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
f210: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
f220: 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
f230: 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20  ace we see.  ** 
f240: 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
f250: 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
f260: 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
f270: 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
f280: 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20   "y+10"..  */.  
f290: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
f2a0: 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
f2b0: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
f2c0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45  .  pList = p->pE
f2d0: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
f2e0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
f2f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
f300: 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  *pExpr;.    if( 
f310: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
f320: 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d  e==0 && (pExpr =
f330: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
f340: 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29  pr)->span.z!=0 )
f350: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  {.      pList->a
f360: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
f370: 74 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d  teStrNDup(pExpr-
f380: 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
f390: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  span.n);.    }. 
f3a0: 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29   }.  if( isAgg )
f3b0: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
f3c0: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
f3d0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
f3e0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
f3f0: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
f400: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
f410: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
f420: 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
f430: 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
f440: 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
f450: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
f460: 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
f470: 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
f480: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
f490: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
f4a0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
f4b0: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
f4c0: 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
f4d0: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
f4e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
f4f0: 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
f500: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
f510: 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68  xprDup(pSub->pWh
f520: 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ere);.  }else{. 
f530: 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
f540: 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72   }.  if( subquer
f550: 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73  yIsAgg ){.    as
f560: 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67  sert( p->pHaving
f570: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48  ==0 );.    p->pH
f580: 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72  aving = p->pWher
f590: 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  e;.    p->pWhere
f5a0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73   = pWhere;.    s
f5b0: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
f5c0: 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
f5d0: 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
f5e0: 20 69 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69   if( pSub->pHavi
f5f0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ng ){.      Expr
f600: 20 2a 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69   *pHaving = sqli
f610: 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
f620: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 20  >pHaving);.     
f630: 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
f640: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48  ){.        p->pH
f650: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
f660: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70  xpr(TK_AND, p->p
f670: 48 61 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c  Having, pHaving,
f680: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
f690: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
f6a0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
f6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f6c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
f6d0: 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
f6e0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
f6f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
f700: 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29  (pSub->pGroupBy)
f710: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
f720: 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20  >pWhere==0 ){.  
f730: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
f740: 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  here;.  }else{. 
f750: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
f760: 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
f770: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
f780: 20 20 20 20 69 66 28 20 70 57 68 65 72 65 20 29      if( pWhere )
f790: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  {.      p->pWher
f7a0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  e = sqlite3Expr(
f7b0: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72  TK_AND, p->pWher
f7c0: 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  e, pWhere, 0);. 
f7d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
f7e0: 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
f7f0: 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
f800: 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
f810: 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
f820: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
f830: 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
f840: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
f850: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
f860: 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
f870: 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  t;..  /* Transfe
f880: 72 20 74 68 65 20 6c 69 6d 69 74 20 65 78 70 72  r the limit expr
f890: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
f8a0: 73 75 62 71 75 65 72 79 20 74 6f 20 74 68 65 20  subquery to the 
f8b0: 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79  outer.  ** query
f8c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
f8d0: 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  b->nLimit>=0 ){.
f8e0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69      if( p->nLimi
f8f0: 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  t<0 ){.      p->
f900: 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e  nLimit = pSub->n
f910: 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65  Limit;.    }else
f920: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70   if( p->nLimit+p
f930: 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62  ->nOffset > pSub
f940: 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e  ->nLimit+pSub->n
f950: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
f960: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62  p->nLimit = pSub
f970: 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d  ->nLimit + pSub-
f980: 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f  >nOffset - p->nO
f990: 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ffset;.    }.  }
f9a0: 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d  .  p->nOffset +=
f9b0: 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a   pSub->nOffset;.
f9c0: 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
f9d0: 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
f9e0: 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
f9f0: 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
fa00: 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
fa10: 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
fa20: 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20  tDelete(pSub);. 
fa30: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
fa40: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
fa50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fa60: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e   passed in as an
fa70: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65   argument to see
fa80: 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73   if it.** is a s
fa90: 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
faa0: 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20  ax() query.  If 
fab0: 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71  it is and this q
fac0: 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73  uery can be.** s
fad0: 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61  atisfied using a
fae0: 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20   single seek to 
faf0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72  the beginning or
fb00: 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78   end of an index
fb10: 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61  ,.** then genera
fb20: 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  te the code for 
fb30: 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20  this SELECT and 
fb40: 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68  return 1.  If th
fb50: 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20  is is not a .** 
fb60: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
fb70: 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65  max() query, the
fb80: 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a  n return 0;.**.*
fb90: 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29  * A simply min()
fba0: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20   or max() query 
fbb0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
fbc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
fbd0: 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62   min(a) FROM tab
fbe0: 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  le;.**    SELECT
fbf0: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62   max(a) FROM tab
fc00: 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75  le;.**.** The qu
fc10: 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c  ery may have onl
fc20: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
fc30: 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67   in its FROM arg
fc40: 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a  ument.  There.**
fc50: 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50   can be no GROUP
fc60: 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72   BY or HAVING or
fc70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
fc80: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
fc90: 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d  must.** be the m
fca0: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66  in() or max() of
fcb0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
fcc0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
fcd0: 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e  The column.** in
fce0: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
fcf0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
fd00: 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a  t be indexed..**
fd10: 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65  .** The paramete
fd20: 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  rs to this routi
fd30: 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ne are the same 
fd40: 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65  as for sqlite3Se
fd50: 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74  lect()..** See t
fd60: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
fd70: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
fd80: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
fd90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
fda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
fdb0: 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
fdc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
fdd0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
fde0: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
fdf0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
fe00: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c  int iCol;.  Tabl
fe10: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
fe20: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61   *pIdx;.  int ba
fe30: 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  se;.  Vdbe *v;. 
fe40: 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69   int seekOp;.  i
fe50: 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c  nt cont;.  ExprL
fe60: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
fe70: 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
fe80: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
fe90: 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
fea0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
feb0: 20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f   ..  /* Check to
fec0: 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
fed0: 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
fee0: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
fef0: 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
ff00: 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
ff10: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
ff20: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
ff30: 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
ff40: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
ff50: 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
ff60: 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
ff70: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
ff80: 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
ff90: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
ffa0: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
ffb0: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
ffc0: 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
ffd0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
ffe0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
fff0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
10000 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
10010 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
10020 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
10030 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
10040 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
10050 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
10060 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
10070 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
10080 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  3StrNICmp(pExpr-
10090 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33  >token.z,"min",3
100a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
100b0 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a  Op = OP_Rewind;.
100c0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
100d0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
100e0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
100f0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
10100 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
10110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
10120 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
10130 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  pr = pList->a[0]
10140 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
10150 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
10160 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
10170 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
10180 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  Column;.  pTab =
10190 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
101a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
101b0 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
101c0 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
101d0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
101e0 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
101f0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
10200 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
10210 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
10220 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
10230 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
10240 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
10250 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
10260 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
10270 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
10280 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
10290 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
102a0 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
102b0 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
102c0 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
102d0 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
102e0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
102f0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
10300 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53  }else{.    CollS
10310 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
10320 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
10330 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
10340 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
10350 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
10360 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
10370 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10380 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
10390 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
103a0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
103b0 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e  ==iCol && pIdx->
103c0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
103d0 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ==pColl ) break;
103e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
103f0 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Idx==0 ) return 
10400 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65  0;.  }..  /* Ide
10410 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70  ntify column typ
10420 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
10430 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62   using the callb
10440 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
10450 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
10460 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
10470 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
10480 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
10490 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c  ll..  ** The col
104a0 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61  umn names have a
104b0 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
104c0 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c  rated in the cal
104d0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ling function.. 
104e0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
104f0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10500 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10510 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49  eturn 0;..  /* I
10520 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
10530 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
10540 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
10550 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
10560 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
10570 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
10580 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10590 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
105a0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
105b0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
105c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
105d0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
105e0 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
105f0 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
10600 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
10610 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
10620 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
10630 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
10640 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
10650 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
10660 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
10670 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
10680 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
10690 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
106a0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
106b0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
106c0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
106d0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
106e0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
106f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
10700 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
10710 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29  arse, pTab->iDb)
10720 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d  ;.  base = pSrc-
10730 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
10740 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
10750 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
10760 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  );.  if( pSrc->a
10770 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [0].pSelect==0 )
10780 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10790 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
107a0 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
107b0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
107c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
107d0 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20  OpenRead, base, 
107e0 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
107f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10800 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
10810 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20 70 54 61  lumns, base, pTa
10820 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  b->nCol);.  }.  
10830 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
10840 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10850 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
10860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10870 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
10880 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c   base, 0);.  }el
10890 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
108a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
108b0 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44  nteger, pIdx->iD
108c0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
108d0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
108e0 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2b 31  OpenRead, base+1
108f0 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20  , pIdx->tnum,.  
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b   (char*)&pIdx->k
10920 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
10930 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
10940 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
10950 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  kOp, base+1, 0);
10960 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10970 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
10980 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29  ecno, base+1, 0)
10990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
109a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
109b0 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  se, base+1, 0);.
109c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
109d0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
109e0 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  e, base, 0);.  }
109f0 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d  .  eList.nExpr =
10a00 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c   1;.  memset(&eL
10a10 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  istItem, 0, size
10a20 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a  of(eListItem));.
10a30 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69    eList.a = &eLi
10a40 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e  stItem;.  eList.
10a50 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
10a60 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  pr;.  selectInne
10a70 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
10a80 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30   &eList, 0, 0, 0
10a90 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
10aa0 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20  rm, cont, cont, 
10ab0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
10ac0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10ad0 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
10ae0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10af0 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29  _Close, base, 0)
10b00 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b  ;.  .  return 1;
10b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
10b20 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
10b30 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
10b40 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
10b50 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
10b60 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
10b70 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
10b80 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
10b90 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
10ba0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
10bb0 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
10bc0 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
10bd0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
10be0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
10bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
10c10 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
10c20 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
10c30 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
10c40 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
10c50 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
10c60 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
10c70 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
10c80 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
10c90 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
10ca0 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
10cb0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
10cc0 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20  s keys of table 
10cd0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
10ce0 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
10cf0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
10d00 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
10d10 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
10d20 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
10d30 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d  _Except      Rem
10d40 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  ove results from
10d50 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
10d60 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  able iParm..**.*
10d70 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
10d80 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
10d90 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
10da0 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
10db0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f  ** The table abo
10dc0 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65  ve is incomplete
10dd0 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44  .  Additional eD
10de0 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62  ist value have b
10df0 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65  e added.** since
10e00 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61   this comment wa
10e10 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20  s written.  See 
10e20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  the selectInnerL
10e30 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  oop() function f
10e40 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65  or.** a complete
10e50 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
10e60 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
10e70 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
10e80 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
10e90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
10ea0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
10eb0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
10ec0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
10ed0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
10ee0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
10ef0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
10f00 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
10f10 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
10f20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10f30 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
10f40 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
10f50 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
10f60 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
10f70 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
10f80 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
10f90 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
10fa0 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
10fb0 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
10fc0 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
10fd0 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
10fe0 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
10ff0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
11000 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
11010 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
11020 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
11030 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
11040 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
11050 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
11060 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
11070 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
11080 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
11090 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
110a0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
110b0 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
110c0 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
110d0 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
110e0 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
110f0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
11100 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
11110 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
11120 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
11130 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
11140 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
11150 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
11160 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
11170 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
11180 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
111b0 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
111c0 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
11210 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11220 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
11230 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11240 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
11250 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
11260 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
11270 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
11280 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
11290 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
112a0 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
112b0 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
112c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
112d0 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
112e0 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
112f0 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
11300 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
11310 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
11320 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
11330 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
11340 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11350 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
11360 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
11370 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
11380 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
11390 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
113a0 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
113b0 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
113c0 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
113d0 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
113e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
113f0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
11400 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11410 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
11420 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
11430 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
11440 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
11450 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
11460 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20  coded. */.  int 
11470 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
11480 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
11490 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
114a0 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
114b0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
114c0 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75  /* A parameter u
114d0 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74  sed by the eDest
114e0 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
114f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
11500 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  arent,       /* 
11510 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66  Another SELECT f
11520 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
11530 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a   a sub-query */.
11540 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c    int parentTab,
11550 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11560 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53  x in pParent->pS
11570 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79  rc of this query
11580 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65   */.  int *pPare
11590 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20  ntAgg,       /* 
115a0 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
115b0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
115c0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  unctions */.  ch
115d0 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
115e0 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
115f0 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
11600 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
11610 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ng */.){.  int i
11620 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
11630 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76  WInfo;.  Vdbe *v
11640 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20  ;.  int isAgg = 
11650 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
11660 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
11670 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
11680 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
11690 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
116a0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
116b0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
116c0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
116d0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
116e0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
116f0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
11700 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
11710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
11720 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
11730 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
11740 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11750 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
11760 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
11770 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11780 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
11790 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
117a0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
117b0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
117c0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
117d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
117e0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
117f0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11800 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
11810 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11820 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
11830 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
11840 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
11850 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
11860 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
11870 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
11880 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
11890 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
118a0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
118b0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
118c0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  tion */..  if( s
118d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
118e0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
118f0 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
11900 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
11910 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11920 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
11930 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
11940 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
11950 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
11960 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
11970 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
11980 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
11990 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
119a0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
119b0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
119c0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
119d0 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29  est, iParm, aff)
119e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
119f0 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
11a00 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
11a10 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
11a20 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
11a30 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
11a40 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
11a50 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11a60 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72  >pOrderBy;.  pGr
11a70 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
11a80 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
11a90 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
11aa0 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
11ab0 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
11ac0 20 41 6c 6c 6f 63 61 74 65 20 56 44 42 45 20 63   Allocate VDBE c
11ad0 75 72 73 6f 72 73 20 66 6f 72 20 65 61 63 68 20  ursors for each 
11ae0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11af0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
11b00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
11b10 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
11b20 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
11b30 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
11b40 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
11b50 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
11b60 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
11b70 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
11b80 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
11b90 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
11ba0 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
11bb0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
11bc0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11bd0 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64 20 61 6e  ..  /* Expand an
11be0 79 20 22 2a 22 20 74 65 72 6d 73 20 69 6e 20 74  y "*" terms in t
11bf0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
11c00 28 46 6f 72 20 65 78 61 6d 70 6c 65 20 74 68 65  (For example the
11c10 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20 22 53 45   "*" in.  ** "SE
11c20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 29  LECT * FROM t1")
11c30 20 20 54 68 65 20 66 69 6c 6c 49 6e 43 6f 6c 75    The fillInColu
11c40 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74 69 6e 65  mnlist() routine
11c50 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f 6d 65 0a   also does some.
11c60 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f 75 73 65    ** other house
11c70 6b 65 65 70 69 6e 67 20 2d 20 73 65 65 20 74 68  keeping - see th
11c80 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
11c90 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
11ca0 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43  */.  if( fillInC
11cb0 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65  olumnList(pParse
11cc0 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , p) ){.    goto
11cd0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
11ce0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
11cf0 57 68 65 72 65 3b 0a 20 20 70 45 4c 69 73 74 20  Where;.  pEList 
11d00 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
11d10 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
11d20 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11d30 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
11d40 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
11d50 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
11d60 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
11d70 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
11d80 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
11d90 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  f( (eDest==SRT_M
11da0 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
11db0 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d  _Set) && pEList-
11dc0 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20  >nExpr>1 ){.    
11dd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11de0 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
11df0 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
11e00 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
11e10 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
11e20 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
11e30 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
11e40 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11e50 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44  d;.  }..  /* ORD
11e60 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
11e70 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
11e80 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73  ations..  */.  s
11e90 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
11ea0 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
11eb0 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  on:.    case SRT
11ec0 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73  _Except:.    cas
11ed0 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20  e SRT_Discard:. 
11ee0 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
11ef0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
11f00 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
11f10 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
11f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
11f30 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
11f40 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  int, we should h
11f50 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  ave allocated al
11f60 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  l the cursors th
11f70 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20  at we.  ** need 
11f80 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65  to handle subque
11f90 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  rys and temporar
11fa0 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a  y tables.  .  **
11fb0 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  ** Resolve th
11fc0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
11fd0 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63  nd do a semantic
11fe0 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74  s check on all t
11ff0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  he expressions..
12000 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
12010 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
12020 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
12030 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
12040 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
12050 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74  bList, 0, pEList
12060 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
12070 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
12080 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
12090 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
120a0 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
120b0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
120c0 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  r, 1, &isAgg) ){
120d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
120e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
120f0 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 29  }.  if( pWhere )
12100 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12110 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
12120 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12130 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65  , pEList, pWhere
12140 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
12150 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12160 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
12170 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
12180 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29  e, pWhere, 0, 0)
12190 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
121a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
121b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69  .  }.  if( pHavi
121c0 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47  ng ){.    if( pG
121d0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
121e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
121f0 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
12200 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
12210 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
12220 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20   HAVING");.     
12230 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12250 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
12260 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
12270 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
12280 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
12290 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
122a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
122b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
122c0 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  k(pParse, pHavin
122d0 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  g, 1, &isAgg) ){
122e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
122f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
12300 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  }.  if( pOrderBy
12310 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
12320 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
12330 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12340 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
12350 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
12360 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
12370 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12380 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
12390 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43  pE, &iCol) && iC
123a0 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
123b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
123c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
123d0 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20  prDelete(pE);.  
123e0 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
123f0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
12400 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
12410 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
12420 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
12430 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
12440 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49  ite3ExprResolveI
12450 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
12460 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  ist, pEList, pE)
12470 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
12480 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
124a0 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
124b0 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67  pParse, pE, isAg
124c0 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  g, 0) ){.       
124d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
124e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
124f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
12500 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
12510 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
12520 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12530 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20  r(pE, &iCol)==0 
12540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12550 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12560 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
12570 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
12580 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
12590 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
125a0 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nts");.         
125b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
125c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
125d0 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
125e0 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
125f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
12600 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12610 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
12620 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 63       "ORDER BY c
12630 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
12640 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
12650 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
12660 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
12670 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c   1 and %d", iCol
12680 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
12690 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
126a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
126b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
126c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
126d0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66  GroupBy ){.    f
126e0 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
126f0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
12700 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
12710 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
12720 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
12730 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
12740 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
12750 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
12760 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69  ) && iCol>0 && i
12770 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
12780 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
12790 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
127a0 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
127b0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
127c0 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
127d0 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
127e0 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
127f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12800 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
12810 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
12820 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
12830 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  st, pE) ){.     
12840 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12850 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
12860 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12870 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
12880 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
12890 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
128a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
128b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
128c0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
128d0 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (pE) ){.        
128e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
128f0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
12900 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
12910 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12920 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
12930 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42          "GROUP B
12940 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
12950 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
12960 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20  constants");.   
12970 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
12980 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
12990 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d  }else if( iCol<=
129a0 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
129b0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
129c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
129d0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
129e0 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50            "GROUP
129f0 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   BY column numbe
12a00 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67  r %d out of rang
12a10 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65               "be
12a30 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
12a40 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
12a50 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
12a60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12a80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12a90 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
12aa0 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
12ab0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12ac0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12ad0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
12ae0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
12af0 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
12b00 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69  n names if we wi
12b10 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d  ll be using them
12b20 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20   in a callback. 
12b30 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
12b40 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
12b50 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
12b60 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20  g to some other 
12b70 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a  destination..  *
12b80 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
12b90 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
12ba0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
12bb0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
12bc0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
12bd0 3b 0a 20 20 7d 0a 0a 23 69 66 20 31 20 20 2f 2a  ;.  }..#if 1  /*
12be0 20 49 20 64 6f 20 6e 6f 74 20 74 68 69 6e 6b 20   I do not think 
12bf0 77 65 20 6e 65 65 64 20 74 68 65 20 66 6f 6c 6c  we need the foll
12c00 6f 77 69 6e 67 20 63 6f 64 65 20 61 6e 79 20 6d  owing code any m
12c10 6f 72 65 2e 2e 2e 2e 20 2a 2f 0a 20 20 2f 2a 20  ore.... */.  /* 
12c20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
12c30 6f 6e 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  on is SRT_Union,
12c40 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6e 75   then set the nu
12c50 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
12c60 69 6e 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f  in.  ** the reco
12c70 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  rds that will be
12c80 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
12c90 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
12ca0 6c 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 0a 20  le. The caller. 
12cb0 20 2a 2a 20 63 6f 75 6c 64 6e 27 74 20 64 6f 20   ** couldn't do 
12cc0 74 68 69 73 2c 20 69 6e 20 63 61 73 65 20 74 68  this, in case th
12cd0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
12ce0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
12cf0 6d 20 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20  m .  ** "SELECT 
12d00 2a 20 46 52 4f 4d 20 2e 2e 2e 2e 22 2e 20 0a 20  * FROM ....". . 
12d10 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64   **.  ** We need
12d20 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
12d30 72 65 20 77 65 20 73 74 61 72 74 20 69 6e 73 65  re we start inse
12d40 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e  rting records in
12d50 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 74 65 6d  to the .  ** tem
12d60 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
12d70 69 63 68 20 68 61 73 20 68 61 64 20 4f 50 5f 4b  ich has had OP_K
12d80 65 79 41 73 44 61 74 61 20 65 78 65 63 75 74 65  eyAsData execute
12d90 64 20 6f 6e 20 69 74 29 2c 20 62 65 63 61 75 73  d on it), becaus
12da0 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 72 65 71  e.  ** it is req
12db0 75 69 72 65 64 20 62 79 20 74 68 65 20 6b 65 79  uired by the key
12dc0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
12dd0 74 69 6f 6e 2e 20 53 6f 20 64 6f 20 69 74 20 6e  tion. So do it n
12de0 6f 77 2c 20 65 76 65 6e 0a 20 20 2a 2a 20 74 68  ow, even.  ** th
12df0 6f 75 67 68 20 74 68 69 73 20 6d 65 61 6e 73 20  ough this means 
12e00 74 68 61 74 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  that OP_SetNumCo
12e10 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 65 78 65  lumns may be exe
12e20 63 75 74 65 64 20 6f 6e 20 74 68 65 20 73 61 6d  cuted on the sam
12e30 65 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 6d 6f  e.  ** cursor mo
12e40 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20  re than once..  
12e50 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
12e60 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a 20 20 20  SRT_Union ){.   
12e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e80 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
12e90 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 70 45  lumns, iParm, pE
12ea0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
12eb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
12ec0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
12ed0 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
12ee0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12ef0 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  use.  */.  for(i
12f00 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
12f10 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
12f20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
12f30 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
12f40 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  0;.    int needR
12f50 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a  estoreContext;..
12f60 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
12f70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[i].pSelect==
12f80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12f90 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
12fa0 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b  a[i].zName!=0 ){
12fb0 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
12fc0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
12fd0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
12fe0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
12ff0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54  AuthContext = pT
13000 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
13010 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
13020 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
13030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13040 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
13050 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
13060 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
13070 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
13080 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
13090 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t, SRT_TempTable
130a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
130b0 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
130c0 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69  i].iCursor, p, i
130d0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
130e0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
130f0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
13100 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
13110 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
13120 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
13130 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
13140 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
13150 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
13160 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
13170 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
13180 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
13190 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
131a0 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
131b0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
131c0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
131d0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
131e0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
131f0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
13200 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
13210 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
13220 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  t;.  }..  /* Che
13230 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
13240 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
13250 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
13260 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
13270 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
13280 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
13290 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
132a0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
132b0 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
132c0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
132d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
132e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
132f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
13300 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
13310 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
13320 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
13330 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
13340 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
13350 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
13360 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
13370 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
13380 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
13390 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
133a0 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
133b0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
133c0 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
133d0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
133e0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
133f0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
13400 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
13410 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
13420 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
13430 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13440 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f  , resolve any co
13450 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13460 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61  s.  ** names tha
13470 74 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 6c  t have been expl
13480 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
13490 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
134a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
134b0 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
134c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
134d0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
134e0 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  y->a[i].zName ){
134f0 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
13500 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  y->a[i].pExpr->p
13510 43 6f 6c 6c 20 3d 20 0a 20 20 20 20 20 20 20 20  Coll = .        
13520 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
13530 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13540 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13550 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
13560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13570 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
13580 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
13590 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
135a0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
135b0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
135c0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
135d0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
135e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
135f0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
13600 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
13610 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
13620 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
13630 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
13640 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
13650 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13660 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
13670 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
13680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13690 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
136a0 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 70  olumns, iParm, p
136b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
136c0 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61   }..  /* Do an a
136d0 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65  nalysis of aggre
136e0 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  gate expressions
136f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41  ..  */.  sqliteA
13700 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
13710 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  t(pParse);.  if(
13720 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70   isAgg || pGroup
13730 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
13740 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d  ( pParse->nAgg==
13750 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20 3d  0 );.    isAgg =
13760 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
13770 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
13780 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
13790 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
137a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
137b0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
137c0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
137d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
137e0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
137f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
13800 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66  oupBy ){.      f
13810 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
13820 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
13830 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
13840 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13850 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
13860 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
13870 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
13880 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13890 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
138a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
138b0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
138c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
138d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
138e0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29  arse, pHaving) )
138f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
13900 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
13910 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
13920 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
13930 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
13940 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13950 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13960 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
13970 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64  tes(pParse, pOrd
13980 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
13990 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
139a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
139b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
139c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
139d0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
139e0 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66  egator.  */.  if
139f0 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ( isAgg ){.    i
13a00 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
13a10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13a20 5f 41 67 67 52 65 73 65 74 2c 20 28 70 47 72 6f  _AggReset, (pGro
13a30 75 70 42 79 3f 30 3a 31 29 2c 20 70 50 61 72 73  upBy?0:1), pPars
13a40 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f  e->nAgg);.    fo
13a50 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
13a60 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
13a70 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
13a80 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46  c;.      if( (pF
13a90 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  unc = pParse->aA
13aa0 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20  gg[i].pFunc)!=0 
13ab0 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c  && pFunc->xFinal
13ac0 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
13ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
13ae0 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20  (v, OP_AggInit, 
13af0 30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46 75  0, i, (char*)pFu
13b00 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b  nc, P3_FUNCDEF);
13b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
13b30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
13b40 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
13b50 29 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ) + pGroupBy->nE
13b60 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  xpr*sizeof(CollS
13b70 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79 49  eq*);.      KeyI
13b80 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
13b90 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c  Info *)sqliteMal
13ba0 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 69  loc(sz);.      i
13bb0 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20  f( 0==pKey ){.  
13bc0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
13bd0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
13be0 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20 3d       pKey->enc =
13bf0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
13c00 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e 46  ;.      pKey->nF
13c10 69 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79 2d  ield = pGroupBy-
13c20 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66 6f  >nExpr;.      fo
13c30 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
13c40 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
13c50 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43          pKey->aC
13c60 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
13c70 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13c80 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
13c90 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
13ca0 20 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61 43     if( !pKey->aC
13cb0 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
13cc0 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
13cd0 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  i] = pParse->db-
13ce0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
13cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13d10 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
13d20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
13d30 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
13d40 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  F);.    }.  }.. 
13d50 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
13d60 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
13d70 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
13d80 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
13d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13da0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13db0 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
13dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13dd0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
13de0 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
13df0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
13e00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13e10 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
13e20 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
13e30 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
13e40 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e  ct ){.    distin
13e50 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
13e60 62 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e 54 65 6d  b++;.    openTem
13e70 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  pIndex(pParse, p
13e80 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a  , distinct, 0);.
13e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
13ea0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
13eb0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
13ec0 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
13ed0 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  */.  pWInfo = sq
13ee0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
13ef0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
13f00 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20  , pWhere, 0, .  
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 70 47 72 6f 75 70            pGroup
13f30 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72  By ? 0 : &pOrder
13f40 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  By);.  if( pWInf
13f50 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
13f60 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
13f70 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
13f80 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
13f90 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
13fa0 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
13fb0 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
13fc0 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
13fd0 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
13fe0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
13ff0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
14000 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
14010 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
14020 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
14030 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
14040 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
14050 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20  ak, aff) ){.    
14060 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
14070 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
14080 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65   /* If we are de
14090 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65  aling with aggre
140a0 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74  gates, then do t
140b0 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65  he special aggre
140c0 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73  gate.  ** proces
140d0 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65  sing.  .  */.  e
140e0 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72  lse{.    AggExpr
140f0 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66 28 20   *pAgg;.    if( 
14100 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
14110 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20    int lbl1;.    
14120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
14130 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
14140 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
14150 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14160 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
14170 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
14180 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61   }.      /* No a
14190 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
141a0 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
141b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d  e following OP_M
141c0 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20 20 20  akeRecord .     
141d0 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 64   ** because we d
141e0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f  o not need to do
141f0 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66   any coercion of
14200 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20   datatypes. */. 
14210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14220 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
14230 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70 42 79  Record, pGroupBy
14240 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
14250 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
14260 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14280 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14290 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c  AggFocus, 0, lbl
142a0 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  1);.      for(i=
142b0 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e  0, pAgg=pParse->
142c0 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e  aAgg; i<pParse->
142d0 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b  nAgg; i++, pAgg+
142e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
142f0 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f  pAgg->isAgg ) co
14300 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14310 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14320 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45  pParse, pAgg->pE
14330 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
14340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14350 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20  , OP_AggSet, 0, 
14360 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
14370 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14380 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
14390 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
143a0 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72  r(i=0, pAgg=pPar
143b0 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72  se->aAgg; i<pPar
143c0 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70  se->nAgg; i++, p
143d0 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  Agg++){.      Ex
143e0 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e  pr *pE;.      in
143f0 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 46  t nExpr;.      F
14400 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
14410 20 20 20 20 69 66 28 20 21 70 41 67 67 2d 3e 69      if( !pAgg->i
14420 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
14430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14440 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b  Agg->pFunc!=0 );
14450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14460 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65  Agg->pFunc->xSte
14470 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  p!=0 );.      pD
14480 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63  ef = pAgg->pFunc
14490 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 41 67  ;.      pE = pAg
144a0 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  g->pExpr;.      
144b0 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
144c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
144d0 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  E->op==TK_AGG_FU
144e0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
144f0 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
14500 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
14510 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
14520 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
14530 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14540 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
14550 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
14560 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  >needCollSeq ){.
14570 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14580 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
14590 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
145a0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70 43 6f     for(j=0; !pCo
145b0 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b 20 6a  ll && j<nExpr; j
145c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ++){.          p
145d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
145e0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
145f0 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a  , pE->pList->a[j
14600 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
14610 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14620 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
14630 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
14640 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
14650 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
14660 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
14670 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
14680 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P3_COLLSEQ);.
14690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
146a0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
146b0 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e  OP_AggFunc, 0, n
146c0 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65  Expr, (char*)pDe
146d0 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  f, P3_POINTER);.
146e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
146f0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
14700 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
14710 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
14720 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
14730 2a 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63  * If we are proc
14740 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
14750 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65  s, we need to se
14760 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f  t up a second lo
14770 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c  op.  ** over all
14780 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
14790 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f  e values and pro
147a0 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a  cess them..  */.
147b0 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
147c0 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20     int endagg = 
147d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
147e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
147f0 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73   startagg;.    s
14800 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65  tartagg = sqlite
14810 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14820 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64  _AggNext, 0, end
14830 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65  agg);.    pParse
14840 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20 20  ->useAgg = 1;.  
14850 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
14860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14870 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14880 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
14890 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  agg, 1);.    }. 
148a0 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
148b0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
148c0 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
148d0 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
148e0 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
14900 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20  Parm, startagg, 
14910 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b 0a  endagg, aff) ){.
14920 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
14930 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
14940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14950 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
14960 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20   startagg);.    
14970 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14980 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67  veLabel(v, endag
14990 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
149a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
149b0 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oop, 0, 0);.    
149c0 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
149d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
149e0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
149f0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
14a00 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
14a10 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
14a20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
14a30 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
14a40 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
14a50 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
14a60 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
14a70 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
14a80 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
14a90 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
14aa0 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  arm);.  }..  /* 
14ab0 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
14ac0 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
14ad0 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
14ae0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
14af0 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
14b00 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65   table.  So dele
14b10 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  te the subquery 
14b20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
14b30 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74  he parent.  ** t
14b40 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73  o prevent this s
14b50 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
14b60 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
14b70 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
14b80 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  the.  ** the use
14b90 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
14ba0 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
14bb0 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
14bc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
14bd0 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70  nt->pSrc->nSrc>p
14be0 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20  arentTab );.    
14bf0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
14c00 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
14c10 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29  ab].pSelect==p )
14c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
14c30 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  ectDelete(p);.  
14c40 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
14c50 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
14c60 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  elect = 0;.  }..
14c70 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
14c80 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
14c90 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
14ca0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
14cb0 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
14cc0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
14cd0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
14ce0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
14cf0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
14d00 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
14d10 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
14d20 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
14d30 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
14d40 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
14d50 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c  elect_end:.  sql
14d60 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
14d70 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20  Reset(pParse);. 
14d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.