/ Hex Artifact Content
Login

Artifact 7036757825668f28e446fea3fc97775f16667f35:


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 30  select.c,v 1.190
0200: 20 32 30 30 34 2f 30 36 2f 31 35 20 30 32 3a 34   2004/06/15 02:4
0210: 34 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  4:19 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: 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Key, pOrderBy->n
2570: 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Expr, 0);.  sqli
2580: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2590: 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30  OP_SortPut, 0, 0
25a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
25b0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
25c0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
25d0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
25e0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
25f0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
2600: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
2610: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
2620: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
2630: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
2640: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
2650: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
2660: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
2670: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
2680: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
2690: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
26a0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
26b0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
26c0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
26d0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
26e0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
26f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
2700: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
2710: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2720: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2730: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2740: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2760: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
2770: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2780: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
2790: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
27a0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
27b0: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
27c0: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
27d0: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
27e0: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
27f0: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
2800: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
2810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2820: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2830: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
2840: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
2850: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
2860: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
2870: 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20  L, sort results 
2880: 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a  using this key *
2890: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
28a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
28b0: 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65  f >=0, make sure
28c0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
28d0: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65  tinct */.  int e
28e0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
28f0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
2900: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
2910: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
2920: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
2930: 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20   /* An argument 
2940: 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20  to the disposal 
2950: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
2960: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
2970: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
2980: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
2990: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
29a0: 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20  int iBreak,     
29b0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
29c0: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
29d0: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
29e0: 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  oop */.  char *a
29f0: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
2a00: 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72   /* affinity str
2a10: 69 6e 67 20 69 66 20 65 44 65 73 74 20 69 73 20  ing if eDest is 
2a20: 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a  SRT_Union */.){.
2a30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2a50: 20 69 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   i;..  if( v==0 
2a60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
2a70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
2a80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
2a90: 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  e was a LIMIT cl
2aa0: 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45  ause on the SELE
2ab0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
2ac0: 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a  en do the check.
2ad0: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74    ** to see if t
2ae0: 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62  his row should b
2af0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
2b00: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
2b10: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
2b20: 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20  Offset>=0 ){.   
2b30: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
2b40: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2b50: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2b60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2b70: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
2b80: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 2b  ->iOffset, addr+
2b90: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
2ba0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2bb0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
2bc0: 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nue);.    }.    
2bd0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
2be0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2bf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2c00: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
2c10: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
2c20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75    }.  }..  /* Pu
2c30: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
2c40: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
2c50: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
2c60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
2c70: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
2c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
2ca0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b  umn, srcTab, i);
2cb0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2cc0: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45      nColumn = pE
2cd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
2ce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
2cf0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
2d00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2d10: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2d20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
2d30: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
2d40: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
2d50: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
2d60: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
2d70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
2d80: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
2d90: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
2da0: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
2db0: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
2dc0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
2dd0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
2de0: 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d    if( distinct>=
2df0: 30 20 26 26 20 70 45 4c 69 73 74 20 26 26 20 70  0 && pEList && p
2e00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
2e10: 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59  {.#if NULL_ALWAY
2e20: 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 73  S_DISTINCT.    s
2e30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2e40: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70  v, OP_IsNull, -p
2e50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71  EList->nExpr, sq
2e60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2e70: 41 64 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64  Addr(v)+7);.#end
2e80: 69 66 0a 20 20 20 20 2f 2a 20 44 65 6c 69 62 65  if.    /* Delibe
2e90: 72 61 74 65 6c 79 20 6c 65 61 76 65 20 74 68 65  rately leave the
2ea0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
2eb0: 20 6f 66 66 20 6f 66 20 74 68 65 20 66 6f 6c 6c   off of the foll
2ec0: 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 4b 65 79  owing OP_MakeKey
2ed0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
2ee0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2ef0: 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e  akeKey, pEList->
2f00: 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 73  nExpr, 1);.    s
2f10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2f20: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
2f30: 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65  distinct, sqlite
2f40: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2f50: 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
2f60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2f70: 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e  OP_Pop, pEList->
2f80: 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20  nExpr+1, 0);.   
2f90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fa0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2fb0: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
2fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fd0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
2fe0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3000: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69  OP_PutStrKey, di
3010: 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a  stinct, 0);.  }.
3020: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3030: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3040: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3050: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3060: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3070: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3080: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
30a0: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
30b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
30d0: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
30e0: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
30f0: 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  INCT);.      sql
3100: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
3110: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
3120: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
3130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3140: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3150: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3160: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3170: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50  OP_PutStrKey, iP
3180: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
3190: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
31a0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
31b0: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
31c0: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
31d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
31e0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
31f0: 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62  case SRT_TempTab
3200: 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  le: {.      sqli
3210: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3220: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3230: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
3240: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
3250: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
3260: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
3270: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
3280: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
32b0: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
32c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
32e0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
32f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3300: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
3310: 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  tKey, iParm, 0);
3320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3340: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
3350: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
3360: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
3370: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
3380: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
3390: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
33a0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
33b0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
33c0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
33d0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
33e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
33f0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
3400: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
3410: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
3420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3430: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3440: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3450: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
3460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3470: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
3480: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
3490: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
34b0: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
34c0: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
34d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
34e0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
34f0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
3500: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3510: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
3520: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
3530: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
3540: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
3550: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
3560: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
3570: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
3580: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
3590: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
35a0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
35b0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
35c0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
35d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
35e0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
35f0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
3600: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3610: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
3620: 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  2;..      assert
3630: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
3660: 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b  Null, -1, addr1+
3670: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
3680: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3690: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
36a0: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
36b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
36c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
36d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
36e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
36f0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3700: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3710: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3720: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
3730: 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20 20  t *affStr;.     
3740: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69     char aff = (i
3750: 50 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a  Parm>>16)&0xFF;.
3760: 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71          aff = sq
3770: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
3780: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
3790: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
37a0: 20 20 20 20 20 20 20 61 66 66 53 74 72 20 3d 20         affStr = 
37b0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 53  sqlite3AffinityS
37c0: 74 72 69 6e 67 28 61 66 66 29 3b 0a 20 20 20 20  tring(aff);.    
37d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
37e0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  p3(v, OP_MakeKey
37f0: 2c 20 31 2c 20 30 2c 20 61 66 66 53 74 72 2c 20  , 1, 0, affStr, 
3800: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3820: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
3830: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
3840: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3850: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
3860: 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30  Key, (iParm&0x00
3870: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
3880: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
3890: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
38a0: 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65 33  , addr2, sqlite3
38b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
38c0: 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  v));.      break
38d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
38e0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
38f0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
3900: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
3910: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
3920: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
3930: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
3940: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
3950: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
3960: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
3970: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
3980: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
3990: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
39a0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
39b0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
39c0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
39d0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
39e0: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
39f0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3a00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3a20: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
3a30: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
3a40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a50: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3a60: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
3a70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e     }..    /* Sen
3a90: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
3aa0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
3ab0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
3ac0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
3ad0: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
3ae0: 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Sorter: {.      
3af0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3b00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3b10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3b20: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3b30: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mn, 0);.        
3b40: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3b50: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3b60: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3b70: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
3b80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
3b90: 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  lback );.       
3ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3bb0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
3bc0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3be0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3bf0: 2a 20 49 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f  * Invoke a subro
3c00: 75 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20  utine to handle 
3c10: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
3c20: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
3c30: 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  elf.    ** is re
3c40: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f  sponsible for po
3c50: 70 70 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  pping the result
3c60: 73 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61  s off of the sta
3c70: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
3c80: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
3c90: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
3ca0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
3cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3cc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3cd0: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3ce0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  0);.        push
3cf0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
3d00: 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, v, pOrderBy);
3d10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
3d40: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
3d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3d60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3d70: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
3d80: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
3d90: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
3da0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
3db0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
3dc0: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
3dd0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
3de0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
3df0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
3e00: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
3e10: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
3e20: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
3e30: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
3e40: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
3e50: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
3e60: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
3e70: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
3e80: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
3e90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
3ea0: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ard );.      sql
3eb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ec0: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
3ed0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
3ee0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
3ef0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3f00: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
3f10: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
3f20: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
3f30: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
3f40: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
3f50: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
3f60: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
3f70: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
3f80: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
3f90: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
3fa0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
3fb0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
3fc0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
3fd0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
3fe0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
3ff0: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
4000: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
4010: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
4020: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
4030: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65  pParse,   /* The
4040: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
4050: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
4060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
4070: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
4080: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
4090: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
40a0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
40b0: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
40c0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75  olumn,     /* Nu
40d0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
40e0: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  of data */.  int
40f0: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a   eDest,       /*
4100: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
4110: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
4120: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20  /.  int iParm   
4130: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
4140: 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63   parameter assoc
4150: 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73 74  iated with eDest
4160: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64   */.){.  int end
4170: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  1 = sqlite3VdbeM
4180: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
4190: 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c 69 74 65  nt end2 = sqlite
41a0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
41b0: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  );.  int addr;. 
41c0: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
41d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
41e0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 43 6f  derBy;.  int nCo
41f0: 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a  l, i;.  sqlite *
4200: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4210: 0a 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ..  if( eDest==S
4220: 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75  RT_Sorter ) retu
4230: 72 6e 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  rn;.  pOrderBy =
4240: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
4250: 6e 43 6f 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d  nCol = pOrderBy-
4260: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
4270: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4280: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
4290: 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f   nCol*(sizeof(Co
42a0: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
42b0: 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72  if( pInfo==0 ) r
42c0: 65 74 75 72 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e  eturn;.  pInfo->
42d0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68  aSortOrder = (ch
42e0: 61 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  ar*)&pInfo->aCol
42f0: 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f  l[nCol];.  pInfo
4300: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
4310: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
4320: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ol; i++){.    /*
4330: 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   If a collation 
4340: 73 65 71 75 65 6e 63 65 20 77 61 73 20 73 70 65  sequence was spe
4350: 63 69 66 69 65 64 20 65 78 70 6c 69 63 69 74 79  cified explicity
4360: 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a  , then it.    **
4370: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 4f   is stored in pO
4380: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61  rderBy->a[i].zNa
4390: 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  me. Otherwise, u
43a0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  se the default. 
43b0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
43c0: 74 79 70 65 20 66 6f 72 20 74 68 65 20 65 78 70  type for the exp
43d0: 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ression..    */.
43e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
43f0: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [i] = sqlite3Exp
4400: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
4410: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
4420: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
4430: 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  !pInfo->aColl[i]
4440: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
4450: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e  >aColl[i] = db->
4460: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
4470: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  .    pInfo->aSor
4480: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
4490: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
44a0: 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rder;.  }.  sqli
44b0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
44c0: 5f 53 6f 72 74 2c 20 30 2c 20 30 2c 20 28 63 68  _Sort, 0, 0, (ch
44d0: 61 72 2a 29 70 49 6e 66 6f 2c 20 50 33 5f 4b 45  ar*)pInfo, P3_KE
44e0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
44f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4500: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4510: 53 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64  SortNext, 0, end
4520: 31 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  1);.  if( p->iOf
4530: 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  fset>=0 ){.    s
4540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4550: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
4560: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 2b  ->iOffset, addr+
4570: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
4580: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4590: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
45a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
45b0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
45c0: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ddr);.  }.  if( 
45d0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
45e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
45f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4600: 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 65  cr, p->iLimit, e
4610: 6e 64 32 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  nd2);.  }.  swit
4620: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
4630: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4640: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
4650: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4670: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4680: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
46a0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
46b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
46c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
46d0: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
46e0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
46f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4700: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4710: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4720: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4740: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
4750: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  l, -1, sqlite3Vd
4760: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4770: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4780: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4790: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
47a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
47b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
47c0: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
47d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
47e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
47f0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
4800: 65 4b 65 79 2c 20 31 2c 20 30 2c 20 22 6e 22 2c  eKey, 1, 0, "n",
4810: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4830: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4840: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
4850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4860: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
4870: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
4880: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
4890: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
48a0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
48b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
48c0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
48d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
48e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
48f0: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4910: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
4920: 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20  , 0, end1);.    
4930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4940: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
4950: 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53  back:.    case S
4960: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
4970: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
4980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4990: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
49a0: 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  er, p->pEList->n
49b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
49c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
49d0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
49e0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
49f0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4a00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
4a10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4a20: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
4a30: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4a40: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
4a50: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
4a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4a70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
4a80: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
4a90: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
4aa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4ac0: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
4ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4af0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
4b00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b10: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4b20: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
4b30: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
4b40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
4b70: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  , 0, addr);.  sq
4b80: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
4b90: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a  Label(v, end2);.
4ba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4bb0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
4bc0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
4bd0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
4be0: 2c 20 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74  , end1);.  sqlit
4bf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c00: 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20  P_SortReset, 0, 
4c10: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  0);.}../*.** Ret
4c20: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4c30: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
4c40: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
4c50: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
4c60: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
4c70: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
4c80: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
4c90: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
4ca0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
4cb0: 20 49 66 20 74 68 65 20 64 65 63 6c 61 72 61 74   If the declarat
4cc0: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
4cd0: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
4ce0: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
4cf0: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
4d00: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
4d10: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4d20: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4d30: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a  n is a column..*
4d40: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
4d50: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
4d60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4d70: 65 69 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d  either TEXT, NUM
4d80: 45 52 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20  ERIC or ANY..** 
4d90: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
4da0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
4db0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
4dc0: 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  R..*/.static con
4dd0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
4de0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
4df0: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  e, SrcList *pTab
4e00: 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  List, Expr *pExp
4e10: 72 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  r){.  char const
4e20: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
4e30: 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70  nt j;.  if( pExp
4e40: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
4e50: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
4e60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
4e70: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 54  TabList ){.    T
4e80: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
4e90: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
4ea0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  ->iColumn;.    f
4eb0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
4ec0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
4ed0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
4ee0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
4ef0: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 61 73  e; j++){}.    as
4f00: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
4f10: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 70 54  ->nSrc );.    pT
4f20: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
4f30: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69 66  [j].pTab;.    if
4f40: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
4f50: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
4f60: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
4f70: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
4f80: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
4f90: 6f 6c 29 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ol) );.    if( i
4fa0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 7a  Col<0 ){.      z
4fb0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
4fc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4fd0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
4fe0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
4ff0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 54  e;.      if( !zT
5000: 79 70 65 20 29 20 7a 54 79 70 65 20 3d 20 22 22  ype ) zType = ""
5010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
5020: 0a 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c  .    switch( sql
5030: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 45 78  ite3ExprType(pEx
5040: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73  pr) ){.      cas
5050: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
5060: 54 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  T:     zType = "
5070: 54 45 58 54 22 3b 20 20 20 20 62 72 65 61 6b 3b  TEXT";    break;
5080: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
5090: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20  TE_AFF_NUMERIC: 
50a0: 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d 45 52 49   zType = "NUMERI
50b0: 43 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C"; break;.     
50c0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
50d0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
50e0: 20 3d 20 22 41 4e 59 22 3b 20 20 20 20 20 62 72   = "ANY";     br
50f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5100: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
5110: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5120: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
5130: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
5140: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5150: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
5160: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
5170: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
5180: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
5190: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
51a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
51b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
51c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
51d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
51e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
51f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5200: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5210: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5220: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5230: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5240: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5250: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5260: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5280: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
5290: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
52a0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
52b0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61  = columnType(pPa
52c0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
52d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
52e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
52f0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
5300: 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63   make it's own c
5310: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
5320: 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20  n-type, in case 
5330: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65  the .    ** sche
5340: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
5350: 72 65 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  re this virtual 
5360: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
5370: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
5380: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5390: 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74  Name(v, i+pEList
53a0: 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20  ->nExpr, zType, 
53b0: 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a  strlen(zType));.
53c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
53d0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
53e0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
53f0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
5400: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
5410: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
5420: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
5430: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
5440: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
5450: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
5460: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
5470: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
5480: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
5490: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
54a0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
54b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
54c0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
54d0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
54e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
54f0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
5500: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
5510: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
5520: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5530: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5540: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
5550: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
5560: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
5570: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
5580: 61 6d 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ames;..  /* If t
5590: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
55a0: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
55b0: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
55c0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
55d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
55e0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
55f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
5600: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
5610: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
5620: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5630: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5640: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5650: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
5660: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5670: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
5680: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
5690: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
56a0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
56b0: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
56c0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
56d0: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
56e0: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
56f0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5700: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5710: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
5720: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5730: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5740: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5750: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5760: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5770: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5780: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
57a0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
57b0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
57c0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
57d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
57e0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
57f0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
5800: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
5810: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
5820: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
5830: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
5840: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
5850: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
5860: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
5870: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
5880: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
5890: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
58a0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
58b0: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
58c0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
58d0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
58e0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
58f0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
5900: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
5910: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
5920: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
5930: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
5940: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
5950: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
5960: 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 7d  ROWID_";.      }
5970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
5980: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
5990: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
59a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
59b0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
59c0: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
59d0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
59e0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
59f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
5a00: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e  olName(v, i, p->
5a10: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
5a20: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
5a30: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
5a40: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
5a50: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
5a60: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
5a70: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
5a80: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
5a90: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
5aa0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5ab0: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
5ac0: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
5ad0: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
5ae0: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
5af0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5b00: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
5b10: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
5b20: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
5b30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5b40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
5b50: 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
5b60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5b70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b80: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
5b90: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
5ba0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
5bb0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
5bc0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
5bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5be0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
5bf0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
5c00: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20  an.n);.      /* 
5c10: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72  sqlite3VdbeCompr
5c20: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
5c30: 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ); */.    }else{
5c40: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d  .      char zNam
5c50: 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73  e[30];.      ass
5c60: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43  ert( p->op!=TK_C
5c70: 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73  OLUMN || pTabLis
5c80: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70  t==0 );.      sp
5c90: 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f  rintf(zName, "co
5ca0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
5cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5cc0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
5cd0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
5ce0: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
5cf0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
5d00: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
5d10: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
5d20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
5d30: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
5d40: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
5d50: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
5d60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5d70: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
5d80: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
5d90: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
5da0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
5db0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
5dc0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
5dd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
5de0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
5df0: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
5e00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
5e10: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
5e20: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
5e30: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
5e40: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
5e50: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
5e60: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
5e70: 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  n z;.}../*.** Fo
5e80: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
5e90: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
5ea0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
5eb0: 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a  (Parse*, Select*
5ec0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  );../*.** Given 
5ed0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
5ee0: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
5ef0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
5f00: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
5f10: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5f20: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
5f30: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
5f40: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
5f50: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
5f60: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
5f70: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
5f80: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
5f90: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
5fa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5fb0: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
5fc0: 6c 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e  l;..  if( fillIn
5fd0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
5fe0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
5ff0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6000: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
6010: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
6020: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
6030: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
6040: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6050: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62  ab->zName = zTab
6060: 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72  Name ? sqliteStr
6070: 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20  Dup(zTabName) : 
6080: 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  0;.  pEList = pS
6090: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
60a0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45   pTab->nCol = pE
60b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  List->nExpr;.  a
60c0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
60d0: 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61  l>0 );.  pTab->a
60e0: 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c  Col = aCol = sql
60f0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
6100: 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29  f(pTab->aCol[0])
6110: 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  *pTab->nCol );. 
6120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
6130: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
6140: 20 20 45 78 70 72 20 2a 70 52 3b 0a 20 20 20 20    Expr *pR;.    
6150: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
6160: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
6170: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
6180: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
6190: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
61a0: 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65     aCol[i].zName
61b0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
61c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
61d0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
61e0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
61f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6200: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
6210: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
6220: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
6230: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6240: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 20 20 73  int cnt;.      s
6250: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
6260: 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  (&aCol[i].zName,
6270: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52   pR->token.z, pR
6280: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
6290: 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30       for(j=cnt=0
62a0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
62b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
62c0: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
62d0: 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69 5d 2e 7a  zName, aCol[i].z
62e0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
62f0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
6300: 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
6310: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [30];.          
6320: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
6330: 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  d",++cnt);.     
6340: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
6350: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
6360: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
6370: 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ng(&aCol[i].zNam
6380: 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  e, pR->token.z, 
6390: 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 7a 42 75  pR->token.n, zBu
63a0: 66 2c 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  f,n,0);.        
63b0: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
63c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
63d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
63e0: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
63f0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
6400: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26  ite3SetNString(&
6410: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
6420: 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20  ame, p->span.z, 
6430: 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20  p->span.n, 0);. 
6440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6450: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6460: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
6470: 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  f, "column%d", i
6480: 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  +1);.      pTab-
6490: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  >aCol[i].zName =
64a0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42   sqliteStrDup(zB
64b0: 75 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  uf);.    }..    
64c0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74  zType = sqliteSt
64d0: 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28  rDup(columnType(
64e0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
64f0: 3e 70 53 72 63 20 2c 70 29 29 3b 0a 20 20 20 20  >pSrc ,p));.    
6500: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  pTab->aCol[i].zT
6510: 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20  ype = zType;.   
6520: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61   pTab->aCol[i].a
6530: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6540: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
6550: 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
6560: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
6570: 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  i].affinity = sq
6580: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
6590: 65 28 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28  e(zType, strlen(
65a0: 7a 54 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zType));.    }. 
65b0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
65c0: 2e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  .pColl = sqlite3
65d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
65e0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
65f0: 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70  !pTab->aCol[i].p
6600: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 54  Coll ){.      pT
6610: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c  ab->aCol[i].pCol
6620: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
6630: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
6640: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
6650: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
6660: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
6670: 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   For the given S
6680: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
6690: 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73   do three things
66a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
66b0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
66c0: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
66d0: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
66e0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
66f0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68        defines th
6700: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
6710: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
6720: 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69 65  canned.  For vie
6730: 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ws,.**         f
6740: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
6750: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
6760: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
6770: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
6780: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
6790: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
67a0: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
67b0: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
67c0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
67d0: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
67e0: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
67f0: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
6800: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
6810: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
6820: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
6830: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
6840: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
6850: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
6860: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
6870: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
6880: 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  2)  Add terms to
6890: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
68a0: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
68b0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
68c0: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
68d0: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
68e0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
68f0: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
6900: 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e  .**    (3)  Scan
6910: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
6920: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
6930: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
6940: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
6950: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
6960: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
6970: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
6980: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
6990: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
69a0: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
69b0: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
69c0: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
69d0: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
69e0: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
69f0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
6a00: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
6a10: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
6a20: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
6a30: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
6a40: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
6a50: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
6a60: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
6a70: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
6a80: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
6a90: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
6aa0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
6ab0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
6ac0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
6ad0: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
6ae0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
6af0: 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28  le *pTab;..  if(
6b00: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
6b10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6b20: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
6b30: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
6b40: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
6b50: 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
6b60: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
6b70: 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  le list..  */.  
6b80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
6b90: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
6ba0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6bb0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a  t->a[i].pTab ){.
6bc0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f        /* This ro
6bd0: 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
6be0: 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74  fore!  No need t
6bf0: 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20  o continue */.  
6c00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6c10: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
6c20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6c40: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
6c50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
6c60: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
6c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
6c80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6c90: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
6ca0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
6cb0: 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ].zAlias==0 ){. 
6cc0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b         char zFak
6cd0: 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20  eName[60];.     
6ce0: 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65     sprintf(zFake
6cf0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75  Name, "sqlite_su
6d00: 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20  bquery_%p_",.   
6d10: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
6d20: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6d30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
6d40: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
6d50: 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  (&pTabList->a[i]
6d60: 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61  .zAlias, zFakeNa
6d70: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  me, 0);.      }.
6d80: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6d90: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6da0: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
6db0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
6dc0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
6dd0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6de0: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
6e10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6e20: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
6e30: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6e40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6e50: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65    }.      /* The
6e60: 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61   isTransient fla
6e70: 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
6e80: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
6e90: 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20  ture has been.  
6ea0: 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c      ** dynamical
6eb0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ly allocated and
6ec0: 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74   may be freed at
6ed0: 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f   any time.  In o
6ee0: 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20  ther words,.    
6ef0: 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74    ** pTab is not
6f00: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70   pointing to a p
6f10: 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20  ersistent table 
6f20: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
6f30: 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  efines.      ** 
6f40: 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65  part of the sche
6f50: 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  ma. */.      pTa
6f60: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d  b->isTransient =
6f70: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
6f80: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
6f90: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
6fa0: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
6fb0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
6fc0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6fd0: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
6fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6ff0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
7000: 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  se,pTabList->a[i
7010: 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74  ].zName,pTabList
7020: 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[i].zDatabase
7030: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
7040: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
7050: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7060: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  }.      if( pTab
7070: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
7080: 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
7090: 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
70a0: 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
70b0: 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
70c0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
70d0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
70e0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
70f0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
7100: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7110: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49    }.        /* I
7120: 66 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  f pTabList->a[i]
7130: 2e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d  .pSelect!=0 it m
7140: 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
7150: 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20  ing with a.     
7160: 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69     ** view withi
7170: 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53  n a view.  The S
7180: 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20  ELECT structure 
7190: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
71a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69  .        ** copi
71b0: 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20  ed by the outer 
71c0: 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73  view so we can s
71d0: 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65  kip the copy ste
71e0: 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a  p here.        *
71f0: 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76  * in the inner v
7200: 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  iew..        */.
7210: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
7220: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
7230: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct==0 ){.       
7240: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
7250: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7260: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61  te3SelectDup(pTa
7270: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
7280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7290: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
72a0: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
72b0: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
72c0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
72d0: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
72e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
72f0: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
7300: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
7310: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
7320: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
7330: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
7340: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
7350: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
7360: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7370: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
7380: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
7390: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
73a0: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
73b0: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
73c0: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
73d0: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
73e0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
73f0: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
7400: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
7410: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
7420: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
7430: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
7440: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
7450: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
7460: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
7470: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
7480: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
7490: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
74a0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
74b0: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
74c0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
74d0: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
74e0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
74f0: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
7500: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
7510: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
7520: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
7530: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7540: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
7550: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
7560: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
7570: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
7580: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
7590: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
75a0: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
75b0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
75c0: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
75d0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
75e0: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
75f0: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
7600: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
7610: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
7620: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
7630: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
7640: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
7650: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
7660: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
7670: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
7680: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
7690: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
76a0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
76b0: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
76c0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
76d0: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
76e0: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
76f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
7700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7710: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
7720: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
7730: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f  pNew = 0;.    fo
7740: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7750: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7760: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61      Expr *pE = a
7770: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
7780: 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
7790: 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20  ALL &&.         
77a0: 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f    (pE->op!=TK_DO
77b0: 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d  T || pE->pRight=
77c0: 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  =0 || pE->pRight
77d0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
77e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
77f0: 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
7800: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
7810: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
7820: 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
7830: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
7840: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7850: 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e  pend(pNew, a[k].
7860: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
7870: 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
7880: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
7890: 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
78a0: 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
78b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
78c0: 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
78d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
78e0: 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
78f0: 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
7900: 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
7910: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
7920: 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
7930: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
7940: 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
7950: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
7960: 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
7970: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
7980: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
7990: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
79a0: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
79b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
79c0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
79d0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
79e0: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d           pName =
79f0: 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b   &pE->pLeft->tok
7a00: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  en;.        }els
7a10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61  e{.          pNa
7a20: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
7a30: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
7a40: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
7a50: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
7a60: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7a70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
7a80: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
7a90: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
7aa0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
7ab0: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
7ac0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
7ad0: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
7ae0: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
7af0: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
7b00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7b10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b20: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26      if( pName &&
7b30: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
7b40: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
7b50: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
7b60: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e       sqlite3StrN
7b70: 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a  ICmp(pName->z, z
7b80: 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  TabName, pName->
7b90: 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  n)!=0 ||.       
7ba0: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
7bb0: 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29  me[pName->n]!=0)
7bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7bd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7bf0: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
7c00: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
7c10: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
7c20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
7c30: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
7c40: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
7c60: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
7c70: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7c90: 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73 74  i>0 && (pTabList
7ca0: 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
7cb0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
7cc0: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
7cd0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
7ce0: 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d  x(pTabList->a[i-
7cf0: 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  1].pTab, zName)>
7d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7d10: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
7d20: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
7d30: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
7d40: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
7d50: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
7d60: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
7d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
7d80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7da0: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 73 71     if( i>0 && sq
7db0: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
7dc0: 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  (pTabList->a[i-1
7dd0: 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ].pUsing, zName)
7de0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
7df0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
7e00: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
7e10: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
7e20: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
7e30: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
7e40: 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
7e50: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
7e60: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
7e70: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7e90: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
7ea0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
7eb0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
7ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7ed0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
7ee0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7ef0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
7f00: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
7f10: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7f20: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  en.n = strlen(zN
7f30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
7f40: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7f50: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7f60: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
7f70: 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  e && pTabList->n
7f80: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
7f90: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
7fa0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
7fb0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7fc0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
7fd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
7fe0: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
7ff0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
8000: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
8010: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8020: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
8030: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62  ->token.z = zTab
8040: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
8050: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
8060: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62  .n = strlen(zTab
8070: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8080: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
8090: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
80a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
80b0: 53 65 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a  SetString((char*
80c0: 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  *)&pExpr->span.z
80d0: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c  , zTabName, ".",
80e0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
80f0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8100: 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  >span.n = strlen
8110: 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b  (pExpr->span.z);
8120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8130: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
8140: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
8150: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
8160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8170: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
8180: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
8190: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
81a0: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
81b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
81d0: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
81e0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
81f0: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
8200: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
8210: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8220: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
8230: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8240: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
8250: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8270: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
8280: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61           if( pNa
8290: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
82c0: 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70  ch table: %T", p
82d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
82e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
82f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8300: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8310: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
8320: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
8330: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
8340: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8350: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
8360: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8370: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
8380: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
8390: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
83a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
83b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73  s routine recurs
83c0: 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68  ively unlinks th
83d0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
83e0: 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a  ].pTab pointers.
83f0: 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73  ** in a select s
8400: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75  tructure.  It ju
8410: 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e  st sets the poin
8420: 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54  ters to NULL.  T
8430: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
8440: 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20 74  s recursive in t
8450: 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 66  he sense that if
8460: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
8470: 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20  .a[].pSelect.** 
8480: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
8490: 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ULL, this routin
84a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
84b0: 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20  rsively on that 
84c0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
84d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
84e0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c  alled on the Sel
84f0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74 68  ect structure th
8500: 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20  at defines a.** 
8510: 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f  VIEW in order to
8520: 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e   undo any bindin
8530: 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54  gs to tables.  T
8540: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
8550: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73  .** because thos
8560: 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62  e tables might b
8570: 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73 75  e DROPed by a su
8580: 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d  bsequent SQL com
8590: 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mand..** If the 
85a0: 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74  bindings are not
85b0: 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74   removed, then t
85c0: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e  he Select.pSrc->
85d0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a  a[].pTab field.*
85e0: 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  * will be left p
85f0: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61  ointing to a dea
8600: 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73  llocated Table s
8610: 74 72 75 63 74 75 72 65 20 61 66 74 65 72 20 74  tructure after t
8620: 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61  he.** DROP and a
8630: 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f   coredump will o
8640: 63 63 75 72 20 74 68 65 20 6e 65 78 74 20 74 69  ccur the next ti
8650: 6d 65 20 74 68 65 20 56 49 45 57 20 69 73 20 75  me the VIEW is u
8660: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
8670: 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64  ite3SelectUnbind
8680: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
8690: 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
86a0: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
86b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
86c0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
86d0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
86e0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
86f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61  +){.    if( (pTa
8700: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  b = pSrc->a[i].p
8710: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
8720: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
8730: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
8740: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
8750: 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20  able(0, pTab);. 
8760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72       }.      pSr
8770: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30  c->a[i].pTab = 0
8780: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
8790: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[i].pSelect )
87a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
87b0: 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  3SelectUnbind(pS
87c0: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
87d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
87e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
87f0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63  is routine assoc
8800: 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e  iates entries in
8810: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
8820: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74  ression list wit
8830: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  h.** columns in 
8840: 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65  a result.  For e
8850: 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70  ach ORDER BY exp
8860: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63  ression, the opc
8870: 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  ode of.** the to
8880: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
8890: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
88a0: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f  LUMN and the iCo
88b0: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  lumn value of.**
88c0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
88d0: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  ode is filled in
88e0: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d   with column num
88f0: 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62  ber and the iTab
8900: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  le.** value of t
8910: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
8920: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
8930: 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65   iTable paramete
8940: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  r..**.** If ther
8950: 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45  e are prior SELE
8960: 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79  CT clauses, they
8970: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
8980: 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a  irst.  A match.*
8990: 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20  * in an earlier 
89a0: 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65  SELECT takes pre
89b0: 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c  cedence over a l
89c0: 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ater SELECT..**.
89d0: 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61  ** Any entry tha
89e0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
89f0: 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61   is flagged as a
8a00: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75  n error.  The nu
8a10: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
8a20: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
8a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
8a40: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8a50: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8a60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8a70: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
8a80: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
8a90: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
8aa0: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
8ab0: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
8ac0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
8ad0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
8ae0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8af0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
8b00: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
8b10: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
8b20: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
8b30: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
8b40: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
8b50: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
8b60: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
8b70: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
8b80: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
8b90: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
8ba0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
8bb0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
8bc0: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8bd0: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
8be0: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
8bf0: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
8c00: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
8c10: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
8c20: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8c30: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
8c40: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8c50: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
8c60: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
8c70: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
8c80: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
8c90: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
8ca0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
8cb0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
8cc0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8cd0: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
8ce0: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
8cf0: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
8d00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8d10: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
8d20: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8d30: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
8d40: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8d50: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8d60: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
8d70: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8d80: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8d90: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
8da0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8db0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
8dd0: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
8de0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
8df0: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
8e00: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8e10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8e20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8e30: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52  e,.          "OR
8e40: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
8e50: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
8e60: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
8e70: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20            iCol, 
8e80: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
8e90: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
8ea0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8ec0: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
8ed0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8ee0: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
8ef0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
8f00: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
8f10: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
8f20: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
8f30: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
8f40: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
8f50: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
8f60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8f70: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
8f80: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
8f90: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
8fa0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
8fb0: 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e  ssert( pE->token
8fc0: 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c  .z );.        zL
8fd0: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  abel = sqliteStr
8fe0: 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  NDup(pE->token.z
8ff0: 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  , pE->token.n);.
9000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9010: 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a  equote(zLabel);.
9020: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9030: 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
9040: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
9050: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
9060: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
9070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
9080: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
9090: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
90a0: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  l<0 && sqlite3Ex
90b0: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
90c0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
90d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
90e0: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
90f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
9100: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
9110: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
9120: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
9130: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
9140: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
9150: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72  Table;.      pOr
9160: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9170: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
9180: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75  if( iCol<0 && mu
9190: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
91a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
91b0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
91c0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
91d0: 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65  rm number %d doe
91e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
91f0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
9200: 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72  i+1);.      nErr
9210: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
9220: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9230: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
9240: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
9250: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
9260: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
9270: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
9280: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
9290: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
92a0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
92b0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
92c0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
92d0: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
92e0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
92f0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
9300: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9310: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
9320: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
9330: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
9340: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
9350: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
9360: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 23 69 66 20 30  turn v;.}..#if 0
9370: 20 20 2f 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f    /***** This ro
9380: 75 74 69 6e 65 20 6e 65 65 64 73 20 64 65 6c 65  utine needs dele
9390: 74 69 6e 67 20 2a 2a 2a 2a 2a 2f 0a 73 74 61 74  ting *****/.stat
93a0: 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c  ic void multiSel
93b0: 65 63 74 41 66 66 69 6e 69 74 79 28 53 65 6c 65  ectAffinity(Sele
93c0: 63 74 20 2a 70 2c 20 63 68 61 72 20 2a 7a 41 66  ct *p, char *zAf
93d0: 66 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  f){.  int i;..  
93e0: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
93f0: 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66  .  multiSelectAf
9400: 66 69 6e 69 74 79 28 70 2d 3e 70 50 72 69 6f 72  finity(p->pPrior
9410: 2c 20 7a 41 66 66 29 3b 0a 0a 20 20 66 6f 72 28  , zAff);..  for(
9420: 69 3d 30 3b 20 69 3c 70 2d 3e 70 45 4c 69 73 74  i=0; i<p->pEList
9430: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9440: 20 20 20 69 66 28 20 7a 41 66 66 5b 69 5d 3d 3d     if( zAff[i]==
9450: 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 7a 41  '\0' ){.      zA
9460: 66 66 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ff[i] = sqlite3E
9470: 78 70 72 41 66 66 69 6e 69 74 79 28 70 2d 3e 70  xprAffinity(p->p
9480: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
9490: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
94a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
94b0: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
94c0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
94d0: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
94e0: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
94f0: 2a 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  * nLimit and nOf
9500: 66 73 65 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c  fset fields.  nL
9510: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
9520: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
9530: 72 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  rs.** that appea
9540: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
9550: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
9560: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
9570: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
9580: 79 77 6f 72 64 73 2e 20 20 4f 72 20 74 68 61 74  ywords.  Or that
9590: 20 68 6f 6c 64 20 2d 31 20 61 6e 64 20 30 20 69   hold -1 and 0 i
95a0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
95b0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a   are omitted..**
95c0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
95d0: 73 65 74 20 61 72 65 20 74 68 65 20 69 6e 74 65  set are the inte
95e0: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
95f0: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a  ter numbers for.
9600: 2a 2a 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ** counters used
9610: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
9620: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
9630: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
9640: 6f 0a 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  o.** limit and/o
9650: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 69  r offset, then i
9660: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
9670: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
9680: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9690: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
96a0: 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20  alues if iLimit 
96b0: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
96c0: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
96d0: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
96e0: 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e  ned by nLimit an
96f0: 64 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d nOffset.  iLim
9700: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
9710: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
9720: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
9730: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
9740: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
9750: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
9760: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
9770: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
9780: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
9790: 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f   nLimit>=0 or nO
97a0: 66 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c  ffset>0 do the l
97b0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
97c0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
97d0: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
97e0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
97f0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
9800: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
9810: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
9820: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
9830: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
9840: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
9850: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
9860: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
9870: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
9880: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
9890: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
98a0: 20 2f 2a 20 0a 20 20 2a 2a 20 49 66 20 74 68 65   /* .  ** If the
98b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70   comparison is p
98c0: 2d 3e 6e 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20  ->nLimit>0 then 
98d0: 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 73 0a  "LIMIT 0" shows.
98e0: 20 20 2a 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20    ** all rows.  
98f0: 49 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  It is the same a
9900: 73 20 6e 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74  s no limit. If t
9910: 68 65 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69  he comparision i
9920: 73 0a 20 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74  s.  ** p->nLimit
9930: 3e 3d 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20  >=0 then "LIMIT 
9940: 30 22 20 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20  0" show no rows 
9950: 61 74 20 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49  at all..  ** "LI
9960: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
9970: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
9980: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
9990: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
99a0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
99b0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
99c0: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
99d0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
99e0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
99f0: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
9a00: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
9a10: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
9a20: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->nLimit>=0 ){.
9a30: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
9a40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
9a50: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
9a60: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9a70: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
9a80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
9a90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9aa0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9ab0: 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a  -p->nLimit, 0);.
9ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
9ae0: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
9af0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
9b00: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
9b10: 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ->nOffset>0 ){. 
9b20: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
9b30: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
9b40: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
9b50: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9b60: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
9b70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
9b80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9b90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
9ba0: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->nOffset, 0);.
9bb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
9bd0: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
9be0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
9bf0: 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iMem;.  }.}../*.
9c00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
9c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
9c20: 61 74 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74  at will open a t
9c30: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74  ransient table t
9c40: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75  hat.** will be u
9c50: 73 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  sed for an index
9c60: 20 6f 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79   or to store key
9c70: 65 64 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61  ed results for a
9c80: 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c   compound.** sel
9c90: 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
9ca0: 6f 72 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61  ords, open a tra
9cb0: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61  nsient table tha
9cc0: 74 20 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79  t needs a.** Key
9cd0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
9ce0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
9cf0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65  olumns in the Ke
9d00: 79 49 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69  yInfo is determi
9d10: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65  ned.** by the re
9d20: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
9d30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9d40: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
9d50: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53  rgument..**.** S
9d60: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
9d70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9d80: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69  led to open an i
9d90: 6e 64 65 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a  ndex table for.*
9da0: 2a 20 44 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f  * DISTINCT, UNIO
9db0: 4e 2c 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64  N, INTERSECT and
9dc0: 20 45 58 43 45 50 54 20 73 65 6c 65 63 74 20 73   EXCEPT select s
9dd0: 74 61 74 65 6d 65 6e 74 73 20 28 62 75 74 20 6e  tatements (but n
9de0: 6f 74 20 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c  ot .** UNION ALL
9df0: 29 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68  )..**.** Make th
9e00: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65  e new table a Ke
9e10: 79 41 73 44 61 74 61 20 74 61 62 6c 65 20 69 66  yAsData table if
9e20: 20 6b 65 79 41 73 44 61 74 61 20 69 73 20 74 72   keyAsData is tr
9e30: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ue..**.** The va
9e40: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
9e50: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
9e60: 68 65 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  he OP_OpenTemp i
9e70: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  nstruction..*/.s
9e80: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 65  tatic int openTe
9e90: 6d 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  mpIndex(Parse *p
9ea0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
9eb0: 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
9ec0: 6b 65 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65  keyAsData){.  Ke
9ed0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
9ee0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a  .  int nColumn;.
9ef0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
9f00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9f10: 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   i;.  Vdbe *v = 
9f20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9f30: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66   int addr;..  if
9f40: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
9f50: 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  st(pParse, p) ){
9f60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9f70: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70   }.  nColumn = p
9f80: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
9f90: 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  .  pKeyInfo = sq
9fa0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
9fb0: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
9fc0: 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c  olumn*sizeof(Col
9fd0: 6c 53 65 71 2a 29 20 29 3b 0a 20 20 69 66 28 20  lSeq*) );.  if( 
9fe0: 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pKeyInfo==0 ) re
9ff0: 74 75 72 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e  turn 0;.  pKeyIn
a000: 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65  fo->enc = pParse
a010: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65  ->db->enc;.  pKe
a020: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
a030: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72 28 69  nColumn;.  for(i
a040: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
a050: 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66  ++){.    pKeyInf
a060: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
a070: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
a080: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
a090: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
a0a0: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
a0b0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
a0c0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
a0d0: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70  aColl[i] = db->p
a0e0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
a0f0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 73 71 6c    }.  addr = sql
a100: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
a110: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54 61 62  P_OpenTemp, iTab
a120: 2c 20 30 2c 20 0a 20 20 20 20 20 20 28 63 68 61  , 0, .      (cha
a130: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
a140: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
a150: 3b 0a 20 20 69 66 28 20 6b 65 79 41 73 44 61 74  ;.  if( keyAsDat
a160: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
a170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a180: 4b 65 79 41 73 44 61 74 61 2c 20 69 54 61 62 2c  KeyAsData, iTab,
a190: 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
a1a0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 73 74 61 74 69  n addr;.}..stati
a1b0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
a1c0: 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 53 65  tOpenTempAddr(Se
a1d0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 61 64 64  lect *p, int add
a1e0: 72 2c 20 49 64 4c 69 73 74 20 2a 2a 70 70 4f 70  r, IdList **ppOp
a1f0: 65 6e 54 65 6d 70 29 7b 0a 20 20 69 66 28 20 21  enTemp){.  if( !
a200: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 29 7b  p->ppOpenTemp ){
a210: 0a 20 20 20 20 2a 70 70 4f 70 65 6e 54 65 6d 70  .    *ppOpenTemp
a220: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
a230: 41 70 70 65 6e 64 28 30 2c 20 30 29 3b 0a 20 20  Append(0, 0);.  
a240: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
a250: 3d 20 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20  = ppOpenTemp;.  
a260: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 2d 3e 70  }else{.    *p->p
a270: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69  pOpenTemp = sqli
a280: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
a290: 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20  *p->ppOpenTemp, 
a2a0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 28  0);.  }.  if( !(
a2b0: 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29 20  *p->ppOpenTemp) 
a2c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a2d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
a2e0: 20 20 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d    (*p->ppOpenTem
a2f0: 70 29 2d 3e 61 5b 28 2a 70 2d 3e 70 70 4f 70 65  p)->a[(*p->ppOpe
a300: 6e 54 65 6d 70 29 2d 3e 6e 49 64 2d 31 5d 2e 69  nTemp)->nId-1].i
a310: 64 78 20 3d 20 61 64 64 72 3b 0a 20 20 72 65 74  dx = addr;.  ret
a320: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a330: 0a 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  ..static CollSeq
a340: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
a350: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
a360: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
a370: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
a380: 53 65 71 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  Seq *pRet = 0;. 
a390: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
a3a0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
a3b0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
a3c0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
a3d0: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  r, iCol);.  }.  
a3e0: 69 66 28 20 21 70 52 65 74 20 29 7b 0a 20 20 20  if( !pRet ){.   
a3f0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
a400: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
a410: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
a420: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
a430: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
a440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a450: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a460: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
a470: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
a480: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
a490: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
a4a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
a4b0: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
a4c0: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
a4d0: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
a4e0: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
a4f0: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
a500: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
a510: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
a520: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
a530: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
a540: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
a550: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
a560: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
a570: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
a580: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
a590: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
a5a0: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
a5b0: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
a5c0: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
a5d0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
a5e0: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
a5f0: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
a600: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
a610: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
a620: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
a630: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a640: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
a650: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
a660: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
a670: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
a680: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
a690: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
a6a0: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
a6b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
a6c0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
a6d0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
a6e0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
a6f0: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
a700: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
a720: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
a730: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
a740: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
a750: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
a760: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
a770: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
a780: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
a790: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a7a0: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
a7b0: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
a7c0: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
a7d0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
a7e0: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
a7f0: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
a800: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
a810: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
a820: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
a830: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
a840: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
a850: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
a860: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
a870: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
a880: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
a890: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
a8a0: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
a8b0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65  *pParse, .  Sele
a8c0: 63 74 20 2a 70 2c 20 0a 20 20 69 6e 74 20 65 44  ct *p, .  int eD
a8d0: 65 73 74 2c 20 0a 20 20 69 6e 74 20 69 50 61 72  est, .  int iPar
a8e0: 6d 2c 20 0a 20 20 63 68 61 72 20 2a 61 66 66 20  m, .  char *aff 
a8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
a900: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
a910: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
a920: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
a930: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a940: 4f 4b 3b 20 20 2f 2a 20 53 75 63 63 65 73 73 20  OK;  /* Success 
a950: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
a960: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
a970: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
a980: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
a990: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
a9a0: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
a9b0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
a9c0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
a9d0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
a9e0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f   */.  IdList *pO
a9f0: 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 0a 20 20  penTemp = 0;..  
aa00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
aa10: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
aa20: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
aa30: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
aa40: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
aa50: 68 65 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  he last SELECT i
aa60: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
aa70: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
aa80: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
aa90: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
aaa0: 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
aab0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
aac0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
aad0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69  _end;.  }.  pPri
aae0: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
aaf0: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
ab00: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
ab10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ab20: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
ab30: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
ab40: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
ab50: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
ab60: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
ab70: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
ab80: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
ab90: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
aba0: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69   if( pPrior->nLi
abb0: 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72  mit>=0 || pPrior
abc0: 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ->nOffset>0 ){. 
abd0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
abe0: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
abf0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
ac00: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
ac10: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
ac20: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
ac30: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
ac40: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
ac50: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
ac60: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ac70: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
ac80: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
ac90: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
aca0: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
acb0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
acc0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
acd0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( v==0 ){.    r
ace0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
acf0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ad00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
ad10: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
ad20: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
ad30: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
ad40: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
ad50: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
ad60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ad70: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
ad80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad90: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
ada0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
adb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
adc0: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
add0: 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 70 2d 3e  umns, iParm, p->
ade0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
adf0: 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f      eDest = SRT_
ae00: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
ae10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
ae20: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
ae30: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
ae40: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
ae50: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
ae60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
ae70: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
ae80: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  >pOrderBy==0 ){.
ae90: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
aea0: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
aeb0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
aec0: 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d  or->nOffset = p-
aed0: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >nOffset;.      
aee0: 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e    pPrior->ppOpen
aef0: 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e  Temp = p->ppOpen
af00: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 72 63  Temp;.        rc
af10: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
af20: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
af30: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
af40: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
af50: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
af60: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
af70: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
af80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
af90: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
afa0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
afb0: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
afc0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
afd0: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
afe0: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
aff0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b000: 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  -1;.        p->n
b010: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
b020: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b030: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b040: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
b050: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
b060: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
b070: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
b080: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
b090: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
b0a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
b0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b0d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f       /* For UNIO
b0e0: 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20  N ALL ... ORDER 
b0f0: 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  BY fall through 
b100: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
b110: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
b120: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
b130: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
b140: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
b150: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
b160: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
b170: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
b180: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
b190: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
b1a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
b1b0: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
b1c0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
b1d0: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
b1e0: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
b1f0: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
b200: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
b210: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
b220: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  cts */.      int
b230: 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74   nLimit, nOffset
b240: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
b250: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
b260: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
b270: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
b280: 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54  *pOrderBy;  /* T
b290: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
b2a0: 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  se for the right
b2b0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
b2c0: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
b2d0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
b2e0: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
b2f0: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
b300: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
b310: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
b320: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
b330: 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20   p->nLimit<0 && 
b340: 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b  p->nOffset==0 ){
b350: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
b360: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
b370: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
b380: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
b390: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
b3a0: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
b3b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
b3c0: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
b3d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3e0: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
b3f0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
b400: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
b410: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
b420: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
b430: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
b440: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
b450: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
b460: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b470: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b480: 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20  pOrderBy .      
b490: 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62    && matchOrderb
b4a0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
b4b0: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
b4c0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29  , unionTab, 1) )
b4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b4e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
b4f0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
b500: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
b510: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
b520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b530: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75  , OP_OpenTemp, u
b540: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
b550: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
b560: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
b570: 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
b580: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
b590: 28 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e  (p, addr, &pOpen
b5a0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Temp);.         
b5b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b5c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
b5d0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b5e0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
b5f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
b600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b610: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
b620: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
b630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b640: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
b650: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
b660: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
b670: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b680: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
b690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
b6a0: 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  rior->ppOpenTemp
b6b0: 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70   = p->ppOpenTemp
b6c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
b6d0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b6e0: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
b6f0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
b700: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
b710: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
b720: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
b730: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b740: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
b750: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op==TK_ALL ){. 
b760: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b770: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
b780: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69  tNumColumns, uni
b790: 6f 6e 54 61 62 2c 20 70 50 72 69 6f 72 2d 3e 70  onTab, pPrior->p
b7a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
b7b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b7c0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
b7d0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
b7e0: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
b7f0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
b800: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
b810: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
b820: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
b830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b840: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
b850: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
b860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b870: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
b880: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
b890: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
b8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
b8b0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
b8c0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
b8d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
b8e0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
b8f0: 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20  .      nLimit = 
b900: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
b910: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->nLimit = -1;
b920: 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d  .      nOffset =
b930: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
b940: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
b950: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
b960: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
b970: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
b980: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
b990: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
b9a0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
b9b0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
b9c0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
b9d0: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
b9e0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
b9f0: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
ba00: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ba10: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ba20: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ba30: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
ba40: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
ba50: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
ba60: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
ba70: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
ba80: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
ba90: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
baa0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
bab0: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
bac0: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
bad0: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
bae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
baf0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
bb00: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
bb10: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
bb20: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bb30: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
bb40: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
bb50: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
bb60: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
bb70: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
bb80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
bb90: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
bba0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
bbb0: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
bbc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
bbd0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
bbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbf0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
bc00: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
bc10: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
bc20: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
bc30: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
bc40: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
bc50: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
bc60: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
bc70: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
bc80: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
bc90: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
bca0: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
bcb0: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
bce0: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
bcf0: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
bd20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
bd30: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
bd40: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
bd50: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
bd60: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
bd70: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
bd80: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
bd90: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
bda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bdb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
bdc0: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
bdd0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
bde0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
bdf0: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
be00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
be10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
be20: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
be30: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
be40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be50: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
be60: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
be70: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
be80: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
be90: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
bea0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
beb0: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  it, nOffset;.   
bec0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
bed0: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
bee0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
bef0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
bf00: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
bf10: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
bf20: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
bf30: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
bf40: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
bf50: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
bf60: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
bf70: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
bf80: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bf90: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
bfa0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
bfb0: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
bfc0: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
bfd0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
bfe0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
bff0: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
c000: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
c010: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c020: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
c030: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c040: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c050: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c060: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
c070: 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 30  penTemp, tab1, 0
c080: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75  );.      rc = mu
c090: 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d  ltiSelectOpenTem
c0a0: 70 41 64 64 72 28 70 2c 20 61 64 64 72 2c 20 26  pAddr(p, addr, &
c0b0: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 20 20  pOpenTemp);.    
c0c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c0d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
c0e0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c0f0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
c100: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c110: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
c120: 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a  Data, tab1, 1);.
c130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c140: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
c150: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
c160: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
c170: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
c180: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
c190: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
c1a0: 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  rior->ppOpenTemp
c1b0: 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70   = p->ppOpenTemp
c1c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c1d0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c1e0: 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55  e, pPrior, SRT_U
c1f0: 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30  nion, tab1, 0, 0
c200: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
c210: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c220: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c230: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c240: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
c250: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
c260: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
c270: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
c280: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
c290: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c2a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
c2b0: 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 30 29 3b  nTemp, tab2, 0);
c2c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  .      rc = mult
c2d0: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
c2e0: 64 64 72 28 70 2c 20 61 64 64 72 2c 20 26 70 4f  ddr(p, addr, &pO
c2f0: 70 65 6e 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  penTemp);.      
c300: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c310: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
c320: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c330: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
c340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c350: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
c360: 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20  ta, tab2, 1);.  
c370: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c380: 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20  0;.      nLimit 
c390: 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  = p->nLimit;.   
c3a0: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d     p->nLimit = -
c3b0: 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74  1;.      nOffset
c3c0: 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   = p->nOffset;. 
c3d0: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
c3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
c3f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c400: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
c410: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
c420: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
c430: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
c440: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  r;.      p->nLim
c450: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
c460: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
c470: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  nOffset;.      i
c480: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c490: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c4a0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c4b0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
c4c0: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
c4d0: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
c4e0: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
c4f0: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
c500: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
c510: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c520: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
c530: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
c540: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
c550: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
c560: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
c570: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
c580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
c590: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
c5a0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c5b0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
c5c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c5d0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
c5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c5f0: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
c600: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
c610: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
c620: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
c630: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
c640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c650: 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c  p(v, OP_FullKey,
c660: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
c670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c680: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
c690: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a  , tab2, iCont);.
c6a0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
c6b0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
c6c0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
c6d0: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
c6e0: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
c710: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
c720: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
c750: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
c760: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  rc ){.        rc
c770: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
c780: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c790: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
c7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
c7b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
c7c0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
c7d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c7e0: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
c7f0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
c800: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
c810: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
c820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c830: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
c840: 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
c850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c860: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c870: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
c880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c890: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
c8a0: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
c8b0: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
c8c0: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
c8d0: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
c8e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
c8f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c900: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
c910: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
c920: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
c930: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
c940: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
c950: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
c960: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
c970: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
c980: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
c990: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c9a0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  _end;.  }..  if(
c9b0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20   p->pOrderBy || 
c9c0: 28 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 70 4f  (pOpenTemp && pO
c9d0: 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29 20  penTemp->nId>0) 
c9e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  ){.    int nCol 
c9f0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
ca00: 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
ca10: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
ca20: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
ca30: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79  loc(sizeof(*pKey
ca40: 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f  Info)+nCol*sizeo
ca50: 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20  f(CollSeq*));.  
ca60: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
ca70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ca80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ca90: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
caa0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
cab0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
cac0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
cad0: 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  enc;.    pKeyInf
cae0: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
caf0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
cb00: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
cb10: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
cb20: 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
cb30: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
cb40: 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
cb50: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e   if( !pKeyInfo->
cb60: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
cb70: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
cb80: 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  oll[i] = pParse-
cb90: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
cba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
cbb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65     for(i=0; pOpe
cbc0: 6e 54 65 6d 70 20 26 26 20 69 3c 70 4f 70 65 6e  nTemp && i<pOpen
cbd0: 54 65 6d 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  Temp->nId; i++){
cbe0: 0a 20 20 20 20 20 20 69 6e 74 20 70 33 74 79 70  .      int p3typ
cbf0: 65 20 3d 20 28 69 3d 3d 30 3f 50 33 5f 4b 45 59  e = (i==0?P3_KEY
cc00: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 50 33 5f  INFO_HANDOFF:P3_
cc10: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
cc20: 69 6e 74 20 61 64 64 72 20 3d 20 70 4f 70 65 6e  int addr = pOpen
cc30: 54 65 6d 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a  Temp->a[i].idx;.
cc40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc50: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
cc60: 72 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  r, (char *)pKeyI
cc70: 6e 66 6f 2c 20 70 33 74 79 70 65 29 3b 0a 20 20  nfo, p3type);.  
cc80: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e    }..    if( p->
cc90: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
cca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ccb0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
ccc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
ccd0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e  xpr *pExpr = p->
cce0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
ccf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68  Expr;.        ch
cd00: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 70  ar *zName = p->p
cd10: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e  OrderBy->a[i].zN
cd20: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
cd30: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
cd40: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
cd50: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c  pr->iColumn<nCol
cd60: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
cd70: 72 74 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c  rt( !pExpr->pCol
cd80: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
cd90: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
cda0: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
cdb0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
cdc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
cdd0: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
cde0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cdf0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
ce00: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
ce10: 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  oll[pExpr->iColu
ce20: 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mn];.        }. 
ce30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e       }.      gen
ce40: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
ce50: 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70  arse, p, v, p->p
ce60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
ce70: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
ce80: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70   }..    if( !pOp
ce90: 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  enTemp ){.      
cea0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
ceb0: 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e  for UNION ALL ..
cec0: 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  . ORDER BY */.  
ced0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
cee0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  KeyInfo);.    }.
cef0: 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
cf00: 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70  t_end:.  if( pOp
cf10: 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71  enTemp ){.    sq
cf20: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
cf30: 65 28 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20  e(pOpenTemp);.  
cf40: 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  }.  p->ppOpenTem
cf50: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
cf60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  rc;.}../*.** Sca
cf70: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
cf80: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
cf90: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
cfa0: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
cfb0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
cfc0: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
cfd0: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
cfe0: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
cff0: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
d000: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
d010: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
d020: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
d030: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
d040: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d050: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
d060: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
d070: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
d080: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
d090: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
d0a0: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
d0b0: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
d0c0: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
d0d0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
d0e0: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
d0f0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
d100: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
d110: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
d120: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
d130: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
d140: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
d150: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
d160: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
d170: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
d180: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
d190: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
d1a0: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
d1b0: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
d1c0: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
d1d0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
d1e0: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
d1f0: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
d200: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
d210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
d220: 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78  stExpr(Expr *pEx
d230: 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  pr, int iTable, 
d240: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d250: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
d260: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
d270: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
d280: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
d290: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
d2a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
d2b0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
d2c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
d2d0: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
d2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
d2f0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
d300: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
d310: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
d320: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
d330: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d340: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
d350: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
d360: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
d370: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
d380: 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
d390: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
d3a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
d3b0: 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
d3c0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
d3d0: 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
d3e0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
d3f0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
d400: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
d410: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
d420: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
d430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d440: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
d450: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
d460: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
d470: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
d480: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
d490: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
d4a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
d4b0: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
d4c0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
d4d0: 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
d4e0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
d4f0: 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
d500: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
d510: 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
d520: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
d530: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
d540: 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
d550: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
d560: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
d570: 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
d580: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
d590: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
d5a0: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
d5b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
d5c0: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
d5d0: 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
d5e0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
d5f0: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
d600: 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
d610: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
d620: 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
d630: 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
d640: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
d650: 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62  static void .sub
d660: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
d670: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
d680: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
d690: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
d6a0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
d6b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
d6c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
d6d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d6e0: 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73    substExpr(pLis
d6f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
d700: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
d710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
d720: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
d730: 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
d740: 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
d750: 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
d760: 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
d770: 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
d780: 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
d790: 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
d7a0: 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
d7b0: 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
d7c0: 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
d7d0: 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
d7e0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
d7f0: 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
d800: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
d810: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
d820: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
d830: 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
d840: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
d850: 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
d860: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
d870: 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
d880: 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
d890: 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
d8a0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
d8b0: 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
d8c0: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
d8d0: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
d8e0: 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
d8f0: 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
d900: 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
d910: 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
d920: 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
d930: 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
d940: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d950: 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
d960: 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
d970: 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
d980: 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
d990: 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
d9a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d9b0: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
d9c0: 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
d9d0: 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
d9e0: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
d9f0: 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
da00: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
da10: 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
da20: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
da30: 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
da40: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
da50: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
da60: 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
da70: 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
da80: 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
da90: 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
daa0: 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
dab0: 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
dac0: 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
dad0: 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
dae0: 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
daf0: 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
db00: 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
db10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
db20: 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
db30: 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
db40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
db50: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
db60: 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
db70: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
db80: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
db90: 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
dba0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
dbb0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
dbc0: 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
dbd0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
dbe0: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
dbf0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
dc00: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
dc10: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
dc20: 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
dc30: 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
dc40: 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
dc50: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
dc60: 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
dc70: 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
dc80: 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
dc90: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
dca0: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
dcb0: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
dcc0: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
dcd0: 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
dce0: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
dcf0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
dd00: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
dd10: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
dd20: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
dd30: 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
dd40: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
dd50: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
dd60: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
dd70: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
dd80: 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
dd90: 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
dda0: 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
ddb0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
ddc0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
ddd0: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
dde0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
ddf0: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
de00: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
de10: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
de20: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
de30: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
de40: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
de50: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
de60: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
de70: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
de80: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
de90: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
dea0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
deb0: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
dec0: 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
ded0: 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
dee0: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
def0: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
df00: 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
df10: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
df20: 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
df30: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
df40: 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
df50: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
df60: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
df70: 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
df80: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
df90: 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
dfa0: 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  #350).**.** In t
dfb0: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
dfc0: 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
dfd0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
dfe0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
dff0: 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
e000: 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
e010: 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
e020: 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
e030: 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
e040: 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
e050: 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
e060: 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
e070: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
e080: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
e090: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
e0a0: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
e0b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e0c0: 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
e0d0: 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
e0e0: 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
e0f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
e100: 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
e110: 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
e120: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
e130: 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
e140: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
e150: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
e160: 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
e170: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
e180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
e190: 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
e1a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e1b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
e1c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e1d0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e1e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
e1f0: 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
e200: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
e210: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
e220: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e230: 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
e240: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
e250: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
e260: 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
e270: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
e280: 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
e290: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
e2a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
e2b0: 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
e2c0: 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
e2d0: 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
e2e0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
e2f0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
e300: 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
e310: 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
e320: 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
e330: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
e340: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
e350: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
e360: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
e370: 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
e380: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
e390: 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
e3a0: 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
e3b0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
e3c0: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
e3d0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
e3e0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
e3f0: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
e400: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
e410: 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
e420: 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
e430: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ble */.  int i;.
e440: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a    Expr *pWhere;.
e450: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
e460: 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
e470: 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
e480: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
e490: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
e4a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
e4b0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
e4c0: 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
e4d0: 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
e4e0: 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
e4f0: 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e  .  pSub = pSrc->
e500: 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74  a[iFrom].pSelect
e510: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
e520: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
e530: 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
e540: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
e550: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
e560: 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
e570: 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  c>1 ) return 0;.
e580: 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
e590: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
e5a0: 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69  ( pSubSrc );.  i
e5b0: 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
e5c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
e5d0: 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44    if( (pSub->isD
e5e0: 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
e5f0: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20  >nLimit>=0) &&  
e600: 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
e610: 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
e620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
e630: 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e  if( (p->isDistin
e640: 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e  ct || p->nLimit>
e650: 3d 30 29 20 26 26 20 73 75 62 71 75 65 72 79 49  =0) && subqueryI
e660: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
e670: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
e680: 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
e690: 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
e6a0: 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
e6b0: 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
e6c0: 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
e6d0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
e6e0: 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
e6f0: 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
e700: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
e710: 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
e720: 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
e730: 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
e740: 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
e750: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
e760: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
e770: 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
e780: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
e790: 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
e7a0: 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
e7b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
e7c0: 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
e7d0: 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
e7e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
e7f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
e800: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
e810: 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
e820: 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72  c->nSrc>1 && iFr
e830: 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
e840: 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
e850: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
e860: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
e870: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
e880: 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
e890: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
e8a0: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
e8b0: 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
e8c0: 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
e8d0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
e8e0: 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
e8f0: 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
e900: 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
e910: 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
e920: 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
e930: 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
e940: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
e950: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
e960: 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
e970: 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
e980: 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
e990: 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
e9a0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
e9b0: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
e9c0: 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
e9d0: 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
e9e0: 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
e9f0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
ea00: 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
ea10: 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
ea20: 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
ea30: 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
ea40: 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
ea50: 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
ea60: 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
ea70: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
ea80: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
ea90: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
eaa0: 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
eab0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
eac0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
ead0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
eae0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
eaf0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
eb00: 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
eb10: 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
eb20: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
eb30: 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
eb40: 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
eb50: 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
eb60: 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
eb70: 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
eb80: 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
eb90: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
eba0: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
ebb0: 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
ebc0: 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
ebd0: 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
ebe0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
ebf0: 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
ec00: 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
ec10: 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
ec20: 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
ec30: 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
ec40: 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
ec50: 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
ec60: 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
ec70: 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
ec80: 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
ec90: 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
eca0: 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
ecb0: 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
ecc0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
ecd0: 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
ece0: 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
ecf0: 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
ed00: 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
ed10: 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
ed20: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
ed30: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ].iCursor;.  {. 
ed40: 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
ed50: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
ed60: 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
ed70: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
ed80: 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20  ].jointype;..   
ed90: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 46 72   if( pSrc->a[iFr
eda0: 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53 72 63  om].pTab && pSrc
edb0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  ->a[iFrom].pTab-
edc0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
edd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
ede0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63  eteTable(0, pSrc
edf0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29  ->a[iFrom].pTab)
ee00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ee10: 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69  teFree(pSrc->a[i
ee20: 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61 73 65 29  From].zDatabase)
ee30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ee40: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
ee50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
ee60: 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69  teFree(pSrc->a[i
ee70: 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  From].zAlias);. 
ee80: 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
ee90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
eea0: 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
eeb0: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
eec0: 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
eed0: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
eee0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
eef0: 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
ef00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ef10: 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
ef20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
ef30: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
ef40: 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
ef50: 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
ef60: 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
ef70: 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
ef80: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
ef90: 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
efa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
efb0: 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
efc0: 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
efd0: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
efe0: 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
eff0: 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
f000: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
f010: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
f020: 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
f030: 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
f040: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
f050: 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
f060: 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
f070: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
f080: 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
f090: 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
f0a0: 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
f0b0: 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
f0c0: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
f0d0: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
f0e0: 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
f0f0: 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
f100: 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
f110: 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
f120: 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
f130: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
f140: 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
f150: 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
f160: 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
f170: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
f180: 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
f190: 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
f1a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f1b0: 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
f1c0: 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
f1d0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
f1e0: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
f1f0: 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
f200: 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
f210: 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
f220: 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
f230: 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
f240: 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
f250: 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70  .  */.  substExp
f260: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
f270: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
f280: 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74  pEList);.  pList
f290: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
f2a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f2b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f2c0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
f2d0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
f2e0: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
f2f0: 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
f300: 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
f310: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
f320: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
f330: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
f340: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
f350: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
f360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f370: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
f380: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
f390: 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
f3a0: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
f3b0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f3c0: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
f3d0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
f3e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
f3f0: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
f400: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
f410: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
f420: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
f430: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
f440: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
f450: 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
f460: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
f470: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
f480: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
f490: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
f4a0: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
f4b0: 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
f4c0: 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
f4d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
f4e0: 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
f4f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
f500: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
f510: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
f520: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
f530: 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
f540: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
f550: 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
f560: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
f570: 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
f580: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
f590: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
f5a0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75  st);.    if( pSu
f5b0: 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  b->pHaving ){.  
f5c0: 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e      Expr *pHavin
f5d0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
f5e0: 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
f5f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
f600: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
f610: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
f620: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
f630: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
f640: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
f650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f660: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
f670: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
f680: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f690: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
f6a0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
f6b0: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
f6c0: 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
f6d0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
f6e0: 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d  e if( p->pWhere=
f6f0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68  =0 ){.    p->pWh
f700: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
f710: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
f720: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
f730: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
f740: 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
f750: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
f760: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
f770: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
f780: 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  p->pWhere, pWher
f790: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
f7a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74  ..  /* The flatt
f7b0: 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
f7c0: 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
f7d0: 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
f7e0: 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65  e.  ** outer que
f7f0: 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
f800: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73  .  */.  p->isDis
f810: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
f820: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
f830: 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
f840: 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69   Transfer the li
f850: 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66  mit expression f
f860: 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
f870: 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20   to the outer.  
f880: 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ** query..  */. 
f890: 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
f8a0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
f8b0: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
f8c0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
f8d0: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
f8e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
f8f0: 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
f900: 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
f910: 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
f920: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
f930: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
f940: 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
f950: 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
f960: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
f970: 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
f980: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69  Offset;..  /* Fi
f990: 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
f9a0: 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
f9b0: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
f9c0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
f9d0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
f9e0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
f9f0: 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
fa00: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
fa10: 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
fa20: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
fa30: 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
fa40: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
fa50: 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
fa60: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
fa70: 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
fa80: 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
fa90: 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
faa0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
fab0: 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
fac0: 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
fad0: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
fae0: 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
faf0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
fb00: 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
fb10: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
fb20: 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
fb30: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
fb40: 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
fb50: 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
fb60: 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
fb70: 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
fb80: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
fb90: 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
fba0: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
fbb0: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
fbc0: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
fbd0: 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
fbe0: 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
fbf0: 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
fc00: 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
fc10: 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
fc20: 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
fc30: 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
fc40: 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
fc50: 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
fc60: 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
fc70: 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
fc80: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
fc90: 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
fca0: 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
fcb0: 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
fcc0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
fcd0: 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
fce0: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
fcf0: 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
fd00: 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
fd10: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a  qlite3Select()..
fd20: 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
fd30: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
fd40: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
fd50: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
fd60: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
fd70: 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
fd80: 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
fd90: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
fda0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
fdb0: 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
fdc0: 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
fdd0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
fde0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
fdf0: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
fe00: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
fe10: 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
fe20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
fe30: 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
fe40: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
fe50: 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
fe60: 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
fe70: 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20  *pSrc;.  ..  /* 
fe80: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
fe90: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
fea0: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
feb0: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
fec0: 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
fed0: 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
fee0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
fef0: 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
ff00: 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
ff10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
ff20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
ff30: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
ff40: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
ff50: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
ff60: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
ff70: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
ff80: 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d  urn 0;.  pExpr =
ff90: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ffa0: 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
ffb0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
ffc0: 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
ffd0: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  ;.  pList = pExp
ffe0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
fff0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
10000 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
10010 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
10020 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
10030 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10040 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
10050 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
10060 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
10070 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
10080 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20  Rewind;.  }else 
10090 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
100a0 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
100b0 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
100c0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
100d0 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  P_Last;.  }else{
100e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
100f0 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69   }.  pExpr = pLi
10100 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
10110 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
10120 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
10130 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20  urn 0;.  iCol = 
10140 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
10150 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
10160 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
10170 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72  If we get to her
10180 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  e, it means the 
10190 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20  query is of the 
101a0 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20  correct form..  
101b0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
101c0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e   sure we have an
101d0 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20   index and make 
101e0 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  pIdx point to th
101f0 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61  e.  ** appropria
10200 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  te index.  If th
10210 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
10220 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45   is on an INTEGE
10230 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b  R PRIMARY.  ** k
10240 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e  ey column, no in
10250 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79  dex is necessary
10260 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20   so set pIdx to 
10270 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a  NULL.  If no.  *
10280 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69  * usable index i
10290 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  s found, return 
102a0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43  0..  */.  if( iC
102b0 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78  ol<0 ){.    pIdx
102c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
102d0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
102e0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
102f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10300 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28 70  Expr);.    for(p
10310 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
10320 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10330 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
10340 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
10350 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20  Column>=1 );.   
10360 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
10370 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26  olumn[0]==iCol &
10380 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  & pIdx->keyInfo.
10390 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20  aColl[0]==pColl 
103a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
103b0 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
103c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
103d0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
103e0 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
103f0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
10400 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
10410 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
10420 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
10430 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
10440 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
10450 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a  emory cell..  **
10460 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
10470 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
10480 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e  een generated in
10490 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
104a0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20  ction..  */.  v 
104b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
104c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
104d0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
104e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
104f0 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
10500 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
10510 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
10520 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
10530 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
10540 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
10550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10560 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
10570 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
10580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10590 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
105a0 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b  umns, iParm, 1);
105b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
105c0 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
105d0 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
105e0 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
105f0 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
10600 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
10610 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
10620 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
10630 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
10640 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
10650 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
10660 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
10670 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
10680 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
10690 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
106a0 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
106b0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  table..  */.  sq
106c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
106d0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
106e0 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65  ab->iDb);.  base
106f0 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43   = pSrc->a[0].iC
10700 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65  ursor;.  compute
10710 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
10720 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
10730 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
10740 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
10750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10760 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
10770 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
10780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10790 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  p(v, OP_OpenRead
107a0 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e  , base, pTab->tn
107b0 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  um);.    sqlite3
107c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
107d0 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 62  SetNumColumns, b
107e0 61 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  ase, pTab->nCol)
107f0 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73  ;.  }.  cont = s
10800 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
10810 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49  bel(v);.  if( pI
10820 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
10830 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10840 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30   seekOp, base, 0
10850 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10870 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10880 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  pIdx->iDb, 0);. 
10890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
108a0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
108b0 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e  , base+1, pIdx->
108c0 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
108d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
108e0 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20  &pIdx->keyInfo, 
108f0 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
10900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10910 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
10920 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
10930 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10940 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61   OP_IdxRecno, ba
10950 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  se+1, 0);.    sq
10960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10970 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
10980 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
10990 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
109a0 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c  OP_MoveGe, base,
109b0 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
109c0 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
109d0 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
109e0 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
109f0 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
10a00 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
10a10 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
10a20 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65  pr = pExpr;.  se
10a30 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
10a40 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
10a50 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
10a60 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74  est, iParm, cont
10a70 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71  , cont, 0);.  sq
10a80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10a90 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
10aa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ab0 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
10ac0 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72  base, 0);.  .  r
10ad0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
10ae0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10af0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
10b00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
10b10 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
10b20 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
10b30 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
10b40 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
10b50 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
10b60 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
10b70 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
10b80 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
10b90 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
10ba0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bd0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
10be0 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
10bf0 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
10c00 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
10c10 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
10c20 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
10c30 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
10c40 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
10c50 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
10c60 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
10c70 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
10c80 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
10c90 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  f table iParm..*
10ca0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
10cb0 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
10cc0 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
10cd0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
10ce0 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
10cf0 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
10d00 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
10d10 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
10d20 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
10d30 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
10d40 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
10d50 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
10d60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
10d70 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Parm.**.** The t
10d80 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e  able above is in
10d90 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74  complete.  Addit
10da0 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75  ional eDist valu
10db0 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a  e have be added.
10dc0 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  ** since this co
10dd0 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65  mment was writte
10de0 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65  n.  See the sele
10df0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
10e00 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20  nction for.** a 
10e10 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67  complete listing
10e20 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20   of the allowed 
10e30 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
10e40 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
10e50 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
10e60 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
10e70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
10e80 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
10e90 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
10ea0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
10eb0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
10ec0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
10ed0 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
10ee0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
10ef0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
10f00 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
10f10 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
10f20 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
10f30 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
10f40 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
10f50 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
10f60 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
10f70 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
10f80 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
10f90 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
10fa0 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
10fb0 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
10fc0 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
10fd0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
10fe0 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
10ff0 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
11000 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
11010 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
11020 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
11030 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
11040 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
11050 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
11060 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
11070 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
11080 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
11090 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
110a0 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
110b0 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
110c0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
110d0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
110e0 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
110f0 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
11100 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
11110 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
11120 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
11130 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
11140 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
11150 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
11160 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
11170 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
11180 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
11190 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
111d0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
111e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
111f0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
11200 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
11210 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11220 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
11230 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
11240 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
11250 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
11260 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
11270 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
11280 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
11290 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
112a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
112b0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
112c0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
112d0 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
112e0 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
112f0 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
11300 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
11310 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
11320 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
11330 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
11340 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
11350 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
11360 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
11370 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
11380 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
11390 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
113a0 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
113b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
113c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
113d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
113e0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
113f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11410 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11420 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
11430 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
11440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
11450 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
11460 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
11470 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
11480 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
11490 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
114a0 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
114b0 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
114c0 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
114d0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
114e0 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
114f0 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
11500 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
11510 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
11520 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
11530 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
11540 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
11550 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20  t *pParentAgg,  
11560 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11570 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
11580 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
11590 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115b0 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
115c0 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
115d0 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
115e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
115f0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
11600 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
11610 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20  isAgg = 0;      
11620 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
11630 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
11640 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
11650 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11660 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
11670 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
11680 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
11690 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
116a0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
116b0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
116c0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
116d0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
116e0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
116f0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
11700 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
11710 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
11720 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
11730 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
11740 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
11750 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
11760 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
11770 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
11780 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
11790 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
117a0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
117b0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
117c0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
117d0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
117e0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
117f0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
11800 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
11810 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
11820 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11830 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
11840 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
11850 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
11860 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
11870 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
11880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
11890 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
118a0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
118b0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
118c0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  p==0 ) return 1;
118d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
118e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
118f0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
11900 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
11910 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   1;..  /* If the
11920 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
11930 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
11940 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
11950 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
11960 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
11970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
11980 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
11990 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
119a0 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 0a 20  rm, aff);.  }.. 
119b0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
119c0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
119d0 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
119e0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
119f0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
11a00 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
11a10 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65  >pWhere;.  pOrde
11a20 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
11a30 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  y;.  pGroupBy = 
11a40 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
11a50 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
11a60 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  ing;.  isDistinc
11a70 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
11a80 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
11a90 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 66  e VDBE cursors f
11aa0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
11ab0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11ac0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
11ad0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
11ae0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
11af0 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  List);..  /* .  
11b00 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
11b10 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
11b20 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
11b30 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
11b40 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
11b50 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
11b60 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
11b70 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11b80 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
11b90 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45  ect_end;..  /* E
11ba0 78 70 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65  xpand any "*" te
11bb0 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  rms in the resul
11bc0 74 20 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61  t set.  (For exa
11bd0 6d 70 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a  mple the "*" in.
11be0 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46    ** "SELECT * F
11bf0 52 4f 4d 20 74 31 22 29 20 20 54 68 65 20 66 69  ROM t1")  The fi
11c00 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29  llInColumnlist()
11c10 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
11c20 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68  es some.  ** oth
11c30 65 72 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20  er housekeeping 
11c40 2d 20 73 65 65 20 74 68 65 20 68 65 61 64 65 72  - see the header
11c50 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74   comment for det
11c60 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ails..  */.  if(
11c70 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
11c80 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  t(pParse, p) ){.
11c90 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11ca0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72  end;.  }.  pWher
11cb0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
11cc0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
11cd0 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
11ce0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
11cf0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
11d00 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
11d10 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
11d20 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
11d30 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
11d40 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
11d50 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73    */.  if( (eDes
11d60 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
11d70 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26  est==SRT_Set) &&
11d80 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31   pEList->nExpr>1
11d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11da0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11db0 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
11dc0 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
11dd0 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
11de0 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
11df0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
11e00 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  on");.    goto s
11e10 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
11e20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
11e30 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
11e40 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
11e50 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65    */.  switch( e
11e60 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
11e70 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20   SRT_Union:.    
11e80 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
11e90 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
11ea0 73 63 61 72 64 3a 0a 20 20 20 20 63 61 73 65 20  scard:.    case 
11eb0 53 52 54 5f 53 65 74 3a 0a 20 20 20 20 20 20 70  SRT_Set:.      p
11ec0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
11ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
11ee0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
11ef0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ak;.  }..  /* At
11f00 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
11f10 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
11f20 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
11f30 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
11f40 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
11f50 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
11f60 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
11f70 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  .  .  **.  ** Re
11f80 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
11f90 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20   names and do a 
11fa0 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20  semantics check 
11fb0 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  on all the expre
11fc0 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ssions..  */.  f
11fd0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
11fe0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11ff0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12000 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
12010 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30  rse, pTabList, 0
12020 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
12030 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67  Expr) ){.      g
12040 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
12060 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
12070 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
12080 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69  [i].pExpr, 1, &i
12090 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  sAgg) ){.      g
120a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
120b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
120c0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66  pWhere ){.    if
120d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
120e0 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
120f0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
12100 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
12110 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12120 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
12130 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
12140 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  ck(pParse, pWher
12150 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
12160 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12170 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  d;.    }.  }.  i
12180 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
12190 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
121a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
121b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
121c0 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  e, "a GROUP BY c
121d0 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
121e0 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22  d before HAVING"
121f0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  );.      goto se
12200 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12210 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12220 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
12230 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
12240 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29  pEList, pHaving)
12250 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
12260 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
12270 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12280 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
12290 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69  , pHaving, 1, &i
122a0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  sAgg) ){.      g
122b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
122c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
122d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
122e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
122f0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12300 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
12310 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
12320 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12330 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
12340 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12350 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
12360 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20  l) && iCol>0 && 
12370 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
12380 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
12390 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
123a0 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
123b0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
123c0 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
123d0 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
123e0 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
123f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12400 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12410 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
12420 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
12430 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
12440 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12450 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
12460 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12470 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
12480 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
12490 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
124a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
124b0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
124c0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
124d0 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
124e0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
124f0 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
12500 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
12510 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12520 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
12530 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
12540 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
12550 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
12560 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
12570 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
12580 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12590 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
125a0 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
125b0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
125c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
125d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52               "OR
125f0 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  DER BY column nu
12600 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
12610 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
12620 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
12630 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
12640 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  d", iCol, pEList
12650 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
12660 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12670 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
12680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12690 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
126a0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
126b0 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
126c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
126d0 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45  nt iCol;.      E
126e0 78 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70  xpr *pE = pGroup
126f0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
12700 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12710 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
12720 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f  E, &iCol) && iCo
12730 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
12740 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
12750 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12760 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
12770 20 20 20 20 20 70 45 20 3d 20 70 47 72 6f 75 70       pE = pGroup
12780 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
12790 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
127a0 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
127b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
127c0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
127d0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
127e0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
127f0 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20  st, pEList, pE) 
12800 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12810 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12820 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
12830 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
12840 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
12850 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
12860 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12880 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12890 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
128a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
128b0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
128c0 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29  (pE, &iCol)==0 )
128d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
128e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
128f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
12900 22 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20  "GROUP BY terms 
12910 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d  must not be non-
12920 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
12930 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  s");.          g
12940 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12950 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12960 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
12970 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
12980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12990 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
129a0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
129b0 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f 6c 75    "GROUP BY colu
129c0 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74  mn number %d out
129d0 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
129e0 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
129f0 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
12a00 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70  and %d", iCol, p
12a10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
12a20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
12a30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12a40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12a50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  }.  }..  /* Begi
12a60 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
12a70 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
12a80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12a90 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
12aa0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
12ab0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
12ac0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
12ad0 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
12ae0 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
12af0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
12b00 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
12b10 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
12b20 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
12b30 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
12b40 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
12b50 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
12b60 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
12b70 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
12b80 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
12b90 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 23   pEList);.  }..#
12ba0 69 66 20 31 20 20 2f 2a 20 49 20 64 6f 20 6e 6f  if 1  /* I do no
12bb0 74 20 74 68 69 6e 6b 20 77 65 20 6e 65 65 64 20  t think we need 
12bc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
12bd0 64 65 20 61 6e 79 20 6d 6f 72 65 2e 2e 2e 2e 20  de any more.... 
12be0 2a 2f 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  */.  /* If the d
12bf0 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 53 52  estination is SR
12c00 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 6e 20 73 65  T_Union, then se
12c10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12c20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20  columns in.  ** 
12c30 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  the records that
12c40 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
12c50 64 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  d into the tempo
12c60 72 61 72 79 20 74 61 62 6c 65 2e 20 54 68 65 20  rary table. The 
12c70 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 63 6f 75 6c  caller.  ** coul
12c80 64 6e 27 74 20 64 6f 20 74 68 69 73 2c 20 69 6e  dn't do this, in
12c90 20 63 61 73 65 20 74 68 65 20 73 65 6c 65 63 74   case the select
12ca0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
12cb0 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 2a 2a 20   the form .  ** 
12cc0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e  "SELECT * FROM .
12cd0 2e 2e 2e 22 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ...". .  **.  **
12ce0 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74   We need to do t
12cf0 68 69 73 20 62 65 66 6f 72 65 20 77 65 20 73 74  his before we st
12d00 61 72 74 20 69 6e 73 65 72 74 69 6e 67 20 72 65  art inserting re
12d10 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 0a  cords into the .
12d20 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
12d30 61 62 6c 65 20 28 77 68 69 63 68 20 68 61 73 20  able (which has 
12d40 68 61 64 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  had OP_KeyAsData
12d50 20 65 78 65 63 75 74 65 64 20 6f 6e 20 69 74 29   executed on it)
12d60 2c 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 69  , because.  ** i
12d70 74 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  t is required by
12d80 20 74 68 65 20 6b 65 79 20 63 6f 6d 70 61 72 69   the key compari
12d90 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 53 6f  son function. So
12da0 20 64 6f 20 69 74 20 6e 6f 77 2c 20 65 76 65 6e   do it now, even
12db0 0a 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 69  .  ** though thi
12dc0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 4f 50 5f  s means that OP_
12dd0 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6d 61  SetNumColumns ma
12de0 79 20 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e  y be executed on
12df0 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 63   the same.  ** c
12e00 75 72 73 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20  ursor more than 
12e10 6f 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  once..  */.  if(
12e20 20 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f   eDest==SRT_Unio
12e30 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
12e40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12e50 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
12e60 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
12e70 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  xpr);.  }.#endif
12e80 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12e90 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
12ea0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
12eb0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
12ec0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
12ed0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
12ee0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
12ef0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
12f00 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e  ntext;.    int n
12f10 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
12f20 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62  t;..    if( pTab
12f30 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
12f40 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ct==0 ) continue
12f50 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ;.    if( pTabLi
12f60 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d  st->a[i].zName!=
12f70 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
12f80 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
12f90 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
12fa0 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
12fb0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
12fc0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
12fd0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65  .zName;.      ne
12fe0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
12ff0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
13000 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
13010 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  reContext = 0;. 
13020 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13030 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13040 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
13050 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54  elect, SRT_TempT
13060 61 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  able, .         
13070 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
13080 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20  ->a[i].iCursor, 
13090 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29  p, i, &isAgg, 0)
130a0 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65  ;.    if( needRe
130b0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a  storeContext ){.
130c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41        pParse->zA
130d0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
130e0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
130f0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
13100 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
13110 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
13120 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44  here;.    if( eD
13130 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26  est!=SRT_Union &
13140 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63  & eDest!=SRT_Exc
13150 65 70 74 20 26 26 20 65 44 65 73 74 21 3d 53 52  ept && eDest!=SR
13160 54 5f 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20  T_Discard ){.   
13170 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
13180 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
13190 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
131a0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
131b0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
131c0 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
131d0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
131e0 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tinct;.  }..  /*
131f0 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73   Check for the s
13200 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
13210 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
13220 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65  function by itse
13230 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  lf.  ** in the r
13240 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  esult set..  */.
13250 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d    if( simpleMinM
13260 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  axQuery(pParse, 
13270 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  p, eDest, iParm)
13280 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
13290 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
132a0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
132b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
132c0 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
132d0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
132e0 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
132f0 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
13300 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
13310 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
13320 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
13330 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
13340 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
13350 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
13360 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
13370 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
13380 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
13390 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
133a0 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
133b0 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
133c0 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
133d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
133e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
133f0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
13400 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e  ause, resolve an
13410 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
13420 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73  ences.  ** names
13430 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
13440 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
13450 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  fied..  */.  if(
13460 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
13470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
13480 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
13490 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ){.      if( pOr
134a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  derBy->a[i].zNam
134b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  e ){.        pOr
134c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
134d0 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20 20 20  r->pColl = .    
134e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
134f0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
13500 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
13510 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a  [i].zName, -1);.
13520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13530 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13540 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rr ){.      goto
13550 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13560 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
13570 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
13580 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
13590 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
135a0 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  e, p);..  /* If 
135b0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
135c0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
135d0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
135e0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
135f0 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
13600 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
13610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13620 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
13630 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
13640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13650 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
13660 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72  NumColumns, iPar
13670 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
13680 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20  );.  }..  /* Do 
13690 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61  an analysis of a
136a0 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
136b0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ions..  */.  sql
136c0 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
136d0 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20  Reset(pParse);. 
136e0 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47   if( isAgg || pG
136f0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73  roupBy ){.    as
13700 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
13710 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41  gg==0 );.    isA
13720 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  gg = 1;.    for(
13730 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
13740 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13750 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13760 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
13770 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  es(pParse, pELis
13780 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
13790 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
137a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
137b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
137c0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
137d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
137e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
137f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
13800 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
13810 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
13820 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
13830 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
13840 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
13850 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13860 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13870 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
13880 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
13890 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
138a0 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  s(pParse, pHavin
138b0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
138c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
138d0 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65   }.    if( pOrde
138e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  rBy ){.      for
138f0 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
13900 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13910 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
13920 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
13930 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
13940 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
13950 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
13960 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13970 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
13980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13990 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20  .  /* Reset the 
139a0 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a  aggregator.  */.
139b0 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
139c0 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
139d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
139e0 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30  , OP_AggReset, 0
139f0 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b  , pParse->nAgg);
13a00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13a10 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
13a20 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  +){.      FuncDe
13a30 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  f *pFunc;.      
13a40 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61  if( (pFunc = pPa
13a50 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
13a60 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d  nc)!=0 && pFunc-
13a70 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
13a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13a90 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
13aa0 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68  gInit, 0, i, (ch
13ab0 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55  ar*)pFunc, P3_FU
13ac0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NCDEF);.      }.
13ad0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
13ae0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
13af0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13b00 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
13b10 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
13b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b30 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
13b40 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
13b50 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  e{.      int sz 
13b60 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
13b70 29 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ) + pGroupBy->nE
13b80 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  xpr*sizeof(CollS
13b90 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79 49  eq*);.      KeyI
13ba0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
13bb0 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c  Info *)sqliteMal
13bc0 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 69  loc(sz);.      i
13bd0 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20  f( 0==pKey ){.  
13be0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
13bf0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
13c00 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20 3d       pKey->enc =
13c10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
13c20 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e 46  ;.      pKey->nF
13c30 69 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79 2d  ield = pGroupBy-
13c40 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66 6f  >nExpr;.      fo
13c50 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
13c60 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
13c70 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43          pKey->aC
13c80 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
13c90 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13ca0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
13cb0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
13cc0 20 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61 43     if( !pKey->aC
13cd0 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
13ce0 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
13cf0 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  i] = pParse->db-
13d00 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
13d10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13d30 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
13d40 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
13d50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
13d60 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  F);.    }.  }.. 
13d70 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
13d80 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
13d90 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
13da0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
13db0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13dc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13dd0 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
13de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13df0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
13e00 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
13e10 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
13e20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13e30 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
13e40 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
13e50 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
13e60 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e  ct ){.    distin
13e70 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
13e80 62 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e 54 65 6d  b++;.    openTem
13e90 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  pIndex(pParse, p
13ea0 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a  , distinct, 0);.
13eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
13ec0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
13ed0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
13ee0 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
13ef0 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  */.  pWInfo = sq
13f00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
13f10 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
13f20 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20  , pWhere, 0, .  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 20 20 20 20 20 20 20 70 47 72 6f 75 70            pGroup
13f50 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72  By ? 0 : &pOrder
13f60 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  By);.  if( pWInf
13f70 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
13f80 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
13f90 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
13fa0 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
13fb0 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
13fc0 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
13fd0 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
13fe0 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
13ff0 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
14000 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
14010 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
14020 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
14030 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
14040 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
14050 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
14060 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
14070 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20  ak, aff) ){.    
14080 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
14090 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
140a0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65   /* If we are de
140b0 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65  aling with aggre
140c0 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74  gates, then do t
140d0 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65  he special aggre
140e0 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73  gate.  ** proces
140f0 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65  sing.  .  */.  e
14100 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72  lse{.    AggExpr
14110 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66 28 20   *pAgg;.    if( 
14120 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
14130 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20    int lbl1;.    
14140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
14150 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
14160 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
14170 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14180 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
14190 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
141a0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61   }.      /* No a
141b0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
141c0 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
141d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d  e following OP_M
141e0 61 6b 65 4b 65 79 20 0a 20 20 20 20 20 20 2a 2a  akeKey .      **
141f0 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e   because we do n
14200 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e  ot need to do an
14210 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61  y coercion of da
14220 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20  tatypes. */.    
14230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14240 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
14250 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
14260 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c  r, 0);.      lbl
14270 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  1 = sqlite3VdbeM
14280 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
142a0 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63  dOp(v, OP_AggFoc
142b0 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20  us, 0, lbl1);.  
142c0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67      for(i=0, pAg
142d0 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20  g=pParse->aAgg; 
142e0 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
142f0 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20  i++, pAgg++){.  
14300 20 20 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e        if( pAgg->
14310 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
14320 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14330 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
14340 2c 20 70 41 67 67 2d 3e 70 45 78 70 72 29 3b 0a  , pAgg->pExpr);.
14350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14360 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
14370 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20  ggSet, 0, i);.  
14380 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14390 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
143a0 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
143b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
143c0 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41   pAgg=pParse->aA
143d0 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  gg; i<pParse->nA
143e0 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29  gg; i++, pAgg++)
143f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
14400 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
14410 72 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  r;.      FuncDef
14420 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 66   *pDef;.      if
14430 28 20 21 70 41 67 67 2d 3e 69 73 41 67 67 20 29  ( !pAgg->isAgg )
14440 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14450 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70   assert( pAgg->p
14460 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  Func!=0 );.     
14470 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70   assert( pAgg->p
14480 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29  Func->xStep!=0 )
14490 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 70  ;.      pDef = p
144a0 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Agg->pFunc;.    
144b0 20 20 70 45 20 3d 20 70 41 67 67 2d 3e 70 45 78    pE = pAgg->pEx
144c0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
144d0 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pE!=0 );.     
144e0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d   assert( pE->op=
144f0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
14500 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20   );.      nExpr 
14510 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14520 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
14530 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
14540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14550 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
14560 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
14570 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
14580 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
14590 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
145a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
145b0 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
145c0 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26 20  (j=0; !pColl && 
145d0 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
145e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
145f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
14600 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  Seq(pParse, pE->
14610 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  pList->a[j].pExp
14620 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
14630 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
14640 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
14650 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
14660 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14670 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
14680 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
14690 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
146a0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
146b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
146c0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  dbeOp3(v, OP_Agg
146d0 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c 20  Func, 0, nExpr, 
146e0 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
146f0 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a  POINTER);.    }.
14700 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68    }..  /* End th
14710 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
14720 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  loop..  */.  sql
14730 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
14740 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nfo);..  /* If w
14750 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67  e are processing
14760 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20   aggregates, we 
14770 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61  need to set up a
14780 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a   second loop.  *
14790 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  * over all of th
147a0 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75  e aggregate valu
147b0 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  es and process t
147c0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hem..  */.  if( 
147d0 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74  isAgg ){.    int
147e0 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65   endagg = sqlite
147f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14800 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  );.    int start
14810 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67  agg;.    startag
14820 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  g = sqlite3VdbeA
14830 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65  ddOp(v, OP_AggNe
14840 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a  xt, 0, endagg);.
14850 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
14860 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  gg = 1;.    if( 
14870 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
14880 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
14890 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
148a0 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31  ing, startagg, 1
148b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
148c0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
148d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
148e0 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
148f0 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
14900 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
14910 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20           iParm, 
14920 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67  startagg, endagg
14930 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
14940 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14950 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14960 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14970 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74  P_Goto, 0, start
14980 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
14990 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
149a0 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  l(v, endagg);.  
149b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
149c0 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
149d0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
149e0 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20  ->useAgg = 0;.  
149f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
14a00 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
14a10 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
14a20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
14a30 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
14a40 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
14a50 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
14a60 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
14a70 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
14a80 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
14a90 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
14aa0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
14ab0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
14ac0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
14ad0 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
14ae0 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
14af0 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
14b00 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
14b10 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14b20 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65  .  So delete the
14b30 20 73 75 62 71 75 65 72 79 20 73 74 72 75 63 74   subquery struct
14b40 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ure from the par
14b50 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ent.  ** to prev
14b60 65 6e 74 20 74 68 69 73 20 73 75 62 71 75 65 72  ent this subquer
14b70 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61  y from being eva
14b80 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64  luated again and
14b90 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20   to force the.  
14ba0 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 74 68  ** the use of th
14bb0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
14bc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
14bd0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  arent ){.    ass
14be0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
14bf0 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54  rc->nSrc>parentT
14c00 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ab );.    assert
14c10 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
14c20 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
14c30 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20  elect==p );.    
14c40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
14c50 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ete(p);.    pPar
14c60 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
14c70 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20  entTab].pSelect 
14c80 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
14c90 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
14ca0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
14cb0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
14cc0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
14cd0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
14ce0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
14cf0 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
14d00 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
14d10 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
14d20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
14d30 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
14d40 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
14d50 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
14d60 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
14d70 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67 67  end:.  sqliteAgg
14d80 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28  regateInfoReset(
14d90 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72  pParse);.  retur
14da0 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.