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

Artifact 164d1a68b3cc3c6a53ca9632a47ccbf9fde267b8:


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 38 39  select.c,v 1.189
0200: 20 32 30 30 34 2f 30 36 2f 31 32 20 30 39 3a 32   2004/06/12 09:2
0210: 35 3a 31 38 20 64 61 6e 69 65 6c 6b 31 39 37 37  5:18 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 7d 0a 20 20 7d 65 6c 73 65  e;.    }.  }else
5000: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 73 71  {.    switch( sq
5010: 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70 45  lite3ExprType(pE
5020: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 63 61  xpr) ){.      ca
5030: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
5040: 58 54 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  XT:     zType = 
5050: 22 54 45 58 54 22 3b 20 20 20 20 62 72 65 61 6b  "TEXT";    break
5060: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
5070: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
5080: 20 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d 45 52    zType = "NUMER
5090: 49 43 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  IC"; break;.    
50a0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
50c0: 65 20 3d 20 22 41 4e 59 22 3b 20 20 20 20 20 62  e = "ANY";     b
50d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
50e0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
50f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5100: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5110: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5120: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
5130: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
5140: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
5150: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
5160: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
5170: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
5180: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5190: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
51a0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
51b0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
51c0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
51d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
51e0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
51f0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5200: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5210: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5220: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5230: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5240: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
5250: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
5260: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
5270: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
5280: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
5290: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50   = columnType(pP
52a0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
52b0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  p);.    if( p==0
52c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
52d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
52e0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69  olName(v, i+pELi
52f0: 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65  st->nExpr, zType
5300: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
5310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
5320: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
5330: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
5340: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
5350: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
5360: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
5370: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
5380: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
5390: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
53a0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
53b0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
53c0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
53d0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
53e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
53f0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5400: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
5410: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
5420: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
5430: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5440: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
5450: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
5460: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
5470: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5480: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5490: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
54a0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
54b0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
54c0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
54d0: 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  es;..  /* If thi
54e0: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
54f0: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
5500: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
5510: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
5520: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
5530: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
5540: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
5550: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
5560: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
5570: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
5580: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
5590: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
55a0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
55b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
55c0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
55d0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
55e0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
55f0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
5600: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
5610: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
5620: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
5630: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
5640: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5650: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
5660: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
5670: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
5680: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
5690: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
56a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
56b0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
56c0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
56d0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
56e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
56f0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
5700: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
5710: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
5720: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
5730: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
5740: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
5750: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
5760: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
5770: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
5780: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
5790: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
57a0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
57b0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
57c0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
57d0: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
57e0: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
57f0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
5800: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
5810: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
5820: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
5830: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
5840: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
5850: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
5860: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
5870: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
5880: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
5890: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
58a0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
58b0: 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c  WID_";.      }el
58c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
58d0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
58e0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
58f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
5900: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
5910: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
5920: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
5930: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
5940: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5950: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
5960: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5970: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5980: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
5990: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
59a0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
59b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
59c0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
59d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
59e0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
59f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
5a00: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
5a10: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
5a20: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
5a30: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
5a40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
5a50: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
5a60: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
5a70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
5a80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
5a90: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
5aa0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
5ab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5ad0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
5ae0: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
5af0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
5b00: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
5b10: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
5b20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
5b30: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d  ColName(v, i, p-
5b40: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
5b50: 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71  .n);.      /* sq
5b60: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
5b70: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
5b80: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
5b90: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
5ba0: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
5bb0: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
5bc0: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
5bd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
5be0: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
5bf0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
5c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5c10: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
5c20: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
5c30: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
5c40: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
5c50: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
5c60: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  st);.}../*.** Na
5c70: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
5c80: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
5c90: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
5ca0: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
5cb0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
5cc0: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
5cd0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
5ce0: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
5cf0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
5d00: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
5d10: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
5d20: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
5d30: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
5d40: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
5d50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
5d60: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
5d70: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
5d80: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
5d90: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
5da0: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
5db0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
5dc0: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  z;.}../*.** Forw
5dd0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
5de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5df0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
5e00: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
5e10: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
5e20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5e30: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
5e40: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
5e50: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
5e60: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5e70: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
5e80: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
5e90: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
5ea0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5eb0: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
5ec0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5ed0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
5ee0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
5ef0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
5f00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b  .  Column *aCol;
5f10: 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  ..  if( fillInCo
5f20: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
5f30: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
5f40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5f50: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61   pTab = sqliteMa
5f60: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
5f70: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
5f80: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
5f90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
5fa0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
5fb0: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
5fc0: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
5fd0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
5fe0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
5ff0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
6000: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
6010: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
6020: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
6030: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
6040: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
6050: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
6060: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
6070: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
6080: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6090: 45 78 70 72 20 2a 70 52 3b 0a 20 20 20 20 63 68  Expr *pR;.    ch
60a0: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 45  ar *zType;.    E
60b0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
60c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
60d0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
60e0: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
60f0: 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d   aCol[i].zName =
6100: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 45   sqliteStrDup(pE
6110: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6120: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6130: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
6150: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
6160: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
6170: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
6180: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  z[0] ){.      in
6190: 74 20 63 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c  t cnt;.      sql
61a0: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26  ite3SetNString(&
61b0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[i].zName, p
61c0: 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e  R->token.z, pR->
61d0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
61e0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
61f0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
6200: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6210: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
6220: 61 6d 65 2c 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ame, aCol[i].zNa
6230: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
6240: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
6250: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33       char zBuf[3
6260: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70  0];.          sp
6270: 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22  rintf(zBuf,"_%d"
6280: 2c 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  ,++cnt);.       
6290: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 42     n = strlen(zB
62a0: 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  uf);.          s
62b0: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
62c0: 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  (&aCol[i].zName,
62d0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52   pR->token.z, pR
62e0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 7a 42 75 66 2c  ->token.n, zBuf,
62f0: 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n,0);.          
6300: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
6310: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
6320: 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  lse if( p->span.
6330: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
6340: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
6350: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54  e3SetNString(&pT
6360: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
6370: 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  e, p->span.z, p-
6380: 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  >span.n, 0);.   
6390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
63a0: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
63b0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
63c0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
63d0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
63e0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  Col[i].zName = s
63f0: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42 75 66  qliteStrDup(zBuf
6400: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 54  );.    }..    zT
6410: 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ype = sqliteStrD
6420: 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50  up(columnType(pP
6430: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
6440: 53 72 63 20 2c 70 29 29 3b 0a 20 20 20 20 70 54  Src ,p));.    pT
6450: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
6460: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
6470: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66  Tab->aCol[i].aff
6480: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
6490: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
64a0: 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20 20 20  if( zType ){.   
64b0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
64c0: 2e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  .affinity = sqli
64d0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
64e0: 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54  zType, strlen(zT
64f0: 79 70 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ype));.    }.   
6500: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70   pTab->aCol[i].p
6510: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
6520: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
6530: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , p);.    if( !p
6540: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f  Tab->aCol[i].pCo
6550: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ll ){.      pTab
6560: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
6570: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
6580: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  fltColl;.    }. 
6590: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
65a0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
65b0: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pTab;.}../*.** F
65c0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
65d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 64  ECT statement, d
65e0: 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e 0a  o three things..
65f0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69  **.**    (1)  Fi
6600: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
6610: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
6620: 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
6630: 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
6640: 20 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20      defines the 
6650: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
6660: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61  at should be sca
6670: 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69 65 77 73  nned.  For views
6680: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
6690: 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
66a0: 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
66b0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
66c0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
66d0: 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
66e0: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
66f0: 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
6700: 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
6710: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
6720: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
6730: 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
6740: 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
6750: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
6760: 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
6770: 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
6780: 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
6790: 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
67a0: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
67b0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
67c0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  ew..**.**    (2)
67d0: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
67e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
67f0: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
6800: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
6810: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
6820: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
6830: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
6840: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
6850: 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74  *    (3)  Scan t
6860: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
6870: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
6880: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
6890: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
68a0: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
68b0: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
68c0: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
68d0: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
68e0: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
68f0: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
6900: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
6910: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
6920: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
6930: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
6940: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
6950: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
6960: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
6970: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
6980: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
6990: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
69a0: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
69b0: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
69c0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
69d0: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
69e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
69f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
6a00: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
6a10: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
6a20: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
6a30: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
6a40: 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70   *pTab;..  if( p
6a50: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
6a60: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6a70: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
6a80: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
6a90: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
6aa0: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
6ab0: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
6ac0: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
6ad0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
6ae0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
6af0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6b00: 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20  >a[i].pTab ){.  
6b10: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
6b20: 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
6b30: 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  re!  No need to 
6b40: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20  continue */.    
6b50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6b60: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
6b70: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
6b80: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
6b90: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
6ba0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
6bb0: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
6bc0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
6bd0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6be0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
6bf0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6c00: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
6c10: 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e       char zFakeN
6c20: 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20  ame[60];.       
6c30: 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61   sprintf(zFakeNa
6c40: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  me, "sqlite_subq
6c50: 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20  uery_%p_",.     
6c60: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61        (void*)pTa
6c70: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6c80: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ect);.        sq
6c90: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
6ca0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6cb0: 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65  Alias, zFakeName
6cc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6cd0: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
6ce0: 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  i].pTab = pTab =
6cf0: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
6d00: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
6d10: 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
6d20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
6d30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
6d60: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6d70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
6d80: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
6d90: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6da0: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
6db0: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
6dc0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
6dd0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
6de0: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
6df0: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
6e00: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
6e10: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
6e20: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
6e30: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
6e40: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
6e50: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
6e60: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
6e70: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
6e80: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
6e90: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
6ea0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
6eb0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
6ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6ed0: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
6ee0: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
6ef0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
6f00: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
6f10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6f20: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
6f30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
6f40: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
6f50: 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ,pTabList->a[i].
6f60: 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e  zName,pTabList->
6f70: 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[i].zDatabase);
6f80: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6f90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
6fa0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6fb0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
6fc0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6fd0: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
6fe0: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
6ff0: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
7000: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
7010: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7020: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
7030: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
7040: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
7050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
7060: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
7070: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7080: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
7090: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
70a0: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
70b0: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
70c0: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
70d0: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
70e0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
70f0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
7100: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
7110: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
7120: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
7130: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
7140: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
7150: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
7160: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
7170: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
7180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7190: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
71a0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
71b0: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
71c0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
71d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
71e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
71f0: 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
7200: 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
7210: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
7220: 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
7230: 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65   if( sqliteProce
7240: 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
7250: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
7260: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
7270: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
7280: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
7290: 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
72a0: 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
72b0: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
72c0: 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
72d0: 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
72e0: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
72f0: 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
7300: 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
7310: 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
7320: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
7330: 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
7340: 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
7350: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
7360: 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
7370: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
7380: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
7390: 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
73a0: 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
73b0: 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
73c0: 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
73d0: 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
73e0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
73f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7400: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
7410: 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
7420: 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
7430: 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
7440: 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
7450: 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
7460: 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
7470: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
7480: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
7490: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
74a0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
74b0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
74c0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
74d0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
74e0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
74f0: 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70   pE->pRight && p
7500: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
7510: 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26  K_ALL.         &
7520: 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70  & pE->pLeft && p
7530: 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
7540: 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _ID ) break;.  }
7550: 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  .  rc = 0;.  if(
7560: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
7570: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
7580: 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
7590: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
75a0: 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
75b0: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
75c0: 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
75d0: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
75e0: 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
75f0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
7600: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
7610: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
7620: 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
7630: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
7640: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
7650: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7660: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
7670: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
7680: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
7690: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
76a0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
76b0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
76c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
76d0: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
76e0: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
76f0: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
7700: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
7710: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
7720: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
7730: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
7740: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
7750: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
7760: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
7770: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
7780: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
7790: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
77a0: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
77b0: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
77c0: 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
77d0: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
77e0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
77f0: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
7800: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
7810: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
7820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7830: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
7840: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
7850: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
7860: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
7870: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
7880: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7890: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
78a0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
78b0: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
78c0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f  es */.        To
78d0: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20  ken *pName;     
78e0: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
78f0: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
7900: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
7910: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
7920: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
7930: 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 26         pName = &
7940: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
7950: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7960: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65  .          pName
7970: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7980: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7990: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
79a0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
79b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
79c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
79d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
79e0: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
79f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
7a00: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
7a10: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
7a20: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
7a30: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
7a40: 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
7a50: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
7a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7a70: 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 28    if( pName && (
7a80: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
7a90: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  TabName[0]==0 ||
7aa0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7ab0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43     sqlite3StrNIC
7ac0: 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61  mp(pName->z, zTa
7ad0: 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29  bName, pName->n)
7ae0: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
7af0: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
7b00: 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29  [pName->n]!=0) )
7b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7b20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7b30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
7b40: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
7b50: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7b60: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
7b70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7b80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
7b90: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
7ba0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7bb0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
7bc0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
7bd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7be0: 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  0 && (pTabList->
7bf0: 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  a[i-1].jointype 
7c00: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
7c10: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
7c20: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
7c30: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
7c40: 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  .pTab, zName)>=0
7c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7c60: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
7c70: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
7c80: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
7c90: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
7ca0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
7cb0: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7cd0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7ce0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7cf0: 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69   if( i>0 && sqli
7d00: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
7d10: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7d20: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
7d30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7d40: 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
7d50: 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
7d60: 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
7d70: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
7d80: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
7d90: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
7da0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
7db0: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
7dc0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7de0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
7df0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
7e00: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
7e10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7e20: 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
7e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
7e40: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  ight->token.z = 
7e50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
7e60: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
7e70: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  .n = strlen(zNam
7e80: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
7e90: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79  pRight->token.dy
7ea0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
7eb0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
7ec0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
7ed0: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
7ee0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
7ef0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
7f00: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
7f10: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
7f20: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
7f30: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
7f40: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
7f50: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
7f60: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
7f70: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
7f80: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61  token.z = zTabNa
7f90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7fa0: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e    pLeft->token.n
7fb0: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61   = strlen(zTabNa
7fc0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
7fd0: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
7fe0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
8000: 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a 29  tString((char**)
8010: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  &pExpr->span.z, 
8020: 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a  zTabName, ".", z
8030: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
8040: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
8050: 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  pan.n = strlen(p
8060: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  Expr->span.z);. 
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8080: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
8090: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
80a0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
80b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
80c0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
80d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
80e0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
80f0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
8100: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8110: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8120: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
8130: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8140: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
8150: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
8160: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
8170: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
8180: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
8190: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
81a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
81b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
81c0: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
81d0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
81e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
81f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8200: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
8210: 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61   table: %T", pNa
8220: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
8230: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8240: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8250: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
8260: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
8270: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8280: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
8290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
82a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
82b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
82c0: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
82d0: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
82e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
82f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8300: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
8310: 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  ely unlinks the 
8320: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
8330: 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  pTab pointers.**
8340: 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72   in a select str
8350: 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74  ucture.  It just
8360: 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65   sets the pointe
8370: 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  rs to NULL.  Thi
8380: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
8390: 72 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65  recursive in the
83a0: 20 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74   sense that if t
83b0: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
83c0: 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f  [].pSelect.** po
83d0: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
83e0: 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  L, this routine 
83f0: 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
8400: 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f  ively on that po
8410: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
8420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8430: 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63  led on the Selec
8440: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
8450: 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49   defines a.** VI
8460: 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75  EW in order to u
8470: 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73  ndo any bindings
8480: 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69   to tables.  Thi
8490: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a  s is necessary.*
84a0: 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  * because those 
84b0: 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20  tables might be 
84c0: 44 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73  DROPed by a subs
84d0: 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61  equent SQL comma
84e0: 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69  nd..** If the bi
84f0: 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72  ndings are not r
8500: 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65  emoved, then the
8510: 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b   Select.pSrc->a[
8520: 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20  ].pTab field.** 
8530: 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
8540: 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c  nting to a deall
8550: 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72  ocated Table str
8560: 75 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65  ucture after the
8570: 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63  .** DROP and a c
8580: 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63  oredump will occ
8590: 75 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ur the next time
85a0: 20 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65   the VIEW is use
85b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
85c0: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53  e3SelectUnbind(S
85d0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
85e0: 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
85f0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
8600: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8610: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8620: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8630: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
8640: 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20  {.    if( (pTab 
8650: 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  = pSrc->a[i].pTa
8660: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  b)!=0 ){.      i
8670: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
8680: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ient ){.        
8690: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
86a0: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
86b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d     }.      pSrc-
86c0: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a  >a[i].pTab = 0;.
86d0: 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e        if( pSrc->
86e0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a  a[i].pSelect ){.
86f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
8700: 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 72 63  electUnbind(pSrc
8710: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
8720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8730: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
8740: 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61   routine associa
8750: 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61  tes entries in a
8760: 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  n ORDER BY expre
8770: 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a  ssion list with.
8780: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20  ** columns in a 
8790: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63  result.  For eac
87a0: 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  h ORDER BY expre
87b0: 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64  ssion, the opcod
87c0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
87d0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68  level node is ch
87e0: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
87f0: 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75  MN and the iColu
8800: 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  mn value of.** t
8810: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
8820: 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  e is filled in w
8830: 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ith column numbe
8840: 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65  r and the iTable
8850: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
8860: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8870: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  is filled with i
8880: 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e  Table parameter.
8890: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
88a0: 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54  are prior SELECT
88b0: 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61   clauses, they a
88c0: 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72  re processed fir
88d0: 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20  st.  A match.** 
88e0: 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45  in an earlier SE
88f0: 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65  LECT takes prece
8900: 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74  dence over a lat
8910: 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a  er SELECT..**.**
8920: 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20   Any entry that 
8930: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69  does not match i
8940: 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20  s flagged as an 
8950: 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62  error.  The numb
8960: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20  er.** of errors 
8970: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8980: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
8990: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
89a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
89b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
89c0: 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65  place to leave e
89d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
89e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
89f0: 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ct,        /* Ma
8a00: 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f  tch to result co
8a10: 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45  lumns of this SE
8a20: 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LECT */.  ExprLi
8a30: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8a40: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
8a50: 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63  Y values to matc
8a60: 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  h against column
8a70: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
8a80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
8a90: 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61  * Insert this va
8aa0: 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f  lue in iTable */
8ab0: 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c  .  int mustCompl
8ac0: 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ete        /* If
8ad0: 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20   TRUE all ORDER 
8ae0: 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a  BYs must match *
8af0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  /.){.  int nErr 
8b00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
8b10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8b20: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c  ist;..  if( pSel
8b30: 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72  ect==0 || pOrder
8b40: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  By==0 ) return 1
8b50: 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70  ;.  if( mustComp
8b60: 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  lete ){.    for(
8b70: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
8b80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f  >nExpr; i++){ pO
8b90: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8ba0: 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69  e = 0; }.  }.  i
8bb0: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
8bc0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
8bd0: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
8be0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
8bf0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
8c00: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68  ){.    if( match
8c10: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
8c20: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
8c30: 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42  >pPrior, pOrderB
8c40: 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  y, iTable, 0) ){
8c50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
8c70: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
8c80: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
8c90: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8ca0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8cb0: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
8cc0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8cd0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
8ce0: 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  1;.    if( pOrde
8cf0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
8d00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8d10: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
8d20: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
8d30: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
8d40: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
8d50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
8d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8d80: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
8d90: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
8da0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
8db0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
8dc0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
8dd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8de0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
8df0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8e10: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
8e20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
8e30: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
8e40: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
8e50: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
8e60: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
8e70: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
8e80: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
8e90: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
8ea0: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
8eb0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8ec0: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
8ed0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8ee0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
8ef0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
8f00: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
8f10: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
8f20: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
8f30: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
8f40: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
8f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
8f60: 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  uote(zLabel);.  
8f70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8f80: 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
8f90: 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20  zLabel)==0 ){ . 
8fa0: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
8fb0: 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
8fc0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
8fd0: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
8fe0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8ff0: 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
9000: 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69  Compare(pE, pELi
9010: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20  st->a[j].pExpr) 
9020: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20  ){.        iCol 
9030: 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = j;.      }.   
9040: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
9050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e  =0 ){.      pE->
9060: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
9070: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
9080: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
9090: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
90a0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  ble;.      pOrde
90b0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
90c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
90d0: 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74  ( iCol<0 && must
90e0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
90f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9100: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9110: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
9120: 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20   number %d does 
9130: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
9140: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b  sult column", i+
9150: 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  1);.      nErr++
9160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9170: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9180: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
9190: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
91a0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
91b0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
91c0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
91d0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
91e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
91f0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
9200: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
9210: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
9220: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
9230: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
9240: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
9250: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9260: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
9270: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
9280: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
9290: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
92a0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
92b0: 72 6e 20 76 3b 0a 7d 0a 0a 23 69 66 20 30 20 20  rn v;.}..#if 0  
92c0: 2f 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /***** This rout
92d0: 69 6e 65 20 6e 65 65 64 73 20 64 65 6c 65 74 69  ine needs deleti
92e0: 6e 67 20 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63  ng *****/.static
92f0: 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63   void multiSelec
9300: 74 41 66 66 69 6e 69 74 79 28 53 65 6c 65 63 74  tAffinity(Select
9310: 20 2a 70 2c 20 63 68 61 72 20 2a 7a 41 66 66 29   *p, char *zAff)
9320: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  {.  int i;..  if
9330: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
9340: 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66 66 69   multiSelectAffi
9350: 6e 69 74 79 28 70 2d 3e 70 50 72 69 6f 72 2c 20  nity(p->pPrior, 
9360: 7a 41 66 66 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  zAff);..  for(i=
9370: 30 3b 20 69 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  0; i<p->pEList->
9380: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
9390: 20 69 66 28 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c   if( zAff[i]=='\
93a0: 30 27 20 29 7b 0a 20 20 20 20 20 20 7a 41 66 66  0' ){.      zAff
93b0: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [i] = sqlite3Exp
93c0: 72 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  rAffinity(p->pEL
93d0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
93e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
93f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ndif../*.** Comp
9400: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
9410: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
9420: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
9430: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
9440: 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73  nLimit and nOffs
9450: 65 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d  et fields.  nLim
9460: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68  it and nOffset h
9470: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 73  old the integers
9480: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
9490: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
94a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
94b0: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
94c0: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
94d0: 6f 72 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68  ords.  Or that h
94e0: 6f 6c 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20  old -1 and 0 if 
94f0: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
9500: 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69  re omitted..** i
9510: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
9520: 74 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  t are the intege
9530: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
9540: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a  r numbers for.**
9550: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
9560: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  o compute the li
9570: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
9580: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   If there is no.
9590: 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  ** limit and/or 
95a0: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69  offset, then iLi
95b0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
95c0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
95d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
95e0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
95f0: 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e  ues if iLimit an
9600: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
9610: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
9620: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
9630: 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20  d by nLimit and 
9640: 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  nOffset.  iLimit
9650: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
9660: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
9670: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
9680: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
9690: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
96a0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
96b0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
96c0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
96d0: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e  ne..** Only if n
96e0: 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66  Limit>=0 or nOff
96f0: 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d  set>0 do the lim
9700: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
9710: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
9720: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
9730: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
9740: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
9750: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
9760: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
9770: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
9780: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
9790: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
97a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
97b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
97c0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
97d0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
97e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f   Select *p){.  /
97f0: 2a 20 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  * .  ** If the c
9800: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e  omparison is p->
9810: 6e 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c  nLimit>0 then "L
9820: 49 4d 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20  IMIT 0" shows.  
9830: 2a 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74  ** all rows.  It
9840: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
9850: 6e 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65  no limit. If the
9860: 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a   comparision is.
9870: 20 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d    ** p->nLimit>=
9880: 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22  0 then "LIMIT 0"
9890: 20 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74   show no rows at
98a0: 20 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49   all..  ** "LIMI
98b0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
98c0: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
98d0: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
98e0: 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f   contraversy abo
98f0: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
9900: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
9910: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
9920: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
9930: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
9940: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
9950: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
9960: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
9970: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >nLimit>=0 ){.  
9980: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
9990: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
99a0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
99b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
99c0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
99d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
99e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
99f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70  , OP_Integer, -p
9a00: 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->nLimit, 0);.  
9a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9a20: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
9a30: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
9a40: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65   p->iLimit = iMe
9a50: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  m;.  }.  if( p->
9a60: 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  nOffset>0 ){.   
9a70: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
9a80: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9a90: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9aa0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9ab0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
9ac0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
9ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9ae0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d   OP_Integer, -p-
9af0: 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  >nOffset, 0);.  
9b00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b10: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
9b20: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
9b30: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d   p->iOffset = iM
9b40: 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  em;.  }.}../*.**
9b50: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 69   Generate VDBE i
9b60: 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
9b70: 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61   will open a tra
9b80: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61  nsient table tha
9b90: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65  t.** will be use
9ba0: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  d for an index o
9bb0: 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65 64  r to store keyed
9bc0: 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 63   results for a c
9bd0: 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63  ompound.** selec
9be0: 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
9bf0: 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73  ds, open a trans
9c00: 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20  ient table that 
9c10: 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e  needs a.** KeyIn
9c20: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
9c30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9c40: 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79 49  umns in the KeyI
9c50: 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nfo is determine
9c60: 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73 75  d.** by the resu
9c70: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
9c80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
9c90: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  n the second arg
9ca0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65  ument..**.** Spe
9cb0: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
9cc0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9cd0: 64 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64  d to open an ind
9ce0: 65 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20  ex table for.** 
9cf0: 44 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c  DISTINCT, UNION,
9d00: 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45   INTERSECT and E
9d10: 58 43 45 50 54 20 73 65 6c 65 63 74 20 73 74 61  XCEPT select sta
9d20: 74 65 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f 74  tements (but not
9d30: 20 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   .** UNION ALL).
9d40: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20  .**.** Make the 
9d50: 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65 79 41  new table a KeyA
9d60: 73 44 61 74 61 20 74 61 62 6c 65 20 69 66 20 6b  sData table if k
9d70: 65 79 41 73 44 61 74 61 20 69 73 20 74 72 75 65  eyAsData is true
9d80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
9d90: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
9da0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
9db0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73   OP_OpenTemp ins
9dc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  truction..*/.sta
9dd0: 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70  tic int openTemp
9de0: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
9df0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
9e00: 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b 65  int iTab, int ke
9e10: 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79 49  yAsData){.  KeyI
9e20: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
9e30: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20   int nColumn;.  
9e40: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
9e50: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
9e60: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
9e70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
9e80: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20  nt addr;..  if( 
9e90: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
9ea0: 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
9eb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9ec0: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  .  nColumn = p->
9ed0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
9ee0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
9ef0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
9f00: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
9f10: 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  umn*sizeof(CollS
9f20: 65 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b  eq*) );.  if( pK
9f30: 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  eyInfo==0 ) retu
9f40: 72 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  rn 0;.  pKeyInfo
9f50: 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  ->enc = pParse->
9f60: 64 62 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65 79 49  db->enc;.  pKeyI
9f70: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43  nfo->nField = nC
9f80: 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  olumn;.  for(i=0
9f90: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
9fa0: 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  ){.    pKeyInfo-
9fb0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
9fc0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9fd0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
9fe0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
9ff0: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
a000: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
a010: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
a020: 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66  oll[i] = db->pDf
a030: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
a040: 7d 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  }.  addr = sqlit
a050: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a060: 4f 70 65 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20  OpenTemp, iTab, 
a070: 30 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  0, .      (char*
a080: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
a090: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
a0a0: 20 20 69 66 28 20 6b 65 79 41 73 44 61 74 61 20    if( keyAsData 
a0b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a0c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
a0d0: 79 41 73 44 61 74 61 2c 20 69 54 61 62 2c 20 31  yAsData, iTab, 1
a0e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a0f0: 61 64 64 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  addr;.}..static 
a100: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
a110: 70 65 6e 54 65 6d 70 41 64 64 72 28 53 65 6c 65  penTempAddr(Sele
a120: 63 74 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  ct *p, int addr,
a130: 20 49 64 4c 69 73 74 20 2a 2a 70 70 4f 70 65 6e   IdList **ppOpen
a140: 54 65 6d 70 29 7b 0a 20 20 69 66 28 20 21 70 2d  Temp){.  if( !p-
a150: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20  >ppOpenTemp ){. 
a160: 20 20 20 2a 70 70 4f 70 65 6e 54 65 6d 70 20 3d     *ppOpenTemp =
a170: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
a180: 70 65 6e 64 28 30 2c 20 30 29 3b 0a 20 20 20 20  pend(0, 0);.    
a190: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  p->ppOpenTemp = 
a1a0: 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 65  ppOpenTemp;.  }e
a1b0: 6c 73 65 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 4f  lse{.    *p->ppO
a1c0: 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74 65  penTemp = sqlite
a1d0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a 70  3IdListAppend(*p
a1e0: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29  ->ppOpenTemp, 0)
a1f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 28 2a 70  ;.  }.  if( !(*p
a200: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29 20 29 7b  ->ppOpenTemp) ){
a210: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a220: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
a230: 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29  (*p->ppOpenTemp)
a240: 2d 3e 61 5b 28 2a 70 2d 3e 70 70 4f 70 65 6e 54  ->a[(*p->ppOpenT
a250: 65 6d 70 29 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78  emp)->nId-1].idx
a260: 20 3d 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72   = addr;.  retur
a270: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a280: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
a290: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
a2a0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
a2b0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
a2c0: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
a2d0: 71 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  q *pRet = 0;.  i
a2e0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
a2f0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
a300: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
a310: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
a320: 20 69 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 69 66   iCol);.  }.  if
a330: 28 20 21 70 52 65 74 20 29 7b 0a 20 20 20 20 70  ( !pRet ){.    p
a340: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
a350: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
a360: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
a370: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
a380: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
a390: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a3a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a3b0: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
a3c0: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
a3d0: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
a3e0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
a3f0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
a400: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
a410: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
a420: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
a430: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
a440: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
a450: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
a460: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
a470: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
a480: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
a490: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
a4a0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
a4b0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a4c0: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
a4d0: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
a4e0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
a4f0: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
a500: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
a510: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
a520: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
a530: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
a540: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
a550: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
a560: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
a570: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
a580: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
a590: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
a5a0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
a5b0: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
a5c0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
a5d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
a5e0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
a5f0: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
a600: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
a610: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
a620: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
a630: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
a640: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
a650: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
a660: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
a670: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
a680: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
a690: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
a6a0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
a6b0: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
a6c0: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
a6d0: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
a6e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a6f0: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
a700: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
a710: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
a720: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
a730: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
a740: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
a750: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
a760: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
a770: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
a780: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
a790: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
a7a0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
a7b0: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
a7c0: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
a7d0: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
a7e0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
a7f0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
a800: 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74  Parse, .  Select
a810: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 65 44 65 73   *p, .  int eDes
a820: 74 2c 20 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c  t, .  int iParm,
a830: 20 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20   .  char *aff   
a840: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
a850: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
a860: 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
a870: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
a880: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a890: 3b 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f  ;  /* Success co
a8a0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
a8b0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
a8c0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a   *pPrior;     /*
a8d0: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
a8e0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
a8f0: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
a900: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
a910: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
a920: 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
a930: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70 65  /.  IdList *pOpe
a940: 6e 54 65 6d 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nTemp = 0;..  /*
a950: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
a960: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
a970: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
a980: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
a990: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
a9a0: 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20   last SELECT in 
a9b0: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
a9c0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
a9d0: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
a9e0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
a9f0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
aa00: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
aa10: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
aa20: 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  nd;.  }.  pPrior
aa30: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
aa40: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
aa50: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
aa60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
aa70: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
aa80: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
aa90: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
aaa0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
aab0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
aac0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
aad0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
aae0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
aaf0: 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69  f( pPrior->nLimi
ab00: 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e  t>=0 || pPrior->
ab10: 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  nOffset>0 ){.   
ab20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ab30: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
ab40: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
ab50: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
ab60: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
ab70: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
ab80: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
ab90: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
aba0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
abb0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
abc0: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
abd0: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
abe0: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
abf0: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
ac00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ac10: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ac20: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
ac30: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
ac40: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ac50: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
ac60: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
ac70: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ac80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
ac90: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
aca0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
acb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
acc0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
acd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ace0: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
acf0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
ad00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ad10: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
ad20: 6e 73 2c 20 69 50 61 72 6d 2c 20 70 2d 3e 70 45  ns, iParm, p->pE
ad30: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
ad40: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
ad50: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
ad60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
ad70: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
ad80: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
ad90: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
ada0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
adb0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
adc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
add0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
ade0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c        pPrior->nL
adf0: 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74  imit = p->nLimit
ae00: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
ae10: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e  ->nOffset = p->n
ae20: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
ae30: 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65  pPrior->ppOpenTe
ae40: 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65  mp = p->ppOpenTe
ae50: 6d 70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mp;.        rc =
ae60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ae70: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65  Parse, pPrior, e
ae80: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
ae90: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
aea0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
aeb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
aec0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
aed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aee0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
aef0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
af00: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
af10: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
af20: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
af30: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
af40: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31    p->nLimit = -1
af50: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66  ;.        p->nOf
af60: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
af70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
af80: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
af90: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
afa0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
afb0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
afc0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
afd0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
afe0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
aff0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b000: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
b010: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b020: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20     /* For UNION 
b030: 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ALL ... ORDER BY
b040: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
b050: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
b060: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
b070: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
b080: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
b090: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
b0a0: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
b0b0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
b0c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b0d0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
b0e0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20  /.      int op; 
b0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
b100: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
b110: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
b120: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
b130: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
b140: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
b150: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
b160: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
b170: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
b180: 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20  Limit, nOffset; 
b190: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
b1a0: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
b1b0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
b1c0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
b1d0: 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65  OrderBy;  /* The
b1e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b1f0: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 53   for the right S
b200: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 69  ELECT */.      i
b210: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
b220: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
b230: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
b240: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
b250: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
b260: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e  ==priorOp && p->
b270: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70  pOrderBy==0 && p
b280: 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d  ->nLimit<0 && p-
b290: 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  >nOffset==0 ){. 
b2a0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
b2b0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
b2c0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
b2d0: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
b2e0: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
b2f0: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
b300: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
b310: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
b320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b330: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
b340: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
b350: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
b360: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
b370: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
b380: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
b390: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b3a0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
b3b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b3c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
b3d0: 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20  rderBy .        
b3e0: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
b3f0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
b400: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
b410: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a  unionTab, 1) ){.
b420: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
b430: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
b440: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b450: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
b460: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
b470: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b480: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69  OP_OpenTemp, uni
b490: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
b4a0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b     if( p->op!=TK
b4b0: 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _ALL ){.        
b4c0: 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
b4d0: 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70  ctOpenTempAddr(p
b4e0: 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54 65  , addr, &pOpenTe
b4f0: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
b500: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b520: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
b530: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  t_end;.         
b540: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
b550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b560: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75   OP_KeyAsData, u
b570: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
b580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
b590: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
b5a0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
b5b0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
b5c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b5d0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
b5e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 72 69     */.      pPri
b5f0: 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d  or->ppOpenTemp =
b600: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a   p->ppOpenTemp;.
b610: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b620: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
b630: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
b640: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
b650: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
b660: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
b670: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b680: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
b690: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  }.      if( p->o
b6a0: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
b6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
b6d0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e  umColumns, union
b6e0: 54 61 62 2c 20 70 50 72 69 6f 72 2d 3e 70 45 4c  Tab, pPrior->pEL
b6f0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
b700: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
b710: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
b720: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b730: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b740: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
b750: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
b760: 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20  K_EXCEPT:  op = 
b770: 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72  SRT_Except;   br
b780: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
b790: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f  se TK_UNION:   o
b7a0: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20  p = SRT_Union;  
b7b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b7c0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
b7d0: 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c     op = SRT_Tabl
b7e0: 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  e;    break;.   
b7f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
b800: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
b810: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
b820: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d  rderBy;.      p-
b830: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
b840: 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d       nLimit = p-
b850: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >nLimit;.      p
b860: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
b870: 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70       nOffset = p
b880: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->nOffset;.     
b890: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
b8a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b8b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
b8c0: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
b8d0: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
b8e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
b8f0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
b900: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
b910: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
b920: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  p->nLimit = nLim
b930: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  it;.      p->nOf
b940: 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a  fset = nOffset;.
b950: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
b960: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
b970: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b980: 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
b990: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
b9a0: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
b9b0: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
b9c0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
b9d0: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
b9e0: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
b9f0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
ba00: 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65    .      if( eDe
ba10: 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
ba20: 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29  nionTab!=iParm )
ba30: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
ba40: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
ba50: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
ba60: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
ba70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44  ;.        if( eD
ba80: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
ba90: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  k ){.          g
baa0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
bab0: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d  es(pParse, 0, p-
bac0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
bad0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
bae0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
baf0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
bb00: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
bb10: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
bb20: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
bb30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bb40: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
bb50: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
bb60: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
bb70: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
bb80: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
bb90: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
bba0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
bbb0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  dr(v);.        r
bbc0: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
bbd0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
bbe0: 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
bbf0: 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
bc00: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
bc30: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
bc40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
bc70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
bc80: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
bc90: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
bca0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
bcb0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
bcc0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
bcd0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
bce0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
bcf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
bd10: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
bd20: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
bd30: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bd40: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
bd50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bd60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bd70: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
bd80: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
bd90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bda0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
bdb0: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
bdc0: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
bdd0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
bde0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
bdf0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
be00: 2c 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  , nOffset;.     
be10: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
be20: 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
be30: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
be40: 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
be50: 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
be60: 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
be70: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
be80: 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
be90: 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
bea0: 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
beb0: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
bec0: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
bed0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
bee0: 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
bef0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
bf00: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
bf10: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
bf20: 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63  pOrderBy && matc
bf30: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
bf40: 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72  (pParse,p,p->pOr
bf50: 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b  derBy,tab1,1) ){
bf60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
bf70: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
bf80: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
bf90: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
bfa0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bfb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
bfc0: 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b  nTemp, tab1, 0);
bfd0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  .      rc = mult
bfe0: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
bff0: 64 64 72 28 70 2c 20 61 64 64 72 2c 20 26 70 4f  ddr(p, addr, &pO
c000: 70 65 6e 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  penTemp);.      
c010: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c020: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
c030: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c040: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
c050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c060: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
c070: 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20  ta, tab1, 1);.  
c080: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c090: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
c0a0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
c0b0: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
c0c0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
c0d0: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
c0e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 72 69     */.      pPri
c0f0: 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d  or->ppOpenTemp =
c100: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a   p->ppOpenTemp;.
c110: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c120: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c130: 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
c140: 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
c150: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
c160: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c170: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c180: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c190: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c1a0: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
c1b0: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
c1c0: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
c1d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
c1e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c1f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
c200: 65 6d 70 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  emp, tab2, 0);. 
c210: 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53       rc = multiS
c220: 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64  electOpenTempAdd
c230: 72 28 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65  r(p, addr, &pOpe
c240: 6e 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  nTemp);.      if
c250: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c260: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c270: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2a0: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
c2b0: 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20  , tab2, 1);.    
c2c0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
c2d0: 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20  .      nLimit = 
c2e0: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
c2f0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->nLimit = -1;
c300: 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d  .      nOffset =
c310: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
c320: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
c330: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
c340: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c350: 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e  se, p, SRT_Union
c360: 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c  , tab2, 0, 0, 0,
c370: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
c380: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
c390: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
c3a0: 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
c3b0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f   p->nOffset = nO
c3c0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
c3d0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c3e0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c3f0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
c400: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
c410: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
c420: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
c430: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
c440: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
c450: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
c460: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c470: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
c480: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
c490: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
c4a0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
c4b0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
c4c0: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
c4d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
c4e0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
c4f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
c500: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
c510: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c520: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
c530: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c540: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
c550: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f  Break);.      co
c560: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
c570: 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ers(pParse, p);.
c580: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
c590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c5a0: 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74  v, OP_FullKey, t
c5b0: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab1, 0);.      s
c5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c5d0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
c5e0: 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  tab2, iCont);.  
c5f0: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
c600: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
c610: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
c620: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
c630: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
c660: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
c670: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
c6a0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
c6b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c6c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
c6d0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c6e0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c6f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c700: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
c710: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c720: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c730: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
c740: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
c750: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
c760: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
c770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c780: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c790: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
c7a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c7b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c7c0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
c7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c7e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
c7f0: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
c800: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
c810: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
c820: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
c830: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
c840: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c850: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
c860: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
c870: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
c880: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
c890: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
c8a0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c8b0: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
c8c0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
c8d0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
c8e0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c8f0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  nd;.  }..  if( p
c900: 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70  ->pOrderBy || (p
c910: 4f 70 65 6e 54 65 6d 70 20 26 26 20 70 4f 70 65  OpenTemp && pOpe
c920: 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b  nTemp->nId>0) ){
c930: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
c940: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c950: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
c960: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
c970: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
c980: 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  c(sizeof(*pKeyIn
c990: 66 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  fo)+nCol*sizeof(
c9a0: 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20  CollSeq*));.    
c9b0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
c9c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c9d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c9e0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c9f0: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
ca00: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
ca10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
ca20: 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  c;.    pKeyInfo-
ca30: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
ca40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ca50: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ca60: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
ca70: 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
ca80: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
ca90: 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
caa0: 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  f( !pKeyInfo->aC
cab0: 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
cac0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
cad0: 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64  l[i] = pParse->d
cae0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
caf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
cb00: 20 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54   for(i=0; pOpenT
cb10: 65 6d 70 20 26 26 20 69 3c 70 4f 70 65 6e 54 65  emp && i<pOpenTe
cb20: 6d 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  mp->nId; i++){. 
cb30: 20 20 20 20 20 69 6e 74 20 70 33 74 79 70 65 20       int p3type 
cb40: 3d 20 28 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e  = (i==0?P3_KEYIN
cb50: 46 4f 5f 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45  FO_HANDOFF:P3_KE
cb60: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e  YINFO);.      in
cb70: 74 20 61 64 64 72 20 3d 20 70 4f 70 65 6e 54 65  t addr = pOpenTe
cb80: 6d 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20  mp->a[i].idx;.  
cb90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
cba0: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
cbb0: 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66   (char *)pKeyInf
cbc0: 6f 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 20 20  o, p3type);.    
cbd0: 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  }..    if( p->pO
cbe0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
cbf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f  for(i=0; i<p->pO
cc00: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
cc10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
cc20: 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 4f  r *pExpr = p->pO
cc30: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
cc40: 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  pr;.        char
cc50: 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 70 4f 72   *zName = p->pOr
cc60: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  derBy->a[i].zNam
cc70: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
cc80: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
cc90: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
cca0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29  ->iColumn<nCol )
ccb0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ccc0: 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  ( !pExpr->pColl 
ccd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
cce0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
ccf0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
cd00: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
cd10: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e  llSeq(pParse, zN
cd20: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
cd30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cd40: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
cd50: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
cd60: 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
cd70: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
cd80: 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72     }.      gener
cd90: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
cda0: 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  se, p, v, p->pEL
cdb0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
cdc0: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d  t, iParm);.    }
cdd0: 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e  ..    if( !pOpen
cde0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Temp ){.      /*
cdf0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   This happens fo
ce00: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
ce10: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
ce20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
ce30: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  yInfo);.    }.  
ce40: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
ce50: 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e  end:.  if( pOpen
ce60: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
ce70: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
ce80: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a  pOpenTemp);.  }.
ce90: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
cea0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
ceb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
cec0: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
ced0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
cee0: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
cef0: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
cf00: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
cf10: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
cf20: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
cf30: 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
cf40: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
cf50: 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
cf60: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
cf70: 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
cf80: 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
cf90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cfa0: 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
cfb0: 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
cfc0: 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
cfd0: 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
cfe0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
cff0: 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
d000: 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
d010: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
d020: 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
d030: 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
d040: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
d050: 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
d060: 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
d070: 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
d080: 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
d090: 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
d0a0: 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
d0b0: 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
d0c0: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
d0d0: 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
d0e0: 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
d0f0: 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
d100: 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
d110: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
d120: 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
d130: 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45  (ExprList*,int,E
d140: 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46  xprList*);  /* F
d150: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
d160: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
d170: 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
d180: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
d190: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
d1a0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
d1b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
d1c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
d1d0: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
d1e0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
d1f0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
d200: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
d210: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
d220: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
d230: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
d240: 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
d250: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
d260: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
d270: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
d280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d290: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
d2a0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
d2b0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
d2c0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
d2d0: 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
d2e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
d2f0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
d300: 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
d310: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
d320: 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
d330: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
d340: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
d350: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
d360: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d370: 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
d380: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d390: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
d3a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
d3b0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
d3c0: 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68  rDup(pNew->pRigh
d3d0: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
d3e0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
d3f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
d400: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
d410: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  3ExprListDup(pNe
d420: 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  w->pList);.     
d430: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
d440: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20   pNew->iTable;. 
d450: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
d460: 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c  umn = pNew->iCol
d470: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72  umn;.      pExpr
d480: 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69  ->iAgg = pNew->i
d490: 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Agg;.      sqlit
d4a0: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
d4b0: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
d4c0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
d4d0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
d4e0: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  (&pExpr->span, &
d4f0: 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
d500: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
d510: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
d520: 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
d530: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
d540: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52  stExpr(pExpr->pR
d550: 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
d560: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
d570: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
d580: 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
d590: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
d5a0: 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74  atic void .subst
d5b0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
d5c0: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54  t *pList, int iT
d5d0: 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  able, ExprList *
d5e0: 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  pEList){.  int i
d5f0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
d600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
d610: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
d620: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
d630: 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d  substExpr(pList-
d640: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
d650: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
d660: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
d670: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
d680: 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
d690: 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
d6a0: 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
d6b0: 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
d6c0: 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
d6d0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
d6e0: 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
d6f0: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
d700: 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
d710: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
d720: 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
d730: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
d740: 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
d750: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
d760: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
d770: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
d780: 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
d790: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
d7a0: 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
d7b0: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
d7c0: 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
d7d0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
d7e0: 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
d7f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
d800: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
d810: 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
d820: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d830: 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
d840: 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
d850: 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
d860: 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
d870: 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
d880: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
d890: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
d8a0: 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
d8b0: 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
d8c0: 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
d8d0: 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
d8e0: 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
d8f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d900: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
d910: 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
d920: 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
d930: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
d940: 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
d950: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
d960: 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
d970: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
d980: 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
d990: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
d9a0: 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
d9b0: 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
d9c0: 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
d9d0: 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
d9e0: 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
d9f0: 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
da00: 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
da10: 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
da20: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
da30: 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
da40: 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
da50: 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
da60: 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
da70: 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
da80: 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
da90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
daa0: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
dab0: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
dac0: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
dad0: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
dae0: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
daf0: 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
db00: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
db10: 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
db20: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
db30: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
db40: 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
db50: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
db60: 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
db70: 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
db80: 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
db90: 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
dba0: 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
dbb0: 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
dbc0: 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
dbd0: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
dbe0: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
dbf0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
dc00: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
dc10: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
dc20: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
dc30: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
dc40: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
dc50: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
dc60: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
dc70: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
dc80: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
dc90: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
dca0: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
dcb0: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
dcc0: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
dcd0: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
dce0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
dcf0: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
dd00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
dd10: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
dd20: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
dd30: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
dd40: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
dd50: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
dd60: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
dd70: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
dd80: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
dd90: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
dda0: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
ddb0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
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 61 67 67 72 65  es not use aggre
dde0: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
ddf0: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
de00: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
de10: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
de20: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
de30: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
de40: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
de50: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
de60: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
de70: 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
de80: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
de90: 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
dea0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
deb0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
dec0: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
ded0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
dee0: 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
def0: 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  50).**.** In thi
df00: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
df10: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
df20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
df30: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
df40: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
df50: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
df60: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
df70: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
df80: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
df90: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
dfa0: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
dfb0: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
dfc0: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
dfd0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
dfe0: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
dff0: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
e000: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
e010: 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
e020: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
e030: 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
e040: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
e050: 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
e060: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
e070: 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
e080: 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
e090: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
e0a0: 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
e0b0: 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
e0c0: 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
e0d0: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
e0e0: 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
e0f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e100: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
e110: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
e120: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
e130: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
e140: 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
e150: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
e160: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
e170: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
e180: 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
e190: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
e1a0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
e1b0: 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
e1c0: 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
e1d0: 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
e1e0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
e1f0: 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
e200: 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
e210: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
e220: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
e230: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
e240: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
e250: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
e260: 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
e270: 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
e280: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
e290: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
e2a0: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
e2b0: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
e2c0: 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
e2d0: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
e2e0: 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
e2f0: 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
e300: 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
e310: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
e320: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
e330: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
e340: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
e350: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
e360: 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
e370: 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
e380: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  e */.  int i;.  
e390: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20  Expr *pWhere;.. 
e3a0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
e3b0: 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
e3c0: 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
e3d0: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
e3e0: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
e3f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
e400: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
e410: 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
e420: 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
e430: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
e440: 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pSub = pSrc->a[
e450: 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a  iFrom].pSelect;.
e460: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
e470: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
e480: 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
e490: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
e4a0: 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
e4b0: 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
e4c0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
e4d0: 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
e4e0: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
e4f0: 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28  pSubSrc );.  if(
e500: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
e510: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e520: 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73  if( (pSub->isDis
e530: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e  tinct || pSub->n
e540: 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70  Limit>=0) &&  (p
e550: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
e560: 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
e570: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
e580: 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  ( (p->isDistinct
e590: 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   || p->nLimit>=0
e5a0: 29 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  ) && subqueryIsA
e5b0: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  gg ) return 0;. 
e5c0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
e5d0: 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
e5e0: 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  By ) return 0;..
e5f0: 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
e600: 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
e610: 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
e620: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
e630: 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
e640: 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
e650: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
e660: 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
e670: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
e680: 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
e690: 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
e6a0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
e6b0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
e6c0: 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
e6d0: 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
e6e0: 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
e6f0: 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
e700: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
e710: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
e720: 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
e730: 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
e740: 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
e750: 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
e760: 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  /.  if( pSubSrc-
e770: 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d  >nSrc>1 && iFrom
e780: 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69  >0 && (pSrc->a[i
e790: 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  From-1].jointype
e7a0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
e7b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
e7c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
e7d0: 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
e7e0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
e7f0: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
e800: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
e810: 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
e820: 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
e830: 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
e840: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
e850: 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
e860: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
e870: 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
e880: 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
e890: 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
e8a0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
e8b0: 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
e8c0: 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
e8d0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
e8e0: 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
e8f0: 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
e900: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
e910: 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
e920: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
e930: 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
e940: 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
e950: 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
e960: 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
e970: 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
e980: 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
e990: 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
e9a0: 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69  R JOIN..  */.  i
e9b0: 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  f( iFrom>0 && (p
e9c0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e  Src->a[iFrom-1].
e9d0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
e9e0: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26  TER)!=0 .      &
e9f0: 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d  & pSub->pWhere!=
ea00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ea10: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
ea20: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
ea30: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
ea40: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
ea50: 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
ea60: 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
ea70: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
ea80: 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
ea90: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20  r query..  */.. 
eaa0: 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20   /* Move all of 
eab0: 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
eac0: 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
ead0: 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
eae0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
eaf0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
eb00: 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
eb10: 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
eb20: 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
eb30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
eb40: 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
eb50: 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
eb60: 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
eb70: 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
eb80: 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
eb90: 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
eba0: 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
ebb0: 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
ebc0: 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
ebd0: 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
ebe0: 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
ebf0: 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
ec00: 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
ec10: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
ec20: 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
ec30: 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
ec40: 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
ec50: 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
ec60: 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
ec70: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
ec80: 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20  iCursor;.  {.   
ec90: 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70   int nSubSrc = p
eca0: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  SubSrc->nSrc;.  
ecb0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
ecc0: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
ecd0: 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69  jointype;..    i
ece0: 66 28 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  f( pSrc->a[iFrom
ecf0: 5d 2e 70 54 61 62 20 26 26 20 70 53 72 63 2d 3e  ].pTab && pSrc->
ed00: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69  a[iFrom].pTab->i
ed10: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
ed20: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
ed30: 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e  eTable(0, pSrc->
ed40: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a  a[iFrom].pTab);.
ed50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ed60: 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72  Free(pSrc->a[iFr
ed70: 6f 6d 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om].zDatabase);.
ed80: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
ed90: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e  Src->a[iFrom].zN
eda0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
edb0: 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72  Free(pSrc->a[iFr
edc0: 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  om].zAlias);.   
edd0: 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
ede0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
edf0: 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
ee00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
ee10: 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
ee20: 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
ee30: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
ee40: 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29  pend(pSrc, 0, 0)
ee50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee60: 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
ee70: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
ee80: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
ee90: 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
eea0: 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
eeb0: 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
eec0: 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
eed0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
eee0: 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
eef0: 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
ef00: 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
ef10: 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
ef20: 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
ef30: 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
ef40: 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
ef50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
ef60: 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53  c->a[iFrom+nSubS
ef70: 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
ef80: 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a   jointype;.  }..
ef90: 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
efa0: 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
efb0: 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
efc0: 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
efd0: 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
efe0: 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
eff0: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
f000: 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45  ry..  ** .  ** E
f010: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
f020: 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
f030: 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
f040: 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
f050: 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
f060: 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20  HERE a>b;.  **  
f070: 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
f080: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
f090: 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
f0a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
f0b0: 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f      /.  **    \_
f0c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f0d0: 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
f0e0: 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
f0f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
f100: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f  .  **.  ** We lo
f110: 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
f120: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
f130: 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
f140: 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
f150: 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62  .  ** "a" we sub
f160: 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
f170: 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
f180: 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
f190: 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
f1a0: 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c   */.  substExprL
f1b0: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69  ist(p->pEList, i
f1c0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
f1d0: 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d  List);.  pList =
f1e0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
f1f0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f200: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f210: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
f220: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
f230: 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
f240: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
f250: 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
f260: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  z!=0 ){.      pL
f270: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
f280: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
f290: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
f2a0: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
f2b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
f2c0: 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73  sAgg ){.    subs
f2d0: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
f2e0: 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
f2f0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
f300: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
f310: 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
f320: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
f330: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
f340: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
f350: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
f360: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
f370: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
f380: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
f390: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
f3a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
f3b0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
f3c0: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
f3d0: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
f3e0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
f3f0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
f400: 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
f410: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
f420: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
f430: 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65  b->pWhere);.  }e
f440: 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20  lse{.    pWhere 
f450: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
f460: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
f470: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f480: 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
f490: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d   p->pHaving = p-
f4a0: 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e  >pWhere;.    p->
f4b0: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
f4c0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f4d0: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
f4e0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
f4f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  );.    if( pSub-
f500: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
f510: 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20    Expr *pHaving 
f520: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
f530: 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b  (pSub->pHaving);
f540: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48  .      if( p->pH
f550: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
f560: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
f570: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
f580: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48  , p->pHaving, pH
f590: 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20  aving, 0);.     
f5a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f5b0: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  p->pHaving = pHa
f5c0: 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ving;.      }.  
f5d0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
f5e0: 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
f5f0: 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
f600: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
f610: 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
f620: 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20  oupBy);.  }else 
f630: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30  if( p->pWhere==0
f640: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   ){.    p->pWher
f650: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d 65  e = pWhere;.  }e
f660: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
f670: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50  pr(p->pWhere, iP
f680: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
f690: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  ist);.    if( pW
f6a0: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  here ){.      p-
f6b0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
f6c0: 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  3Expr(TK_AND, p-
f6d0: 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c  >pWhere, pWhere,
f6e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
f6f0: 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
f700: 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
f710: 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
f720: 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
f730: 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
f740: 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
f750: 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
f760: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
f770: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
f780: 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54  istinct;..  /* T
f790: 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d 69  ransfer the limi
f7a0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  t expression fro
f7b0: 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  m the subquery t
f7c0: 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  o the outer.  **
f7d0: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   query..  */.  i
f7e0: 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  f( pSub->nLimit>
f7f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
f800: 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20  >nLimit<0 ){.   
f810: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
f820: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  Sub->nLimit;.   
f830: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c   }else if( p->nL
f840: 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20  imit+p->nOffset 
f850: 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70  > pSub->nLimit+p
f860: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a  Sub->nOffset ){.
f870: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
f880: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b  = pSub->nLimit +
f890: 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d   pSub->nOffset -
f8a0: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
f8b0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66   }.  }.  p->nOff
f8c0: 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66  set += pSub->nOf
f8d0: 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69  fset;..  /* Fini
f8e0: 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
f8f0: 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
f900: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
f910: 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
f920: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
f930: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
f940: 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
f950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
f960: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
f970: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
f980: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
f990: 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
f9a0: 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
f9b0: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
f9c0: 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
f9d0: 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
f9e0: 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
f9f0: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
fa00: 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
fa10: 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
fa20: 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
fa30: 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
fa40: 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
fa50: 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
fa60: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
fa70: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
fa80: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
fa90: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
faa0: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
fab0: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
fac0: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
fad0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
fae0: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
faf0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
fb00: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
fb10: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
fb20: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
fb30: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
fb40: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
fb50: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
fb60: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
fb70: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
fb80: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
fb90: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
fba0: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
fbb0: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
fbc0: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
fbd0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
fbe0: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
fbf0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
fc00: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
fc10: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
fc20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
fc30: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
fc40: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
fc50: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
fc60: 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ite3Select()..**
fc70: 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
fc80: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
fc90: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
fca0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
fcb0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fcc0: 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  t simpleMinMaxQu
fcd0: 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
fce0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
fcf0: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
fd00: 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm){.  Expr *pEx
fd10: 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
fd20: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
fd30: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
fd40: 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
fd50: 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
fd60: 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
fd70: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
fd80: 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74  t, *pList, eList
fd90: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
fda0: 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
fdb0: 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  em;.  SrcList *p
fdc0: 53 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 43 68  Src;.  ..  /* Ch
fdd0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
fde0: 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69  is query is a si
fdf0: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
fe00: 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75  x() query.  Retu
fe10: 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20  rn.  ** zero if 
fe20: 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f  it is  not..  */
fe30: 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
fe40: 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67  By || p->pHaving
fe50: 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20   || p->pWhere ) 
fe60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
fe70: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
fe80: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
fe90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
fea0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
feb0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
fec0: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
fed0: 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  n 0;.  pExpr = p
fee0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
fef0: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
ff00: 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
ff10: 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
ff20: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
ff30: 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  >pList;.  if( pL
ff40: 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ist==0 || pList-
ff50: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
ff60: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
ff70: 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
ff80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
ff90: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
ffa0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
ffb0: 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
ffc0: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
ffd0: 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
ffe0: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
fff0: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
10000 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
10010 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
10020 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
10030 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10040 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
10050 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
10060 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
10070 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
10080 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
10090 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
100a0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
100b0 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
100c0 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
100d0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
100e0 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
100f0 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
10100 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
10110 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
10120 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
10130 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
10140 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
10150 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
10160 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
10170 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
10180 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
10190 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
101a0 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
101b0 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
101c0 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
101d0 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
101e0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
101f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
10200 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
10210 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
10220 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
10230 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
10240 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
10250 70 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  pr);.    for(pId
10260 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
10270 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
10280 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
10290 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
102a0 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20  lumn>=1 );.     
102b0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
102c0 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20  umn[0]==iCol && 
102d0 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
102e0 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20  oll[0]==pColl ) 
102f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10300 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
10310 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
10320 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
10330 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
10340 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
10350 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
10360 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
10370 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
10380 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
10390 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
103a0 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
103b0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
103c0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
103d0 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
103e0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
103f0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
10400 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
10410 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
10420 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
10430 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
10440 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
10450 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
10460 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
10470 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
10480 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
10490 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
104a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
104b0 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
104c0 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
104d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
104e0 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
104f0 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ns, iParm, 1);. 
10500 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
10510 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
10520 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
10530 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
10540 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
10550 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
10560 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
10570 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
10580 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
10590 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
105a0 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
105b0 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
105c0 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
105d0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
105e0 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
105f0 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
10600 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ble..  */.  sqli
10610 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10620 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
10630 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d  ->iDb);.  base =
10640 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
10650 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  sor;.  computeLi
10660 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
10670 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
10680 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
10690 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
106a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
106b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
106c0 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
106d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
106e0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
106f0 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
10700 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10710 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
10720 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73  tNumColumns, bas
10730 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  e, pTab->nCol);.
10740 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c    }.  cont = sql
10750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10760 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78  l(v);.  if( pIdx
10770 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
10780 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
10790 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
107a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
107b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
107c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
107d0 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
107e0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
107f0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
10800 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e  base+1, pIdx->tn
10810 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
10820 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
10830 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33  Idx->keyInfo, P3
10840 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
10850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10860 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
10870 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
10880 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10890 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
108a0 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
108b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
108c0 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
108d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
108e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
108f0 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30  _MoveGe, base, 0
10900 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
10910 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
10920 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
10930 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
10940 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
10950 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
10960 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
10970 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
10980 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
10990 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
109a0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
109b0 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
109c0 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cont, 0);.  sqli
109d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
109e0 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
109f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a00 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
10a10 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74  se, 0);.  .  ret
10a20 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
10a30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
10a40 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
10a50 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
10a60 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
10a70 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
10a80 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
10a90 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
10aa0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65  .** value of eDe
10ab0 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a  st and iParm..**
10ac0 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61  .**     eDest Va
10ad0 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74  lue       Result
10ae0 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
10af0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b20 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43  ---.**     SRT_C
10b30 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b  allback    Invok
10b40 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
10b50 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
10b60 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
10b70 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
10b80 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74       Store first
10b90 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72   result in memor
10ba0 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a  y cell iParm.**.
10bb0 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
10bc0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
10bd0 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
10be0 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
10bf0 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
10c00 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
10c10 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
10c20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10c30 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
10c40 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
10c50 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
10c60 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
10c70 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
10c80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
10c90 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
10ca0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
10cb0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
10cc0 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  rm.**.** The tab
10cd0 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f  le above is inco
10ce0 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f  mplete.  Additio
10cf0 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20  nal eDist value 
10d00 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a  have be added.**
10d10 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d   since this comm
10d20 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e  ent was written.
10d30 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74    See the select
10d40 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63  InnerLoop() func
10d50 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f  tion for.** a co
10d60 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f  mplete listing o
10d70 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61  f the allowed va
10d80 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e  lues of eDest an
10d90 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73  d their meanings
10da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10db0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
10dc0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
10dd0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
10de0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
10df0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
10e00 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
10e10 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
10e20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
10e30 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
10e40 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
10e50 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
10e60 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
10e70 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
10e80 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
10e90 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
10ea0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  t..**.** The pPa
10eb0 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
10ec0 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67   and *pParentAgg
10ed0 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c   fields are fill
10ee0 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ed in if this.**
10ef0 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62   SELECT is a sub
10f00 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75  query.  This rou
10f10 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20  tine may try to 
10f20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c  combine this SEL
10f30 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20  ECT.** with its 
10f40 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61  parent to form a
10f50 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65   single flat que
10f60 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ry.  In so doing
10f70 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68  , it might.** ch
10f80 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20  ange the parent 
10f90 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e  query from a non
10fa0 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e  -aggregate to an
10fb0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
10fc0 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65  ..** For that re
10fd0 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e  ason, the pParen
10fe0 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73  tAgg flag is pas
10ff0 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
11000 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62  , so it.** can b
11010 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
11020 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68   Example 1:   Th
11030 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
11040 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
11050 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  er..**.**    SEL
11060 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f  ECT * FROM t1 JO
11070 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f  IN (SELECT x, co
11080 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20  unt(*) FROM t2) 
11090 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c  JOIN t3;.**    \
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73        \_______ s
110c0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f  ubquery _______/
110d0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
110e0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
11120 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
11130 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
11140 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
11150 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54  _______/.**.** T
11160 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11170 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75  alled for the ou
11180 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e  ter query first.
11190 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c     For that call
111a0 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c  ,.** pParent wil
111b0 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69  l be NULL.  Duri
111c0 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ng the processin
111d0 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  g of the outer q
111e0 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72  uery, this .** r
111f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11200 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
11210 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75  handle the subqu
11220 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65  ery.  For the re
11230 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c  cursive.** call,
11240 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f   pParent will po
11250 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72  int to the outer
11260 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65   query.  Because
11270 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
11280 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
11290 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65  lement in a thre
112a0 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20  e-way join, the 
112b0 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65  parentTab parame
112c0 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31  ter will.** be 1
112d0 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20   (the 2nd value 
112e0 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61  of a 0-indexed a
112f0 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  rray.).*/.int sq
11300 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
11310 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
11330 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
11340 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
11350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
11360 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11370 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
11380 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
11390 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
113a0 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
113b0 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
113c0 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
113d0 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
113e0 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
113f0 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
11400 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
11410 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
11420 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
11430 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
11440 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
11450 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
11460 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
11470 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
11480 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
11490 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
114a0 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20  *pParentAgg,    
114b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
114c0 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
114d0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
114e0 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
114f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
11500 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
11510 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
11520 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
11530 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 49   int i;.  WhereI
11540 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56  nfo *pWInfo;.  V
11550 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73  dbe *v;.  int is
11560 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Agg = 0;        
11570 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
11580 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
11590 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
115a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
115b0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
115c0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
115d0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
115e0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
115f0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
11600 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
11610 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
11620 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
11630 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
11640 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
11650 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11660 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
11670 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11680 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
11690 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
116a0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
116b0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
116c0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
116d0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
116e0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
116f0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
11700 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
11710 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
11720 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
11730 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
11740 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
11750 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
11760 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
11770 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
11780 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
11790 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
117a0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
117b0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
117c0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
117d0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  s function */.. 
117e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
117f0 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
11800 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
11810 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
11820 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11830 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11840 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
11850 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
11860 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11870 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
11880 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
11890 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
118a0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
118b0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
118c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
118d0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
118e0 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
118f0 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f  , aff);.  }..  /
11900 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
11910 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
11920 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
11930 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
11940 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
11950 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
11960 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
11970 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
11980 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
11990 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
119a0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
119b0 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
119c0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
119d0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
119e0 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72  VDBE cursors for
119f0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
11a00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
11a10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
11a20 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
11a30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
11a40 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  st);..  /* .  **
11a50 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
11a60 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
11a70 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
11a80 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
11a90 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
11aa0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
11ab0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
11ac0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
11ad0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
11ae0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70  t_end;..  /* Exp
11af0 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d  and any "*" term
11b00 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
11b10 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70  set.  (For examp
11b20 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20  le the "*" in.  
11b30 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
11b40 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c  M t1")  The fill
11b50 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72  InColumnlist() r
11b60 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
11b70 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72   some.  ** other
11b80 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20   housekeeping - 
11b90 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  see the header c
11ba0 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69  omment for detai
11bb0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  ls..  */.  if( f
11bc0 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
11bd0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
11be0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11bf0 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20  d;.  }.  pWhere 
11c00 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
11c10 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
11c20 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
11c30 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
11c40 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
11c50 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
11c60 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
11c70 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
11c80 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
11c90 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
11ca0 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  */.  if( (eDest=
11cb0 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
11cc0 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
11cd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
11ce0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11cf0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
11d00 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
11d10 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
11d20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
11d30 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
11d40 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
11d50 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
11d60 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
11d70 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
11d80 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
11d90 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
11da0 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  */.  switch( eDe
11db0 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
11dc0 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61  RT_Union:.    ca
11dd0 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20  se SRT_Except:. 
11de0 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63     case SRT_Disc
11df0 61 72 64 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ard:.    case SR
11e00 54 5f 53 65 74 3a 0a 20 20 20 20 20 20 70 4f 72  T_Set:.      pOr
11e10 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
11e20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
11e30 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
11e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
11e50 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68  his point, we sh
11e60 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61  ould have alloca
11e70 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73  ted all the curs
11e80 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  ors that we.  **
11e90 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20   need to handle 
11ea0 73 75 62 71 75 65 72 79 73 20 61 6e 64 20 74 65  subquerys and te
11eb0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
11ec0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f   .  **.  ** Reso
11ed0 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  lve the column n
11ee0 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65  ames and do a se
11ef0 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e  mantics check on
11f00 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73   all the express
11f10 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
11f20 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
11f30 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11f40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11f50 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11f60 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
11f70 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11f80 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
11f90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11fa0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11fb0 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
11fc0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
11fd0 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41  ].pExpr, 1, &isA
11fe0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
11ff0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12000 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
12010 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20  here ){.    if( 
12020 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
12030 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
12040 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
12050 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  pWhere) ){.     
12060 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12080 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
12090 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
120a0 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
120b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
120c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
120d0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
120e0 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
120f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12100 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12110 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
12120 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
12130 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b  before HAVING");
12140 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
12150 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
12160 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12170 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
12180 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
12190 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29  List, pHaving) )
121a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
121b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
121c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
121d0 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
121e0 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69 73 41  pHaving, 1, &isA
121f0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
12200 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12210 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f    }.  }.  if( pO
12220 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f  rderBy ){.    fo
12230 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
12240 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
12250 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
12260 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
12270 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
12280 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
12290 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
122a0 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
122b0 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43   && iCol>0 && iC
122c0 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol<=pEList->nExp
122d0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
122e0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
122f0 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
12300 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
12310 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
12320 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61  xprDup(pEList->a
12330 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b  [iCol-1].pExpr);
12340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12350 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
12360 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
12370 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
12380 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
12390 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
123a0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
123b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
123c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
123d0 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
123e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
123f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
12400 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12410 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
12420 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pE) ){.        i
12430 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12440 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
12450 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
12460 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12470 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
12480 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
12490 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
124a0 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
124b0 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20  constants");.   
124c0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
124d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
124e0 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d  }else if( iCol<=
124f0 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
12500 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
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 20 0a 20 20  rMsg(pParse, .  
12530 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
12540 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  R BY column numb
12550 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
12560 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
12570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62  .             "b
12580 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
12590 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
125a0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
125b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
125c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
125d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
125e0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
125f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12600 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
12610 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
12620 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70   iCol;.      Exp
12630 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79  r *pE = pGroupBy
12640 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
12650 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12660 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
12670 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
12680 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
12690 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
126a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
126b0 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20  elete(pE);.     
126c0 20 20 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79     pE = pGroupBy
126d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
126e0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
126f0 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
12700 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
12710 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12720 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
12730 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12740 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b  , pEList, pE) ){
12750 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
12760 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12770 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
12780 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
12790 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20  rse, pE, isAgg, 
127a0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  0) ){.        go
127b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
127c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
127d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
127e0 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
127f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12800 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
12810 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a  E, &iCol)==0 ){.
12820 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12830 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 47  ,.            "G
12850 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 6d 75  ROUP BY terms mu
12860 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
12870 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
12880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
12890 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
128a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
128b0 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
128c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
128d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
128e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
128f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12900 22 47 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e  "GROUP BY column
12910 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
12920 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
12930 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
12940 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
12950 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c  d %d", iCol, pEL
12960 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
12970 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
12980 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
12990 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
129a0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
129b0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
129c0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
129d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
129e0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
129f0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12a00 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
12a10 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
12a20 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
12a30 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
12a40 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
12a50 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
12a60 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
12a70 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
12a80 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
12a90 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  n..  */.  if( eD
12aa0 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
12ab0 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
12ac0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
12ad0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
12ae0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  EList);.  }..#if
12af0 20 31 20 20 2f 2a 20 49 20 64 6f 20 6e 6f 74 20   1  /* I do not 
12b00 74 68 69 6e 6b 20 77 65 20 6e 65 65 64 20 74 68  think we need th
12b10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
12b20 20 61 6e 79 20 6d 6f 72 65 2e 2e 2e 2e 20 2a 2f   any more.... */
12b30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73  .  /* If the des
12b40 74 69 6e 61 74 69 6f 6e 20 69 73 20 53 52 54 5f  tination is SRT_
12b50 55 6e 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20  Union, then set 
12b60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
12b70 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 74 68  lumns in.  ** th
12b80 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 77  e records that w
12b90 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
12ba0 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
12bb0 72 79 20 74 61 62 6c 65 2e 20 54 68 65 20 63 61  ry table. The ca
12bc0 6c 6c 65 72 0a 20 20 2a 2a 20 63 6f 75 6c 64 6e  ller.  ** couldn
12bd0 27 74 20 64 6f 20 74 68 69 73 2c 20 69 6e 20 63  't do this, in c
12be0 61 73 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  ase the select s
12bf0 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
12c00 68 65 20 66 6f 72 6d 20 0a 20 20 2a 2a 20 22 53  he form .  ** "S
12c10 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e  ELECT * FROM ...
12c20 2e 22 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  .". .  **.  ** W
12c30 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
12c40 73 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  s before we star
12c50 74 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f  t inserting reco
12c60 72 64 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  rds into the .  
12c70 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
12c80 6c 65 20 28 77 68 69 63 68 20 68 61 73 20 68 61  le (which has ha
12c90 64 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 20 65  d OP_KeyAsData e
12ca0 78 65 63 75 74 65 64 20 6f 6e 20 69 74 29 2c 20  xecuted on it), 
12cb0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 69 74 20  because.  ** it 
12cc0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
12cd0 68 65 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f  he key compariso
12ce0 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 53 6f 20 64  n function. So d
12cf0 6f 20 69 74 20 6e 6f 77 2c 20 65 76 65 6e 0a 20  o it now, even. 
12d00 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20   ** though this 
12d10 6d 65 61 6e 73 20 74 68 61 74 20 4f 50 5f 53 65  means that OP_Se
12d20 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6d 61 79 20  tNumColumns may 
12d30 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 74  be executed on t
12d40 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 63 75 72  he same.  ** cur
12d50 73 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sor more than on
12d60 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ce..  */.  if( e
12d70 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
12d80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12d90 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
12da0 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61  tNumColumns, iPa
12db0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
12dc0 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  r);.  }.#endif..
12dd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12de0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
12df0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
12e00 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
12e10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
12e20 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
12e30 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
12e40 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
12e50 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  ext;.    int nee
12e60 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
12e70 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ..    if( pTabLi
12e80 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
12e90 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12ea0 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
12eb0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20  ->a[i].zName!=0 
12ec0 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41  ){.      zSavedA
12ed0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
12ee0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
12ef0 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
12f00 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
12f10 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
12f20 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
12f30 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
12f40 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
12f50 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
12f60 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
12f70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
12f80 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
12f90 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
12fa0 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
12fb0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
12fc0 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
12fd0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c  a[i].iCursor, p,
12fe0 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
12ff0 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
13000 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
13010 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
13020 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
13030 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
13040 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
13050 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
13060 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
13070 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
13080 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20  t!=SRT_Union && 
13090 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70  eDest!=SRT_Excep
130a0 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  t && eDest!=SRT_
130b0 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20  Discard ){.     
130c0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
130d0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
130e0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
130f0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
13100 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
13110 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
13120 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
13130 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nct;.  }..  /* C
13140 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65  heck for the spe
13150 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d  cial case of a m
13160 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
13170 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66  nction by itself
13180 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  .  ** in the res
13190 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ult set..  */.  
131a0 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  if( simpleMinMax
131b0 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
131c0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29   eDest, iParm) )
131d0 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
131e0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
131f0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  d;.  }..  /* Che
13200 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
13210 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
13220 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61  that can be "fla
13230 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73  ttened" into its
13240 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66   parent..  ** If
13250 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
13260 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20   possiblity, do 
13270 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  so and return im
13280 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a  mediately.  .  *
13290 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
132a0 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
132b0 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
132c0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
132d0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
132e0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
132f0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
13300 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
13310 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72  ntAgg = 1;.    r
13320 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13330 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
13340 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13350 73 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20  se, resolve any 
13360 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
13370 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74  ces.  ** names t
13380 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 65 78  hat have been ex
13390 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
133a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
133b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66  OrderBy ){.    f
133c0 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
133d0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
133e0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
133f0 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  rBy->a[i].zName 
13400 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
13410 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  rBy->a[i].pExpr-
13420 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20 20 20 20 20  >pColl = .      
13430 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
13440 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
13450 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
13460 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  ].zName, -1);.  
13470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13480 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13490 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
134a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
134b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
134c0 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
134d0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
134e0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
134f0 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   p);..  /* If th
13500 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
13510 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
13520 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
13530 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
13540 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
13550 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
13560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13570 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
13580 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
13590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
135a0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
135b0 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
135c0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
135d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e  .  }..  /* Do an
135e0 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67   analysis of agg
135f0 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f  regate expressio
13600 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ns..  */.  sqlit
13610 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65  eAggregateInfoRe
13620 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69  set(pParse);.  i
13630 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f  f( isAgg || pGro
13640 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65  upBy ){.    asse
13650 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  rt( pParse->nAgg
13660 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67  ==0 );.    isAgg
13670 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 1;.    for(i=
13680 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
13690 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
136a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
136b0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
136c0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
136d0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
136e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
136f0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
13700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13710 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
13720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
13730 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
13740 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
13750 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
13760 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
13770 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
13780 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
13790 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
137a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
137b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
137c0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
137d0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  && sqlite3ExprAn
137e0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
137f0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29  pParse, pHaving)
13800 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
13810 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13820 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
13830 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
13840 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
13850 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13860 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13870 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
13880 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f  gates(pParse, pO
13890 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
138a0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
138b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
138c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
138d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
138e0 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67   /* Reset the ag
138f0 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20  gregator.  */.  
13900 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
13910 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
13920 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13930 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
13940 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
13950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
13960 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
13970 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
13980 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66  *pFunc;.      if
13990 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73  ( (pFunc = pPars
139a0 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63  e->aAgg[i].pFunc
139b0 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78  )!=0 && pFunc->x
139c0 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
139d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
139e0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 49  beOp3(v, OP_AggI
139f0 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61 72  nit, 0, i, (char
13a00 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  *)pFunc, P3_FUNC
13a10 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DEF);.      }.  
13a20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
13a30 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
13a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13a50 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
13a60 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
13a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13a80 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
13a90 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
13aa0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
13ab0 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
13ac0 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  + pGroupBy->nExp
13ad0 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  r*sizeof(CollSeq
13ae0 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  *);.      KeyInf
13af0 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e  o *pKey = (KeyIn
13b00 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo *)sqliteMallo
13b10 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  c(sz);.      if(
13b20 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20   0==pKey ){.    
13b30 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13b40 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
13b50 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70     pKey->enc = p
13b60 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
13b70 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65        pKey->nFie
13b80 6c 64 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  ld = pGroupBy->n
13b90 45 78 70 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Expr;.      for(
13ba0 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
13bb0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13bc0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
13bd0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[i] = sqlite3Ex
13be0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13bf0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
13c00 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
13c10 20 69 66 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c   if( !pKey->aCol
13c20 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
13c30 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
13c40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
13c50 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
13c60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13c80 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
13c90 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f  char *)pKey, P3_
13ca0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
13cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13cc0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
13cd0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
13ce0 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
13cf0 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
13d00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13d10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
13d20 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
13d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d40 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
13d50 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d  , iParm, 1);.  }
13d60 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65  ..  /* Open a te
13d70 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
13d80 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
13d90 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
13da0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
13db0 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   ){.    distinct
13dc0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13dd0 2b 3b 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49  +;.    openTempI
13de0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
13df0 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  distinct, 0);.  
13e00 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
13e10 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
13e20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
13e30 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f  tabase scan.  */
13e40 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
13e50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
13e60 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
13e70 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20  pWhere, 0, .    
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
13ea0 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79   ? 0 : &pOrderBy
13eb0 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  );.  if( pWInfo=
13ec0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
13ed0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  _end;..  /* Use 
13ee0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
13ef0 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72  er loop if we ar
13f00 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69  e not dealing wi
13f10 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74  th.  ** aggregat
13f20 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  es.  */.  if( !i
13f30 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
13f40 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
13f50 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
13f60 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
13f70 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
13f80 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
13f90 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
13fa0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
13fb0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
13fc0 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
13fd0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
13fe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13ff0 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c  * If we are deal
14000 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61  ing with aggrega
14010 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  tes, then do the
14020 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61   special aggrega
14030 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  te.  ** processi
14040 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73  ng.  .  */.  els
14050 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a  e{.    AggExpr *
14060 70 41 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47  pAgg;.    if( pG
14070 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
14080 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20  int lbl1;.      
14090 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
140a0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
140b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
140c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
140d0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
140e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
140f0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66  .      /* No aff
14100 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73 20  inity string is 
14110 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
14120 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b  following OP_Mak
14130 65 4b 65 79 20 0a 20 20 20 20 20 20 2a 2a 20 62  eKey .      ** b
14140 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f 74  ecause we do not
14150 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20   need to do any 
14160 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74 61  coercion of data
14170 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  types. */.      
14180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14190 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
141a0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
141b0 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20   0);.      lbl1 
141c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
141d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
141e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
141f0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
14200 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 0, lbl1);.    
14210 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d    for(i=0, pAgg=
14220 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c  pParse->aAgg; i<
14230 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
14240 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20  +, pAgg++){.    
14250 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73      if( pAgg->is
14260 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
14270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14280 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14290 70 41 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20 20  pAgg->pExpr);.  
142a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
142b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
142c0 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20  Set, 0, i);.    
142d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
142e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
142f0 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  l(v, lbl1);.    
14300 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  }.    for(i=0, p
14310 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67  Agg=pParse->aAgg
14320 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
14330 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a  ; i++, pAgg++){.
14340 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
14350 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
14360 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
14370 70 44 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20  pDef;.      if( 
14380 21 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63  !pAgg->isAgg ) c
14390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
143a0 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75  ssert( pAgg->pFu
143b0 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nc!=0 );.      a
143c0 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75  ssert( pAgg->pFu
143d0 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a  nc->xStep!=0 );.
143e0 20 20 20 20 20 20 70 44 65 66 20 3d 20 70 41 67        pDef = pAg
143f0 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  g->pFunc;.      
14400 70 45 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72  pE = pAgg->pExpr
14410 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14420 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pE!=0 );.      a
14430 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54  ssert( pE->op==T
14440 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
14450 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
14460 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
14470 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
14480 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
14490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
144a0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
144b0 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , i, 0);.      i
144c0 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
144d0 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
144e0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
144f0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
14500 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
14510 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  =0; !pColl && j<
14520 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
14530 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
14540 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
14550 71 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  q(pParse, pE->pL
14560 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
14570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14580 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
14590 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
145a0 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
145b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
145c0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
145d0 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
145e0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
145f0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
14600 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14610 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 75  eOp3(v, OP_AggFu
14620 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c 20 28 63  nc, 0, nExpr, (c
14630 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 50 4f  har*)pDef, P3_PO
14640 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  INTER);.    }.  
14650 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  }..  /* End the 
14660 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
14670 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  op..  */.  sqlit
14680 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
14690 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  o);..  /* If we 
146a0 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  are processing a
146b0 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65  ggregates, we ne
146c0 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73  ed to set up a s
146d0 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20  econd loop.  ** 
146e0 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
146f0 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73  aggregate values
14700 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65   and process the
14710 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  m..  */.  if( is
14720 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  Agg ){.    int e
14730 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56  ndagg = sqlite3V
14740 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14750 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67  .    int startag
14760 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20  g;.    startagg 
14770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14780 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74  Op(v, OP_AggNext
14790 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  , 0, endagg);.  
147a0 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
147b0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48   = 1;.    if( pH
147c0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
147d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
147e0 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
147f0 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b  g, startagg, 1);
14800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14810 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
14820 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
14830 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
14840 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
14850 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14860 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74         iParm, st
14870 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67 2c 20  artagg, endagg, 
14880 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  aff) ){.      go
14890 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
148a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
148b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
148c0 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67  Goto, 0, startag
148d0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
148e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
148f0 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20  v, endagg);.    
14900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14910 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
14920 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
14930 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  useAgg = 0;.  }.
14940 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
14950 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
14960 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
14970 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
14980 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
14990 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
149a0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
149b0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
149c0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
149d0 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
149e0 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
149f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
14a00 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
14a10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
14a20 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
14a30 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
14a40 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
14a50 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
14a60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
14a70 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73   So delete the s
14a80 75 62 71 75 65 72 79 20 73 74 72 75 63 74 75 72  ubquery structur
14a90 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  e from the paren
14aa0 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  t.  ** to preven
14ab0 74 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  t this subquery 
14ac0 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75  from being evalu
14ad0 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74  ated again and t
14ae0 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a  o force the.  **
14af0 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   the use of the 
14b00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
14b10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
14b20 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
14b30 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
14b40 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62  ->nSrc>parentTab
14b50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14b60 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
14b70 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
14b80 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71  ect==p );.    sq
14b90 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14ba0 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e  e(p);.    pParen
14bb0 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
14bc0 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20  tTab].pSelect = 
14bd0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
14be0 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
14bf0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
14c00 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
14c10 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
14c20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
14c30 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
14c40 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
14c50 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
14c60 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
14c70 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
14c80 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
14c90 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
14ca0 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
14cb0 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
14cc0 64 3a 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65  d:.  sqliteAggre
14cd0 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50  gateInfoReset(pP
14ce0 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  arse);.  return 
14cf0 72 63 3b 0a 7d 0a                                rc;.}.