/ Hex Artifact Content
Login

Artifact d29488f86e61e0d45dff318e1f04ba6a7e5782d0:


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 38  select.c,v 1.188
0200: 20 32 30 30 34 2f 30 36 2f 31 31 20 31 33 3a 31   2004/06/11 13:1
0210: 39 3a 32 31 20 64 61 6e 69 65 6c 6b 31 39 37 37  9:21 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 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
5710: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
5720: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
5730: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
5740: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
5750: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
5760: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
5770: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5780: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
5790: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
57a0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
57b0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
57c0: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
57d0: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
57e0: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
57f0: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
5800: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
5810: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
5820: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
5830: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
5840: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
5850: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
5860: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
5870: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
5880: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
5890: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
58a0: 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20  "_ROWID_";.     
58b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
58c0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
58d0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
58e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
58f0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
5900: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
5910: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
5920: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
5930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5940: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70  tColName(v, i, p
5950: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
5960: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  n.n);.        /*
5970: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
5980: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
5990: 72 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  r); */.      }el
59a0: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
59b0: 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73   || (!shortNames
59c0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
59d0: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
59e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
59f0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
5a00: 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20  zTab;. .        
5a10: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
5a20: 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[j].zAlias;.  
5a30: 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61        if( fullNa
5a40: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
5a50: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
5a60: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
5a70: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
5a80: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
5a90: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
5aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5ab0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
5ac0: 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  Name, P3_DYNAMIC
5ad0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5ae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5af0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5b00: 20 69 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20   i, zCol, 0);.  
5b10: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
5b20: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
5b30: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
5b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5b50: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
5b60: 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  i, p->span.z, p-
5b70: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
5b80: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
5b90: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
5ba0: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
5bb0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
5bc0: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
5bd0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
5be0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
5bf0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
5c00: 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20   sprintf(zName, 
5c10: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
5c20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5c30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5c40: 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   i, zName, 0);. 
5c50: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
5c60: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
5c70: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
5c80: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
5c90: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
5ca0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
5cb0: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
5cc0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
5cd0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5ce0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
5cf0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
5d00: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
5d10: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
5d20: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
5d30: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
5d40: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5d50: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
5d60: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
5d70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5d80: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
5d90: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
5da0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
5db0: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
5dc0: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
5dd0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5de0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
5df0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
5e00: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
5e10: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
5e20: 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  ist(Parse*, Sele
5e30: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
5e40: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
5e50: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
5e60: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
5e70: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
5e80: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
5e90: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
5ea0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
5eb0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
5ec0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
5ed0: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
5ee0: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
5ef0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
5f00: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
5f10: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
5f20: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
5f30: 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69 6c  aCol;..  if( fil
5f40: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
5f50: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
5f60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5f70: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
5f80: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
5f90: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
5fa0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
5fb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5fc0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
5fd0: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
5fe0: 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29  StrDup(zTabName)
5ff0: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
6000: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
6010: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
6020: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
6030: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
6040: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
6050: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
6060: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6070: 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  zeof(pTab->aCol[
6080: 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  0])*pTab->nCol )
6090: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
60a0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
60b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 3b 0a 20  .    Expr *pR;. 
60c0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
60d0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
60e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
60f0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
6100: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
6110: 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e        aCol[i].zN
6120: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
6130: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  up(pEList->a[i].
6140: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
6150: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
6160: 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  DOT .           
6170: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
6180: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
6190: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
61a0: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
61b0: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
61c0: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
61d0: 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ing(&aCol[i].zNa
61e0: 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c  me, pR->token.z,
61f0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29   pR->token.n, 0)
6200: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e  ;.      for(j=cn
6210: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
6220: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6230: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
6240: 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69  j].zName, aCol[i
6250: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6260: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
6270: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
6280: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20  Buf[30];.       
6290: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
62a0: 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20  "_%d",++cnt);.  
62b0: 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c          n = strl
62c0: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  en(zBuf);.      
62d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
62e0: 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a  tring(&aCol[i].z
62f0: 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e  Name, pR->token.
6300: 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  z, pR->token.n, 
6310: 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20 20 20 20  zBuf,n,0);.     
6320: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
6330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6340: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
6350: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
6360: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6370: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
6380: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
6390: 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e  .zName, p->span.
63a0: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29  z, p->span.n, 0)
63b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
63c0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
63d0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
63e0: 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  zBuf, "column%d"
63f0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54  , i+1);.      pT
6400: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
6410: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6420: 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  (zBuf);.    }.. 
6430: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
6440: 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79  eStrDup(columnTy
6450: 70 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  pe(pParse, pSele
6460: 63 74 2d 3e 70 53 72 63 20 2c 70 29 29 3b 0a 20  ct->pSrc ,p));. 
6470: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
6480: 2e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a  .zType = zType;.
6490: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
64a0: 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ].affinity = SQL
64b0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
64c0: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 29  .    if( zType )
64d0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  {.      pTab->aC
64e0: 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d  ol[i].affinity =
64f0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
6500: 54 79 70 65 28 7a 54 79 70 65 2c 20 73 74 72 6c  Type(zType, strl
6510: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 20 20  en(zType));.    
6520: 7d 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  }.    pTab->aCol
6530: 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  [i].pColl = sqli
6540: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
6550: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
6560: 66 28 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( !pTab->aCol[i
6570: 5d 2e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ].pColl ){.     
6580: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70   pTab->aCol[i].p
6590: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
65a0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
65b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
65c0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
65d0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
65e0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65  .** For the give
65f0: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
6600: 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69  nt, do three thi
6610: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs..**.**    (1
6620: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
6630: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
6640: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
6650: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
6660: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
6670: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
6680: 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  es that should b
6690: 65 20 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20  e scanned.  For 
66a0: 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20  views,.**       
66b0: 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
66c0: 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
66d0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
66e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
66f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
6700: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
6710: 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
6720: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
6730: 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
6740: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
6750: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
6760: 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
6770: 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
6780: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
6790: 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
67a0: 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
67b0: 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
67c0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
67d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
67e0: 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
67f0: 20 20 28 32 29 20 20 41 64 64 20 74 65 72 6d 73    (2)  Add terms
6800: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
6810: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
6820: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
6830: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
6840: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
6850: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
6860: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
6870: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53  .**.**    (3)  S
6880: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
6890: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
68a0: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
68b0: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
68c0: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
68d0: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
68e0: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
68f0: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
6900: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
6910: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
6920: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
6930: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
6940: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
6950: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
6960: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
6970: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
6980: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
6990: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
69a0: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
69b0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
69c0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
69d0: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
69e0: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
69f0: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
6a00: 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  mnList(Parse *pP
6a10: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
6a20: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
6a30: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
6a40: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
6a50: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
6a60: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20  Table *pTab;..  
6a70: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
6a80: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
6a90: 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  1;.  pTabList = 
6aa0: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
6ab0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
6ac0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
6ad0: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
6ae0: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
6af0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
6b00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
6b10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62  +){.    if( pTab
6b20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
6b30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
6b40: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
6b50: 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65   before!  No nee
6b60: 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f  d to continue */
6b70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6b80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6b90: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
6ba0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
6bb0: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
6bc0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
6bd0: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
6be0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6bf0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6c00: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
6c10: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6c20: 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29  a[i].zAlias==0 )
6c30: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
6c40: 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20  FakeName[60];.  
6c50: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46        sprintf(zF
6c60: 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  akeName, "sqlite
6c70: 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a  _subquery_%p_",.
6c80: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
6c90: 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  *)pTabList->a[i]
6ca0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
6cb0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
6cc0: 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d 3e 61  ing(&pTabList->a
6cd0: 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b  [i].zAlias, zFak
6ce0: 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  eName, 0);.     
6cf0: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73   }.      pTabLis
6d00: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70  t->a[i].pTab = p
6d10: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
6d20: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
6d30: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
6d40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6d50: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6d80: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6d90: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
6da0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
6db0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
6dd0: 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20  The isTransient 
6de0: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
6df0: 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74  hat the Table st
6e00: 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e  ructure has been
6e10: 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
6e20: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
6e30: 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64  and may be freed
6e40: 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49   at any time.  I
6e50: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20  n other words,. 
6e60: 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20       ** pTab is 
6e70: 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
6e80: 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  a persistent tab
6e90: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
6ea0: 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20  t defines.      
6eb0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
6ec0: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
6ed0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
6ee0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
6ef0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
6f00: 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
6f10: 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
6f20: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6f30: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6f40: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6f50: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
6f60: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
6f70: 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e  Parse,pTabList->
6f80: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c  a[i].zName,pTabL
6f90: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62  ist->a[i].zDatab
6fa0: 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
6fb0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
6fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6fd0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
6fe0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
7000: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
7010: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
7020: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
7030: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
7040: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
7050: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
7060: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
7070: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
7090: 2a 20 49 66 20 70 54 61 62 4c 69 73 74 2d 3e 61  * If pTabList->a
70a0: 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 69  [i].pSelect!=0 i
70b0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
70c0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
70d0: 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
70e0: 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
70f0: 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
7100: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
7110: 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
7120: 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
7130: 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
7140: 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
7150: 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
7160: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
7170: 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
7180: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
7190: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
71a0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
71b0: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
71c0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
71d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
71e0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
71f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7200: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7210: 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
7220: 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
7230: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
7240: 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
7250: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
7260: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
7270: 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20  se, p) ) return 
7280: 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65  1;..  /* For eve
7290: 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
72a0: 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
72b0: 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
72c0: 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
72d0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
72e0: 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
72f0: 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
7300: 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
7310: 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
7320: 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
7330: 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
7340: 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
7350: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
7360: 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
7370: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
7380: 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
7390: 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
73a0: 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
73b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
73c0: 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
73d0: 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
73e0: 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
73f0: 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
7400: 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
7410: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
7420: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
7430: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
7440: 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
7450: 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
7460: 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
7470: 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
7480: 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
7490: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
74a0: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
74b0: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
74c0: 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
74d0: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
74e0: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
74f0: 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
7500: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
7510: 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
7520: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
7530: 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20  op==TK_ALL.     
7540: 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74      && pE->pLeft
7550: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
7560: 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b  p==TK_ID ) break
7570: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a  ;.  }.  rc = 0;.
7580: 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
7590: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
75a0: 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
75b0: 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
75c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
75d0: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
75e0: 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
75f0: 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
7600: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
7610: 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
7620: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
7630: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
7640: 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
7650: 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
7660: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
7670: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7680: 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
7690: 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
76a0: 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
76b0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
76c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
76d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
76e0: 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
76f0: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
7700: 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
7710: 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
7720: 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
7730: 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
7740: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
7750: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
7760: 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
7770: 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
7780: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
7790: 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
77a0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
77b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
77c0: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b  tAppend(pNew, a[
77d0: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
77e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
77f0: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
7800: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
7810: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
7820: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
7830: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
7840: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7850: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
7860: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
7870: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
7880: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
7890: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
78a0: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
78b0: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
78c0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
78d0: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
78e0: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
78f0: 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b     Token *pName;
7900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
7910: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
7920: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
7930: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
7940: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
7950: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
7960: 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e  e = &pE->pLeft->
7970: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  token;.        }
7980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7990: 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  pName = 0;.     
79a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
79b0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
79c0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
79d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
79e0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
79f0: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
7a00: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
7a10: 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ame = pTabList->
7a20: 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[i].zAlias;.   
7a30: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
7a40: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
7a50: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
7a60: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
7a70: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
7a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7a90: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
7aa0: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
7ab0: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
7ac0: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
7ad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7ae0: 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a  trNICmp(pName->z
7af0: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d  , zTabName, pNam
7b00: 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20  e->n)!=0 ||.    
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61               zTa
7b20: 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21  bName[pName->n]!
7b30: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
7b40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7b50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7b60: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
7b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
7b80: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
7b90: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
7ba0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7bb0: 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  , *pLeft, *pRigh
7bc0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
7bd0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
7be0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
7bf0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
7c00: 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c  f( i>0 && (pTabL
7c10: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e  ist->a[i-1].join
7c20: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
7c30: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
7c40: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
7c50: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
7c60: 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d  [i-1].pTab, zNam
7c70: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
7c80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
7c90: 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
7ca0: 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
7cb0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
7cc0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
7cd0: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
7ce0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7cf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d10: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
7d20: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
7d30: 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  dex(pTabList->a[
7d40: 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  i-1].pUsing, zNa
7d50: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7d60: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7d70: 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
7d80: 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
7d90: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
7db0: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
7dc0: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
7dd0: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7de0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7df0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7e00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
7e10: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
7e20: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
7e30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7e40: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20  if( pRight==0 ) 
7e50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7e60: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
7e70: 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  .z = zName;.    
7e80: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
7e90: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
7ea0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
7eb0: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7ec0: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
7ed0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
7ee0: 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74  Name && pTabList
7ef0: 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
7f00: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
7f10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
7f20: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
7f40: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7f50: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
7f60: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7f70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
7f80: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
7fa0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  eft->token.z = z
7fb0: 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  TabName;.       
7fc0: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
7fd0: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
7fe0: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
7ff0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
8000: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8010: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8020: 74 65 33 53 65 74 53 74 72 69 6e 67 28 28 63 68  te3SetString((ch
8030: 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61  ar**)&pExpr->spa
8040: 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22  n.z, zTabName, "
8050: 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  .", zName, 0);. 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8070: 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72  pr->span.n = str
8080: 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  len(pExpr->span.
8090: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
80a0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
80b0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
80c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
80d0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
80e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
80f0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
8100: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8110: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
8120: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
8130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8140: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8160: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
8170: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
8180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8190: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
81a0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
81b0: 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29  (pNew, pExpr, 0)
81c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
81d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
81e0: 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
81f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8200: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  pName ){.       
8210: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8230: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22   such table: %T"
8240: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
8250: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8270: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8280: 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
8290: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
82a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
82b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
82c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
82d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
82e0: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
82f0: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
8300: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
8310: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8320: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63  This routine rec
8330: 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73  ursively unlinks
8340: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
8350: 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65  .a[].pTab pointe
8360: 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63  rs.** in a selec
8370: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  t structure.  It
8380: 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70   just sets the p
8390: 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e  ointers to NULL.
83a0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
83b0: 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69  e is recursive i
83c0: 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
83d0: 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70   if the Select.p
83e0: 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a  Src.a[].pSelect.
83f0: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ** pointer is no
8400: 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75  t NULL, this rou
8410: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
8420: 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
8430: 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  at pointer..**.*
8440: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8450: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
8460: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
8470: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a   that defines a.
8480: 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72  ** VIEW in order
8490: 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e   to undo any bin
84a0: 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e  dings to tables.
84b0: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
84c0: 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ary.** because t
84d0: 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68  hose tables migh
84e0: 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61  t be DROPed by a
84f0: 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20   subsequent SQL 
8500: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74  command..** If t
8510: 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20  he bindings are 
8520: 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65  not removed, the
8530: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
8540: 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  c->a[].pTab fiel
8550: 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66  d.** will be lef
8560: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
8570: 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c  deallocated Tabl
8580: 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65  e structure afte
8590: 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e  r the.** DROP an
85a0: 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c  d a coredump wil
85b0: 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74  l occur the next
85c0: 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20 69   time the VIEW i
85d0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  s used..*/.void 
85e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
85f0: 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ind(Select *p){.
8600: 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
8610: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
8620: 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  rc;.  Table *pTa
8630: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
8640: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8650: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
8660: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28   i++){.    if( (
8670: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69  pTab = pSrc->a[i
8680: 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20  ].pTab)!=0 ){.  
8690: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
86a0: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
86b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
86c0: 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29  teTable(0, pTab)
86d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
86e0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  pSrc->a[i].pTab 
86f0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
8700: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
8710: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8720: 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64  ite3SelectUnbind
8730: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c  (pSrc->a[i].pSel
8740: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
8750: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8760: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
8770: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
8780: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
8790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
87a0: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
87b0: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
87c0: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
87d0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
87e0: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
87f0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8800: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
8810: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
8820: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
8830: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
8840: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
8850: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
8860: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
8870: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
8880: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
8890: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
88a0: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
88b0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
88c0: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
88d0: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
88e0: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
88f0: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
8900: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
8910: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
8920: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
8930: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
8940: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
8950: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
8960: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
8970: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
8980: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
8990: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
89a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
89b0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
89c0: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
89d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
89e0: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
89f0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
8a00: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
8a10: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
8a20: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
8a30: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
8a40: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
8a50: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
8a60: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
8a70: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
8a80: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
8a90: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
8aa0: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
8ab0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
8ac0: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
8ad0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
8ae0: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
8af0: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
8b00: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
8b10: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
8b20: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
8b30: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
8b40: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
8b50: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
8b60: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
8b70: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
8b80: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
8b90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
8ba0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
8bb0: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
8bc0: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
8bd0: 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  }.  if( fillInCo
8be0: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
8bf0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
8c00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
8c10: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
8c20: 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
8c30: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
8c40: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65  lumn(pParse, pSe
8c50: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  lect->pPrior, pO
8c60: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
8c70: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
8c80: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8c90: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8ca0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
8cb0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8cc0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
8cd0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
8ce0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
8cf0: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
8d00: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  l = -1;.    if( 
8d10: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8d20: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
8d30: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
8d40: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
8d50: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
8d60: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
8d70: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
8d80: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
8d90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8da0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
8db0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
8dc0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
8dd0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
8de0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
8df0: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
8e00: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
8e10: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
8e20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e30: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
8e40: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8e50: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
8e60: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
8e70: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
8e80: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
8e90: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
8ea0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
8eb0: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
8ec0: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
8ed0: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
8ee0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
8ef0: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
8f00: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8f10: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
8f20: 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f    assert( pE->to
8f30: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20  ken.z );.       
8f40: 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   zLabel = sqlite
8f50: 53 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65  StrNDup(pE->toke
8f60: 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pE->token.n
8f70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8f80: 65 33 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c  e3Dequote(zLabel
8f90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
8fa0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
8fb0: 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20  ame, zLabel)==0 
8fc0: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43  ){ .          iC
8fd0: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  ol = j;.        
8fe0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
8ff0: 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  Free(zLabel);.  
9000: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9010: 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65  iCol<0 && sqlite
9020: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  3ExprCompare(pE,
9030: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
9040: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
9050: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
9060: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9070: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
9080: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
9090: 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  UMN;.      pE->i
90a0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
90b0: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
90c0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  = iTable;.      
90d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
90e0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  one = 1;.    }. 
90f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
9100: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
9110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9120: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
9130: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
9140: 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20   term number %d 
9150: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
9160: 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
9170: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e  ", i+1);.      n
9180: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65  Err++;.      bre
9190: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
91a0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
91b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
91c0: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
91d0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
91e0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
91f0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
9200: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
9210: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
9220: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
9230: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
9240: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
9250: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
9260: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
9270: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9280: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
9290: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
92a0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
92b0: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
92c0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
92d0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 23 69   return v;.}..#i
92e0: 66 20 30 20 20 2f 2a 2a 2a 2a 2a 20 54 68 69 73  f 0  /***** This
92f0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 64   routine needs d
9300: 65 6c 65 74 69 6e 67 20 2a 2a 2a 2a 2a 2f 0a 73  eleting *****/.s
9310: 74 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69  tatic void multi
9320: 53 65 6c 65 63 74 41 66 66 69 6e 69 74 79 28 53  SelectAffinity(S
9330: 65 6c 65 63 74 20 2a 70 2c 20 63 68 61 72 20 2a  elect *p, char *
9340: 7a 41 66 66 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zAff){.  int i;.
9350: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
9360: 72 6e 3b 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63  rn;.  multiSelec
9370: 74 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 50 72  tAffinity(p->pPr
9380: 69 6f 72 2c 20 7a 41 66 66 29 3b 0a 0a 20 20 66  ior, zAff);..  f
9390: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 45 4c  or(i=0; i<p->pEL
93a0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
93b0: 7b 0a 20 20 20 20 69 66 28 20 7a 41 66 66 5b 69  {.    if( zAff[i
93c0: 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20  ]=='\0' ){.     
93d0: 20 7a 41 66 66 5b 69 5d 20 3d 20 73 71 6c 69 74   zAff[i] = sqlit
93e0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
93f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
9400: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
9410: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
9420: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
9430: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
9440: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
9450: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
9460: 65 0a 2a 2a 20 6e 4c 69 6d 69 74 20 61 6e 64 20  e.** nLimit and 
9470: 6e 4f 66 66 73 65 74 20 66 69 65 6c 64 73 2e 20  nOffset fields. 
9480: 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66   nLimit and nOff
9490: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 69 6e 74  set hold the int
94a0: 65 67 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 70  egers.** that ap
94b0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
94c0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
94d0: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
94e0: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
94f0: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 74   keywords.  Or t
9500: 68 61 74 20 68 6f 6c 64 20 2d 31 20 61 6e 64 20  hat hold -1 and 
9510: 30 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  0 if those keywo
9520: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
9530: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
9540: 4f 66 66 73 65 74 20 61 72 65 20 74 68 65 20 69  Offset are the i
9550: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
9560: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
9570: 6f 72 0a 2a 2a 20 63 6f 75 6e 74 65 72 73 20 75  or.** counters u
9580: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
9590: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
95a0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
95b0: 73 20 6e 6f 0a 2a 2a 20 6c 69 6d 69 74 20 61 6e  s no.** limit an
95c0: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
95d0: 6e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  n iLimit and iOf
95e0: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
95f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9600: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
9610: 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d  e values if iLim
9620: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
9630: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
9640: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
9650: 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74  efined by nLimit
9660: 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20 20 69   and nOffset.  i
9670: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
9680: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
9690: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
96a0: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
96b0: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
96c0: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
96d0: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
96e0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
96f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
9700: 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72   if nLimit>=0 or
9710: 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20 74 68   nOffset>0 do th
9720: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
9730: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
9740: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
9750: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
9760: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
9770: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
9780: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
9790: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
97a0: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
97b0: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
97c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
97d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
97e0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
97f0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
9800: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
9810: 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 49 66 20  {.  /* .  ** If 
9820: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
9830: 73 20 70 2d 3e 6e 4c 69 6d 69 74 3e 30 20 74 68  s p->nLimit>0 th
9840: 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f  en "LIMIT 0" sho
9850: 77 73 0a 20 20 2a 2a 20 61 6c 6c 20 72 6f 77 73  ws.  ** all rows
9860: 2e 20 20 49 74 20 69 73 20 74 68 65 20 73 61 6d  .  It is the sam
9870: 65 20 61 73 20 6e 6f 20 6c 69 6d 69 74 2e 20 49  e as no limit. I
9880: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 69 6f  f the comparisio
9890: 6e 20 69 73 0a 20 20 2a 2a 20 70 2d 3e 6e 4c 69  n is.  ** p->nLi
98a0: 6d 69 74 3e 3d 30 20 74 68 65 6e 20 22 4c 49 4d  mit>=0 then "LIM
98b0: 49 54 20 30 22 20 73 68 6f 77 20 6e 6f 20 72 6f  IT 0" show no ro
98c0: 77 73 20 61 74 20 61 6c 6c 2e 0a 20 20 2a 2a 20  ws at all..  ** 
98d0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
98e0: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
98f0: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
9900: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
9910: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
9920: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
9930: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
9940: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
9950: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
9960: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
9970: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
9980: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
9990: 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  f( p->nLimit>=0 
99a0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  ){.    int iMem 
99b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
99c0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
99d0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
99e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
99f0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
9a00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9a10: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9a20: 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30  r, -p->nLimit, 0
9a30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9a40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
9a50: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
9a60: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
9a70: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
9a80: 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29  ( p->nOffset>0 )
9a90: 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  {.    int iMem =
9aa0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
9ab0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
9ac0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
9ad0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
9ae0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b00: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9b10: 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30  , -p->nOffset, 0
9b20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9b30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
9b40: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
9b50: 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  ;.    p->iOffset
9b60: 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a   = iMem;.  }.}..
9b70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
9b80: 44 42 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  DBE instructions
9b90: 20 74 68 61 74 20 77 69 6c 6c 20 6f 70 65 6e 20   that will open 
9ba0: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
9bb0: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
9bc0: 65 20 75 73 65 64 20 66 6f 72 20 61 6e 20 69 6e  e used for an in
9bd0: 64 65 78 20 6f 72 20 74 6f 20 73 74 6f 72 65 20  dex or to store 
9be0: 6b 65 79 65 64 20 72 65 73 75 6c 74 73 20 66 6f  keyed results fo
9bf0: 72 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  r a compound.** 
9c00: 73 65 6c 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  select.  In othe
9c10: 72 20 77 6f 72 64 73 2c 20 6f 70 65 6e 20 61 20  r words, open a 
9c20: 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
9c30: 74 68 61 74 20 6e 65 65 64 73 20 61 0a 2a 2a 20  that needs a.** 
9c40: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9c50: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
9c60: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9c70: 20 4b 65 79 49 6e 66 6f 20 69 73 20 64 65 74 65   KeyInfo is dete
9c80: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
9c90: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9ca0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9cb0: 65 6e 74 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ent in the secon
9cc0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
9cd0: 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  * Specifically, 
9ce0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9cf0: 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61  called to open a
9d00: 6e 20 69 6e 64 65 78 20 74 61 62 6c 65 20 66 6f  n index table fo
9d10: 72 0a 2a 2a 20 44 49 53 54 49 4e 43 54 2c 20 55  r.** DISTINCT, U
9d20: 4e 49 4f 4e 2c 20 49 4e 54 45 52 53 45 43 54 20  NION, INTERSECT 
9d30: 61 6e 64 20 45 58 43 45 50 54 20 73 65 6c 65 63  and EXCEPT selec
9d40: 74 20 73 74 61 74 65 6d 65 6e 74 73 20 28 62 75  t statements (bu
9d50: 74 20 6e 6f 74 20 0a 2a 2a 20 55 4e 49 4f 4e 20  t not .** UNION 
9d60: 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65  ALL)..**.** Make
9d70: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
9d80: 20 4b 65 79 41 73 44 61 74 61 20 74 61 62 6c 65   KeyAsData table
9d90: 20 69 66 20 6b 65 79 41 73 44 61 74 61 20 69 73   if keyAsData is
9da0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   true..**.** The
9db0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9dc0: 69 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  is the address o
9dd0: 66 20 74 68 65 20 4f 50 5f 4f 70 65 6e 54 65 6d  f the OP_OpenTem
9de0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  p instruction..*
9df0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
9e00: 6e 54 65 6d 70 49 6e 64 65 78 28 50 61 72 73 65  nTempIndex(Parse
9e10: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9e20: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 69   *p, int iTab, i
9e30: 6e 74 20 6b 65 79 41 73 44 61 74 61 29 7b 0a 20  nt keyAsData){. 
9e40: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
9e50: 66 6f 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  fo;.  int nColum
9e60: 6e 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  n;.  sqlite *db 
9e70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9e80: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76  int i;.  Vdbe *v
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9ea0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
9eb0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
9ec0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29  nList(pParse, p)
9ed0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9ee0: 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ;.  }.  nColumn 
9ef0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
9f00: 70 72 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  pr;.  pKeyInfo =
9f10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
9f20: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
9f30: 2b 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28  +nColumn*sizeof(
9f40: 43 6f 6c 6c 53 65 71 2a 29 20 29 3b 0a 20 20 69  CollSeq*) );.  i
9f50: 66 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  f( pKeyInfo==0 )
9f60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4b 65   return 0;.  pKe
9f70: 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61  yInfo->enc = pPa
9f80: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
9f90: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
9fa0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f   = nColumn;.  fo
9fb0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
9fc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79  ; i++){.    pKey
9fd0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
9fe0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
9ff0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
a000: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
a010: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  r);.    if( !pKe
a020: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
a030: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
a040: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62  o->aColl[i] = db
a050: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
a060: 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20   }.  }.  addr = 
a070: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a080: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
a090: 54 61 62 2c 20 30 2c 20 0a 20 20 20 20 20 20 28  Tab, 0, .      (
a0a0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
a0b0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
a0c0: 46 46 29 3b 0a 20 20 69 66 28 20 6b 65 79 41 73  FF);.  if( keyAs
a0d0: 44 61 74 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  Data ){.    sqli
a0e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a0f0: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 69 54  OP_KeyAsData, iT
a100: 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  ab, 1);.  }.  re
a110: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 73 74  turn addr;.}..st
a120: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
a130: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
a140: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
a150: 61 64 64 72 2c 20 49 64 4c 69 73 74 20 2a 2a 70  addr, IdList **p
a160: 70 4f 70 65 6e 54 65 6d 70 29 7b 0a 20 20 69 66  pOpenTemp){.  if
a170: 28 20 21 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  ( !p->ppOpenTemp
a180: 20 29 7b 0a 20 20 20 20 2a 70 70 4f 70 65 6e 54   ){.    *ppOpenT
a190: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  emp = sqlite3IdL
a1a0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 29 3b  istAppend(0, 0);
a1b0: 0a 20 20 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65  .    p->ppOpenTe
a1c0: 6d 70 20 3d 20 70 70 4f 70 65 6e 54 65 6d 70 3b  mp = ppOpenTemp;
a1d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
a1e0: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73  ->ppOpenTemp = s
a1f0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
a200: 6e 64 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  nd(*p->ppOpenTem
a210: 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  p, 0);.  }.  if(
a220: 20 21 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d   !(*p->ppOpenTem
a230: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
a240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a250: 20 7d 0a 20 20 28 2a 70 2d 3e 70 70 4f 70 65 6e   }.  (*p->ppOpen
a260: 54 65 6d 70 29 2d 3e 61 5b 28 2a 70 2d 3e 70 70  Temp)->a[(*p->pp
a270: 4f 70 65 6e 54 65 6d 70 29 2d 3e 6e 49 64 2d 31  OpenTemp)->nId-1
a280: 5d 2e 69 64 78 20 3d 20 61 64 64 72 3b 0a 20 20  ].idx = addr;.  
a290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a2a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ;.}..static Coll
a2b0: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
a2c0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
a2d0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
a2e0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
a2f0: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 20 3d 20 30  ollSeq *pRet = 0
a300: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
a310: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
a320: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
a330: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
a340: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
a350: 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 7b 0a  .  if( !pRet ){.
a360: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
a370: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
a380: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
a390: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
a3a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
a3b0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  et;.}../*.** Thi
a3c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a3d0: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
a3e0: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
a3f0: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
a400: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
a410: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
a420: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
a430: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
a440: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
a450: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
a460: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
a470: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
a480: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
a490: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
a4a0: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
a4b0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
a4c0: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
a4d0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
a4e0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
a4f0: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
a500: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
a510: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
a520: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
a530: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
a540: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
a550: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
a560: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
a570: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
a580: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
a590: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
a5a0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
a5b0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
a5c0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
a5d0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
a5e0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
a5f0: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
a600: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
a610: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
a620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
a630: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
a640: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
a650: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
a660: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
a680: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a690: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
a6a0: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
a6b0: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
a6c0: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
a6d0: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
a6e0: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
a6f0: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
a700: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a710: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
a720: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
a730: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
a740: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
a750: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
a760: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
a770: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
a780: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
a790: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
a7a0: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
a7b0: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
a7c0: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
a7d0: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
a7e0: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
a7f0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
a800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
a810: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
a820: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53  se *pParse, .  S
a830: 65 6c 65 63 74 20 2a 70 2c 20 0a 20 20 69 6e 74  elect *p, .  int
a840: 20 65 44 65 73 74 2c 20 0a 20 20 69 6e 74 20 69   eDest, .  int i
a850: 50 61 72 6d 2c 20 0a 20 20 63 68 61 72 20 2a 61  Parm, .  char *a
a860: 66 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ff           /* 
a870: 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
a880: 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
a890: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
a8a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a8b0: 54 45 5f 4f 4b 3b 20 20 2f 2a 20 53 75 63 63 65  TE_OK;  /* Succe
a8c0: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
a8d0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
a8e0: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
a8f0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
a900: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
a910: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
a920: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
a930: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
a940: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
a950: 44 42 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  DBE */.  IdList 
a960: 2a 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a  *pOpenTemp = 0;.
a970: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a980: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
a990: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
a9a0: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
a9b0: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
a9c0: 2a 20 74 68 65 20 6c 61 73 74 20 53 45 4c 45 43  * the last SELEC
a9d0: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
a9e0: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
a9f0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
aa00: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
aa10: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
aa20: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
aa30: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
aa40: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
aa50: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
aa60: 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  r;.  if( pPrior-
aa70: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
aa80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
aa90: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
aaa0: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
aab0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
aac0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
aad0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
aae0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
aaf0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
ab00: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ab10: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
ab20: 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72  nLimit>=0 || pPr
ab30: 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29  ior->nOffset>0 )
ab40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ab50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
ab60: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
ab70: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
ab80: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
ab90: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
aba0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
abb0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
abc0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
abd0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
abe0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
abf0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
ac00: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
ac10: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
ac20: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
ac30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ac40: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
ac50: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ac60: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ac70: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
ac80: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
ac90: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
aca0: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
acb0: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
acc0: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
acd0: 6c 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  le ){.    assert
ace0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
acf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ad00: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
ad10: 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
ad20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ad30: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
ad40: 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
ad50: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ad60: 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53  );.    eDest = S
ad70: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
ad80: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
ad90: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
ada0: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
adb0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
adc0: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
add0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
ade0: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
adf0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
ae00: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  ){.        pPrio
ae10: 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e  r->nLimit = p->n
ae20: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
ae30: 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d  Prior->nOffset =
ae40: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
ae50: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f       pPrior->ppO
ae60: 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70 4f  penTemp = p->ppO
ae70: 70 65 6e 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  penTemp;.       
ae80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
ae90: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
aea0: 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  or, eDest, iParm
aeb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
aec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
aed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
aee0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
aef0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
af00: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
af10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
af20: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
af30: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
af40: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
af50: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
af60: 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74         p->nLimit
af70: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70   = -1;.        p
af80: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
af90: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
afa0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
afb0: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
afc0: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  m, 0, 0, 0, aff)
afd0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
afe0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
aff0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
b000: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
b010: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b040: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55  }.      /* For U
b050: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
b060: 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75  ER BY fall throu
b070: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
b080: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
b090: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
b0a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
b0b0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
b0c0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
b0d0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
b0e0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
b0f0: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
b100: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
b110: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   op;          /*
b120: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
b130: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
b140: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
b150: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
b160: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
b170: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
b180: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
b190: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
b1a0: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
b1b0: 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
b1c0: 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
b1d0: 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
b1e0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
b1f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f  st *pOrderBy;  /
b200: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
b210: 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 72 69  lause for the ri
b220: 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  ght SELECT */.  
b230: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
b240: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70       priorOp = p
b250: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53  ->op==TK_ALL ? S
b260: 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55  RT_Table : SRT_U
b270: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
b280: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
b290: 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  & p->pOrderBy==0
b2a0: 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20   && p->nLimit<0 
b2b0: 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30  && p->nOffset==0
b2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
b2d0: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
b2e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
b2f0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
b300: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
b310: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
b320: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b330: 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d  unionTab = iParm
b340: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b350: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
b360: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
b370: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
b380: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
b390: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
b3a0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
b3b0: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
b3c0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
b3d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
b3e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
b3f0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20  p->pOrderBy .   
b400: 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64       && matchOrd
b410: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
b420: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
b430: 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31  rBy, unionTab, 1
b440: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
b450: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
b460: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b470: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
b480: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  }.        addr =
b490: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4a0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
b4b0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
b4c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
b4d0: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
b4e0: 20 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74         rc = mult
b4f0: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
b500: 64 64 72 28 70 2c 20 61 64 64 72 2c 20 26 70 4f  ddr(p, addr, &pO
b510: 70 65 6e 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  penTemp);.      
b520: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b530: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b540: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
b550: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b580: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
b590: 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  ta, unionTab, 1)
b5a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b5b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
b5c0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
b5d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
b5e0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
b5f0: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
b600: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
b610: 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54   pPrior->ppOpenT
b620: 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54  emp = p->ppOpenT
b630: 65 6d 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  emp;.      rc = 
b640: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
b650: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72  arse, pPrior, pr
b660: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  iorOp, unionTab,
b670: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
b680: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
b690: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
b6a0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b6c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   p->op==TK_ALL )
b6d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b6e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b6f0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
b700: 75 6e 69 6f 6e 54 61 62 2c 20 70 50 72 69 6f 72  unionTab, pPrior
b710: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
b720: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b730: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
b740: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
b750: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
b760: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
b770: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
b780: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
b790: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
b7a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b7b0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
b7c0: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
b7d0: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
b7e0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
b7f0: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
b800: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
b810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b820: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
b830: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
b840: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
b850: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
b860: 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74   0;.      nLimit
b870: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
b880: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b890: 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65  -1;.      nOffse
b8a0: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
b8b0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b8c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
b8d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
b8e0: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
b8f0: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
b900: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
b910: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
b920: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
b930: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
b940: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
b950: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
b960: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
b970: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
b980: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
b990: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b9a0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
b9b0: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
b9c0: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
b9d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
b9e0: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
b9f0: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
ba00: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
ba10: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
ba20: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
ba30: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
ba40: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50   || unionTab!=iP
ba50: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
ba60: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
ba70: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
ba80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ba90: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
baa0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
bab0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
bac0: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
bad0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
bae0: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
baf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb00: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
bb10: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
bb20: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
bb30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bb40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bb50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bb60: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
bb70: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
bb80: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  eak);.        co
bb90: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
bba0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ers(pParse, p);.
bbb0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
bbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
bbd0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
bbe0: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
bbf0: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
bc00: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
bc10: 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
bc20: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
bc50: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
bc60: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
bc90: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ak, 0);.        
bca0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
bcb0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bcc0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
bcd0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
bce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
bcf0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
bd00: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
bd10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bd20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bd30: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
bd40: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
bd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bd60: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
bd70: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
bd80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bd90: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
bda0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
bdb0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
bdc0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
bdd0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
bde0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
bdf0: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
be00: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
be10: 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
be20: 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a  Limit, nOffset;.
be30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
be40: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
be50: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
be60: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
be70: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
be80: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
be90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
bea0: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
beb0: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
bec0: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
bed0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
bee0: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
bef0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
bf00: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
bf10: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
bf20: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
bf30: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
bf40: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
bf50: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
bf60: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
bf70: 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  ->pOrderBy,tab1,
bf80: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
bf90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
bfa0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
bfb0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
bfc0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
bfd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bfe0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31  P_OpenTemp, tab1
bff0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
c000: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
c010: 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72  TempAddr(p, addr
c020: 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20  , &pOpenTemp);. 
c030: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c040: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c050: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c060: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
c070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
c090: 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31  yAsData, tab1, 1
c0a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c0b0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
c0c0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
c0d0: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
c0e0: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
c0f0: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
c100: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c110: 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54   pPrior->ppOpenT
c120: 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54  emp = p->ppOpenT
c130: 65 6d 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  emp;.      rc = 
c140: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c150: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52  arse, pPrior, SR
c160: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30  T_Union, tab1, 0
c170: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
c180: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c190: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c1a0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c1b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c1c0: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
c1d0: 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
c1e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
c1f0: 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
c200: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c220: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20  OpenTemp, tab2, 
c230: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  0);.      rc = m
c240: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65  ultiSelectOpenTe
c250: 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 2c 20  mpAddr(p, addr, 
c260: 26 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 20  &pOpenTemp);.   
c270: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c280: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c290: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c2a0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
c2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
c2d0: 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b  sData, tab2, 1);
c2e0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
c2f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d   = 0;.      nLim
c300: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
c310: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
c320: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66  = -1;.      nOff
c330: 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74  set = p->nOffset
c340: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73  ;.      p->nOffs
c350: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
c360: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c370: 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f  (pParse, p, SRT_
c380: 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20  Union, tab2, 0, 
c390: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
c3a0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
c3b0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
c3c0: 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a  Limit = nLimit;.
c3d0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
c3e0: 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20   = nOffset;.    
c3f0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c400: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c410: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c420: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
c430: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
c440: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
c450: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
c460: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
c470: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
c480: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
c490: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
c4a0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
c4b0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
c4c0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
c4d0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
c4e0: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
c4f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c500: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
c510: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
c520: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
c530: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c540: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
c550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c560: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
c570: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
c580: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
c590: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
c5a0: 20 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72   p);.      iStar
c5b0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
c5c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b  ddOp(v, OP_FullK
c5d0: 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ey, tab1, 0);.  
c5e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c5f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
c600: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
c610: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
c620: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
c630: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
c640: 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c  st, tab1, p->pEL
c650: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
c680: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
c690: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
c6c0: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
c6d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c6e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
c6f0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c700: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c720: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c730: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
c740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c750: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
c760: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
c770: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c780: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
c790: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
c7a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c7b0: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
c7c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c7d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7e0: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
c7f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c800: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
c810: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
c820: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
c830: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
c840: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
c850: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
c860: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c870: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
c880: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
c890: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
c8a0: 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
c8b0: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
c8c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
c8d0: 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
c8e0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
c8f0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
c900: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c910: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
c920: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
c930: 7c 7c 20 28 70 4f 70 65 6e 54 65 6d 70 20 26 26  || (pOpenTemp &&
c940: 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e   pOpenTemp->nId>
c950: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  0) ){.    int nC
c960: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
c970: 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  nExpr;.    int i
c980: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
c990: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
c9a0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  Malloc(sizeof(*p
c9b0: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 73 69  KeyInfo)+nCol*si
c9c0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b  zeof(CollSeq*));
c9d0: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
c9e0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
c9f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ca00: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ca10: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ca20: 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  }..    pKeyInfo-
ca30: 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64  >enc = pParse->d
ca40: 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79  b->enc;.    pKey
ca50: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
ca60: 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  Col;..    for(i=
ca70: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ca80: 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  .      pKeyInfo-
ca90: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
caa0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
cab0: 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
cac0: 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
cad0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
cae0: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
caf0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72  >aColl[i] = pPar
cb00: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
cb10: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
cb20: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70  ..    for(i=0; p
cb30: 4f 70 65 6e 54 65 6d 70 20 26 26 20 69 3c 70 4f  OpenTemp && i<pO
cb40: 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b 20 69 2b  penTemp->nId; i+
cb50: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 33  +){.      int p3
cb60: 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f 50 33 5f  type = (i==0?P3_
cb70: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
cb80: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
cb90: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4f     int addr = pO
cba0: 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d 2e 69 64  penTemp->a[i].id
cbb0: 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
cbc0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
cbd0: 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29 70 4b  addr, (char *)pK
cbe0: 65 79 49 6e 66 6f 2c 20 70 33 74 79 70 65 29 3b  eyInfo, p3type);
cbf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
cc00: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
cc10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cc20: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
cc30: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
cc40: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
cc50: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
cc60: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
cc70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
cc80: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ->pOrderBy->a[i]
cc90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
cca0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
ccb0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
ccc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e  pExpr->iColumn<n
ccd0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  Col );.        a
cce0: 73 73 65 72 74 28 20 21 70 45 78 70 72 2d 3e 70  ssert( !pExpr->p
ccf0: 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Coll );.        
cd00: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
cd10: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
cd20: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
cd30: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
cd40: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  e, zName, -1);. 
cd50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cd60: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
cd70: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
cd80: 3e 61 43 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43  >aColl[pExpr->iC
cd90: 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20  olumn];.        
cda0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
cdb0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
cdc0: 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
cdd0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
cde0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
cdf0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
ce00: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
ce10: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
ce20: 6e 73 20 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  ns for UNION ALL
ce30: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f   ... ORDER BY */
ce40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
ce50: 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  e(pKeyInfo);.   
ce60: 20 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65   }.  }..multi_se
ce70: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20  lect_end:.  if( 
ce80: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
ce90: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
cea0: 6c 65 74 65 28 70 4f 70 65 6e 54 65 6d 70 29 3b  lete(pOpenTemp);
ceb0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e  .  }.  p->ppOpen
cec0: 54 65 6d 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  Temp = 0;.  retu
ced0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cee0: 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
cef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
cf00: 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
cf10: 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
cf20: 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
cf30: 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
cf40: 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
cf50: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
cf60: 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
cf70: 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
cf80: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
cf90: 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
cfa0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
cfb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cfc0: 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
cfd0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
cfe0: 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
cff0: 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
d000: 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
d010: 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
d020: 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
d030: 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
d040: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
d050: 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
d060: 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
d070: 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
d080: 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
d090: 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
d0a0: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
d0b0: 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
d0c0: 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
d0d0: 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
d0e0: 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
d0f0: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
d100: 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
d110: 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
d120: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
d130: 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
d140: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
d150: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c  rList(ExprList*,
d160: 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20  int,ExprList*); 
d170: 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
d180: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
d190: 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a  substExpr(Expr *
d1a0: 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c  pExpr, int iTabl
d1b0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
d1c0: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ist){.  if( pExp
d1d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
d1e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
d1f0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
d200: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
d210: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
d220: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
d230: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
d240: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
d250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
d260: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
d270: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
d280: 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
d290: 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
d2a0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
d2b0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
d2c0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
d2d0: 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
d2e0: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
d2f0: 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
d300: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
d310: 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
d320: 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
d330: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
d340: 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
d350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d360: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
d370: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
d380: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
d390: 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74  rDup(pNew->pLeft
d3a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d3b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
d3c0: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
d3d0: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
d3e0: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
d3f0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
d400: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
d410: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
d420: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73  pExpr->pList = s
d430: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
d440: 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  p(pNew->pList);.
d450: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
d460: 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
d470: 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
d480: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
d490: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
d4a0: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
d4b0: 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
d4c0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
d4d0: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
d4e0: 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
d4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
d500: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70  nCopy(&pExpr->sp
d510: 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29  an, &pNew->span)
d520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
d530: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
d540: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
d550: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
d560: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
d570: 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
d580: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
d590: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
d5a0: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
d5b0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
d5c0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a  .}.static void .
d5d0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
d5e0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
d5f0: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
d600: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
d610: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
d620: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
d630: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d640: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d650: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
d660: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d670: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
d680: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
d6a0: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
d6b0: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
d6c0: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
d6d0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
d6e0: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
d6f0: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
d700: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
d710: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
d720: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
d730: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
d740: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
d750: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
d760: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
d770: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
d780: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
d790: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
d7a0: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
d7b0: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
d7c0: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
d7d0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
d7e0: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
d7f0: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
d800: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
d810: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
d820: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
d830: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
d840: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
d850: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
d860: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
d870: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
d880: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
d890: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
d8a0: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
d8b0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
d8c0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
d8d0: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
d8e0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
d8f0: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
d900: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
d910: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
d920: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
d930: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
d940: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
d950: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
d960: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
d970: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
d980: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
d990: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
d9a0: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
d9b0: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
d9c0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
d9d0: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
d9e0: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
d9f0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
da00: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
da10: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
da20: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
da30: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
da40: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
da50: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
da60: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
da70: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
da80: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
da90: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
daa0: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
dab0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
dac0: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
dad0: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
dae0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
daf0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
db00: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
db10: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
db20: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
db30: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
db40: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
db50: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
db60: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
db70: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
db80: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
db90: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
dba0: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
dbb0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
dbc0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
dbd0: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
dbe0: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
dbf0: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
dc00: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
dc10: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
dc20: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
dc30: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
dc40: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
dc50: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
dc60: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
dc70: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
dc80: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
dc90: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
dca0: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
dcb0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
dcc0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
dcd0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
dce0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
dcf0: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
dd00: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
dd10: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
dd20: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
dd30: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
dd40: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
dd50: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
dd60: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
dd70: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
dd80: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
dd90: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
dda0: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
ddb0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
ddc0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
ddd0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
dde0: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
ddf0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
de00: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
de10: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
de20: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
de30: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
de40: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
de50: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
de60: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
de70: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
de80: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
de90: 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
dea0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
deb0: 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
dec0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
ded0: 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
dee0: 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
def0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
df00: 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
df10: 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
df20: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
df30: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
df40: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
df50: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
df60: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
df70: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
df80: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
df90: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
dfa0: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
dfb0: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
dfc0: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
dfd0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
dfe0: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
dff0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
e000: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
e010: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
e020: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
e030: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
e040: 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
e050: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
e060: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
e070: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
e080: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
e090: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
e0a0: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
e0b0: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
e0c0: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
e0d0: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
e0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
e0f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e100: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
e110: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e120: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
e130: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e140: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
e150: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e160: 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
e170: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e180: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
e190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e1a0: 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
e1b0: 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
e1c0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
e1d0: 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
e1e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
e1f0: 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
e200: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
e210: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
e220: 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
e230: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
e240: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
e250: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
e260: 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
e270: 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
e280: 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
e290: 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
e2a0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
e2b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
e2c0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
e2d0: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
e2e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
e2f0: 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
e300: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
e310: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
e320: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
e330: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
e340: 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
e350: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
e360: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
e370: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
e380: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
e390: 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
e3a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
e3b0: 69 3b 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  i;.  Expr *pWher
e3c0: 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
e3d0: 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
e3e0: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
e3f0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
e400: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
e410: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
e420: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
e430: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
e440: 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
e450: 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
e460: 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72   );.  pSub = pSr
e470: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c  c->a[iFrom].pSel
e480: 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
e490: 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
e4a0: 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
e4b0: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
e4c0: 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  0;.  if( subquer
e4d0: 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
e4e0: 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
e4f0: 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  0;.  pSubSrc = p
e500: 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
e510: 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
e520: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
e530: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
e540: 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  0;.  if( (pSub->
e550: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
e560: 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26  ub->nLimit>=0) &
e570: 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  &  (pSrc->nSrc>1
e580: 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
e590: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e5a0: 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73  .  if( (p->isDis
e5b0: 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d  tinct || p->nLim
e5c0: 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65  it>=0) && subque
e5d0: 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
e5e0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   0;.  if( p->pOr
e5f0: 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
e600: 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
e610: 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69   0;..  /* Restri
e620: 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
e630: 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
e640: 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
e650: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
e660: 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
e670: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
e680: 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
e690: 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
e6a0: 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
e6b0: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
e6c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
e6d0: 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
e6e0: 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
e6f0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
e700: 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
e710: 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
e720: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
e730: 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
e740: 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
e750: 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
e760: 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
e770: 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
e780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
e790: 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
e7a0: 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
e7b0: 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
e7c0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
e7d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
e7e0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
e7f0: 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
e800: 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
e810: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
e820: 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
e830: 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
e840: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
e850: 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
e860: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
e870: 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
e880: 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
e890: 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
e8a0: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
e8b0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
e8c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
e8d0: 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
e8e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
e8f0: 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
e900: 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
e910: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
e920: 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
e930: 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
e940: 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
e950: 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
e960: 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
e970: 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
e980: 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
e990: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
e9a0: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
e9b0: 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
e9c0: 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
e9d0: 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20  /.  if( iFrom>0 
e9e0: 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
e9f0: 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
ea00: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
ea10: 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68      && pSub->pWh
ea20: 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ere!=0 ){.    re
ea30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
ea40: 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
ea50: 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
ea60: 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  ns flattening is
ea70: 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74   permitted for t
ea80: 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68  he.  ** iFrom-th
ea90: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
eaa0: 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
eab0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
eac0: 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c  */..  /* Move al
ead0: 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
eae0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
eaf0: 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
eb00: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
eb10: 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
eb20: 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
eb30: 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
eb40: 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
eb50: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
eb60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
eb70: 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
eb80: 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
eb90: 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
eba0: 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
ebb0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
ebc0: 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
ebd0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
ebe0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
ebf0: 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
ec00: 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
ec10: 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
ec20: 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
ec30: 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
ec40: 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
ec50: 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
ec60: 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
ec70: 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
ec80: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72   in..  */.  iPar
ec90: 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  ent = pSrc->a[iF
eca0: 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
ecb0: 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
ecc0: 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
ecd0: 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74  c;.    int joint
ece0: 79 70 65 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  ype = pSrc->a[iF
ecf0: 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a  rom].jointype;..
ed00: 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
ed10: 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70  iFrom].pTab && p
ed20: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
ed30: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
ed40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ed50: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
ed60: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
ed70: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
ed80: 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e  qliteFree(pSrc->
ed90: 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61  a[iFrom].zDataba
eda0: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
edb0: 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  ree(pSrc->a[iFro
edc0: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m].zName);.    s
edd0: 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e  qliteFree(pSrc->
ede0: 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29  a[iFrom].zAlias)
edf0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  ;.    if( nSubSr
ee00: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  c>1 ){.      int
ee10: 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63   extra = nSubSrc
ee20: 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   - 1;.      for(
ee30: 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=1; i<nSubSrc; 
ee40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
ee50: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
ee60: 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20  istAppend(pSrc, 
ee70: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
ee80: 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70       p->pSrc = p
ee90: 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
eea0: 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
eeb0: 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69  -extra>=iFrom; i
eec0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  --){.        pSr
eed0: 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e  c->a[i] = pSrc->
eee0: 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20  a[i-extra];.    
eef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
ef00: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
ef10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; i++){.      pS
ef20: 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
ef30: 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
ef40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
ef50: 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
ef60: 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
ef70: 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
ef80: 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b    pSrc->a[iFrom+
ef90: 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  nSubSrc-1].joint
efa0: 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
efb0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65    }..  /* Now be
efc0: 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
efd0: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
efe0: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
eff0: 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72   for .  ** refer
f000: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
f010: 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
f020: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20  r query..  ** . 
f030: 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
f040: 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20  *.  **   SELECT 
f050: 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
f060: 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
f070: 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
f080: 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
f090: 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
f0b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
f0c0: 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
f0d0: 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20           /.  ** 
f0e0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
f0f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
f100: 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
f110: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f120: 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ____/.  **.  ** 
f130: 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
f140: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
f150: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
f160: 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
f170: 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77  e see.  ** "a" w
f180: 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
f190: 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
f1a0: 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
f1b0: 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
f1c0: 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74  0"..  */.  subst
f1d0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
f1e0: 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
f1f0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c  b->pEList);.  pL
f200: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
f210: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
f220: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
f230: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
f240: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
f250: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
f260: 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
f270: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
f280: 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
f290: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
f2a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
f2b0: 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e  NDup(pExpr->span
f2c0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
f2d0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
f2e0: 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
f2f0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f300: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
f310: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
f320: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
f330: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
f340: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
f350: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
f360: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
f370: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
f380: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
f390: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
f3a0: 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
f3b0: 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
f3c0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
f3d0: 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
f3e0: 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
f3f0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
f400: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
f410: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
f420: 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
f430: 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
f440: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
f450: 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
f460: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
f470: 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
f480: 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
f490: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
f4a0: 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
f4b0: 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
f4c0: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
f4d0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
f4e0: 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
f4f0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
f500: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
f510: 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
f520: 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b  pSub->pHaving ){
f530: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61  .      Expr *pHa
f540: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
f550: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76  prDup(pSub->pHav
f560: 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
f570: 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
f580: 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67        p->pHaving
f590: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
f5a0: 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e  K_AND, p->pHavin
f5b0: 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a  g, pHaving, 0);.
f5c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f5d0: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
f5e0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20  = pHaving;.     
f5f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
f600: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
f610: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
f620: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
f630: 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
f640: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
f650: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
f660: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
f670: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
f680: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
f690: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
f6a0: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
f6b0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
f6c0: 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20  f( pWhere ){.   
f6d0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
f6e0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e  qlite3Expr(TK_AN
f6f0: 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  D, p->pWhere, pW
f700: 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  here, 0);.    }.
f710: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c    }..  /* The fl
f720: 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
f730: 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
f740: 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
f750: 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20   the.  ** outer 
f760: 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
f770: 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73  t. .  */.  p->is
f780: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
f790: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
f7a0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
f7b0: 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
f7c0: 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
f7d0: 6e 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  n from the subqu
f7e0: 65 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ery to the outer
f7f0: 0a 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a  .  ** query..  *
f800: 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c  /.  if( pSub->nL
f810: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
f820: 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29  f( p->nLimit<0 )
f830: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
f840: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
f850: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f860: 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66  p->nLimit+p->nOf
f870: 66 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69  fset > pSub->nLi
f880: 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65  mit+pSub->nOffse
f890: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  t ){.      p->nL
f8a0: 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69  imit = pSub->nLi
f8b0: 6d 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66  mit + pSub->nOff
f8c0: 73 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74  set - p->nOffset
f8d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
f8e0: 3e 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62  >nOffset += pSub
f8f0: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  ->nOffset;..  /*
f900: 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
f910: 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
f920: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
f930: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
f940: 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
f950: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
f960: 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
f970: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
f980: 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
f990: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
f9a0: 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75  ed in as an argu
f9b0: 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
f9c0: 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65  t.** is a simple
f9d0: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
f9e0: 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73  query.  If it is
f9f0: 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20   and this query 
fa00: 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66  can be.** satisf
fa10: 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ied using a sing
fa20: 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62  le seek to the b
fa30: 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20  eginning or end 
fa40: 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  of an index,.** 
fa50: 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68  then generate th
fa60: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  e code for this 
fa70: 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72  SELECT and retur
fa80: 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73  n 1.  If this is
fa90: 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c   not a .** simpl
faa0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
fab0: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74   query, then ret
fac0: 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73  urn 0;.**.** A s
fad0: 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d  imply min() or m
fae0: 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73  ax() query looks
faf0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
fb00: 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  *    SELECT min(
fb10: 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
fb20: 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  *    SELECT max(
fb30: 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
fb40: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d  *.** The query m
fb50: 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ay have only a s
fb60: 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69  ingle table in i
fb70: 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74  ts FROM argument
fb80: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20  .  There.** can 
fb90: 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f  be no GROUP BY o
fba0: 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52  r HAVING or WHER
fbb0: 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  E clauses.  The 
fbc0: 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a  result set must.
fbd0: 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20  ** be the min() 
fbe0: 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69  or max() of a si
fbf0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ngle column of t
fc00: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
fc10: 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  olumn.** in the 
fc20: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
fc30: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
fc40: 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  indexed..**.** T
fc50: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
fc60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72   this routine ar
fc70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f  e the same as fo
fc80: 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
fc90: 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65  )..** See the he
fca0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
fcb0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
fcc0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
fcd0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
fce0: 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e  ic int simpleMin
fcf0: 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
fd00: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
fd10: 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e  p, int eDest, in
fd20: 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72  t iParm){.  Expr
fd30: 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69   *pExpr;.  int i
fd40: 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Col;.  Table *pT
fd50: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
fd60: 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  x;.  int base;. 
fd70: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
fd80: 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f  seekOp;.  int co
fd90: 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  nt;.  ExprList *
fda0: 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20  pEList, *pList, 
fdb0: 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  eList;.  struct 
fdc0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c  ExprList_item eL
fdd0: 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69  istItem;.  SrcLi
fde0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20  st *pSrc;.  ..  
fdf0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
fe00: 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
fe10: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
fe20: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
fe30: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
fe40: 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
fe50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
fe60: 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
fe70: 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
fe80: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
fe90: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
fea0: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
feb0: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
fec0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
fed0: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
fee0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
fef0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
ff00: 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
ff10: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
ff20: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
ff30: 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
ff40: 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
ff50: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
ff60: 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
ff70: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
ff80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ff90: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
ffa0: 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
ffb0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
ffc0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
ffd0: 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
ffe0: 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
fff0: 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
10000 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
10010 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
10020 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
10030 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
10040 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c  = OP_Last;.  }el
10050 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
10060 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  ;.  }.  pExpr = 
10070 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
10080 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
10090 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
100a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
100b0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
100c0 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  n;.  pTab = pSrc
100d0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
100e0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
100f0 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
10100 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
10110 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
10120 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
10130 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
10140 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
10150 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
10160 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
10170 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
10180 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
10190 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
101a0 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
101b0 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
101c0 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
101d0 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
101e0 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
101f0 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
10200 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
10210 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
10220 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
10230 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
10240 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
10250 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10260 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10270 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f  , pExpr);.    fo
10280 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
10290 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
102a0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
102b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
102c0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
102d0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
102e0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
102f0 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e  l && pIdx->keyIn
10300 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f  fo.aColl[0]==pCo
10310 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
10320 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
10330 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10340 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
10350 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
10360 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
10370 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
10380 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
10390 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
103a0 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
103b0 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
103c0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
103d0 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** The column n
103e0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
103f0 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
10400 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   in the calling 
10410 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
10420 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10430 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10440 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10450 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
10460 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
10470 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
10480 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
10490 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
104a0 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
104b0 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
104c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
104d0 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
104e0 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
104f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10500 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
10510 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
10520 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
10530 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f  nerating code to
10540 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72   find the min or
10550 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63   the max.  Basic
10560 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65  ally all we have
10570 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66  .  ** to do is f
10580 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72  ind the first or
10590 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
105a0 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e  in the chosen in
105b0 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68  dex.  If.  ** th
105c0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
105d0 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47   is on the INTEG
105e0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
105f0 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69  then find the fi
10600 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74  rst.  ** or last
10610 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61   entry in the ma
10620 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  in table..  */. 
10630 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
10640 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
10650 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62   pTab->iDb);.  b
10660 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  ase = pSrc->a[0]
10670 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70  .iCursor;.  comp
10680 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10690 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
106a0 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
106b0 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
106c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
106d0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
106e0 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
106f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10700 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
10710 65 61 64 2c 20 62 61 73 65 2c 20 70 54 61 62 2d  ead, base, pTab-
10720 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >tnum);.    sqli
10730 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10740 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10750 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 6e 43  , base, pTab->nC
10760 6f 6c 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20  ol);.  }.  cont 
10770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10780 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
10790 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
107a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
107b0 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
107c0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
107d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
107e0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
107f0 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
10800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10810 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
10820 65 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  ead, base+1, pId
10830 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20  x->tnum,.       
10840 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
10850 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66  r*)&pIdx->keyInf
10860 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
10870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10880 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
10890 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
108a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108b0 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c  (v, OP_IdxRecno,
108c0 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
108d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
108e0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62  p(v, OP_Close, b
108f0 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  ase+1, 0);.    s
10900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10910 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61  v, OP_MoveGe, ba
10920 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c  se, 0);.  }.  eL
10930 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20  ist.nExpr = 1;. 
10940 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74   memset(&eListIt
10950 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c  em, 0, sizeof(eL
10960 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69  istItem));.  eLi
10970 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65  st.a = &eListIte
10980 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e  m;.  eList.a[0].
10990 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
109a0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
109b0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69  (pParse, p, &eLi
109c0 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  st, 0, 0, 0, -1,
109d0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63   eDest, iParm, c
109e0 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20  ont, cont, 0);. 
109f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10a00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
10a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10a20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
10a30 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a  e, base, 0);.  .
10a40 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
10a50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
10a60 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
10a70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10a80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
10a90 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
10aa0 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
10ab0 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
10ac0 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
10ad0 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
10ae0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
10af0 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
10b00 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
10b50 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
10b60 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
10b70 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
10b80 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
10b90 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
10ba0 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
10bb0 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
10bc0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
10bd0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
10be0 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
10bf0 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
10c00 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d  s of table iParm
10c10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
10c20 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
10c30 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
10c40 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
10c50 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
10c60 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
10c70 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
10c80 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
10c90 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
10ca0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
10cb0 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
10cc0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
10cd0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
10ce0 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
10cf0 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73  e table above is
10d00 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64   incomplete.  Ad
10d10 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76  ditional eDist v
10d20 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64  alue have be add
10d30 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73  ed.** since this
10d40 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69   comment was wri
10d50 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73  tten.  See the s
10d60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
10d70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a   function for.**
10d80 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74   a complete list
10d90 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77  ing of the allow
10da0 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
10db0 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
10dc0 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
10dd0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
10de0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10df0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
10e00 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
10e10 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
10e20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
10e30 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
10e40 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
10e50 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
10e60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
10e70 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
10e80 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
10e90 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
10ea0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
10eb0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
10ec0 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
10ed0 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
10ee0 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
10ef0 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
10f00 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
10f10 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
10f20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
10f30 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
10f40 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
10f50 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
10f60 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
10f70 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
10f80 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
10f90 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
10fa0 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
10fb0 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
10fc0 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
10fd0 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
10fe0 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
10ff0 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
11000 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
11010 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
11020 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
11030 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
11040 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
11050 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
11060 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
11070 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
11080 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
11090 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
110a0 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
110b0 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
110c0 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
110d0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
110e0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
110f0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
11100 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
11140 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
11150 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
11160 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
11170 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
11180 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11190 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
111a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
111b0 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
111c0 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
111d0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
111e0 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
111f0 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
11200 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
11210 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
11220 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
11230 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
11240 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
11250 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
11260 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
11270 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
11280 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
11290 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
112a0 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
112b0 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
112c0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
112d0 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
112e0 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
112f0 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
11300 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
11310 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
11320 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
11330 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11340 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
11350 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
11360 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11380 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
11390 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
113a0 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  . */.  int eDest
113b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
113c0 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
113d0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
113e0 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
113f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11400 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62  parameter used b
11410 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70  y the eDest disp
11420 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
11430 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
11440 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ,       /* Anoth
11450 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68  er SELECT for wh
11460 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75  ich this is a su
11470 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  b-query */.  int
11480 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20   parentTab,     
11490 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
114a0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66  pParent->pSrc of
114b0 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
114c0 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67   int *pParentAgg
114d0 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
114e0 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20  if pParent uses 
114f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
11500 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ons */.  char *a
11510 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
11520 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
11530 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
11540 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
11550 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  .){.  int i;.  W
11560 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
11570 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
11580 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20  nt isAgg = 0;   
11590 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
115a0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
115b0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
115c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
115d0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
115e0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
115f0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
11600 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
11610 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
11620 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
11630 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
11640 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
11650 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11660 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
11670 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
11680 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
11690 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
116a0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
116b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
116c0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
116d0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
116e0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
116f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
11700 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
11710 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
11720 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
11730 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
11740 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
11750 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
11760 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
11770 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
11780 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
11790 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
117a0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
117b0 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
117c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
117d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
117e0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
117f0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
11800 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  */..  if( sqlite
11810 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
11820 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
11830 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  || p==0 ) return
11840 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11850 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11860 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
11870 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
11880 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 1;..  /* If 
11890 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
118a0 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
118b0 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
118c0 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
118d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
118e0 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
118f0 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
11900 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
11910 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d  iParm, aff);.  }
11920 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
11930 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
11940 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
11950 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
11960 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
11970 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
11980 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
11990 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
119a0 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
119b0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
119c0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
119d0 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
119e0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
119f0 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
11a00 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f 72  cate VDBE cursor
11a10 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  s for each table
11a20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
11a30 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  use.  */.  sqlit
11a40 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
11a50 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
11a60 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
11a70 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
11a80 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
11a90 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
11aa0 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
11ab0 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
11ac0 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
11ad0 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
11ae0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
11af0 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
11b00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
11b10 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22  * Expand any "*"
11b20 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
11b30 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20  sult set.  (For 
11b40 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20  example the "*" 
11b50 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20  in.  ** "SELECT 
11b60 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65  * FROM t1")  The
11b70 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73   fillInColumnlis
11b80 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  t() routine also
11b90 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20   does some.  ** 
11ba0 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69  other housekeepi
11bb0 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61  ng - see the hea
11bc0 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
11bd0 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  details..  */.  
11be0 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
11bf0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20  List(pParse, p) 
11c00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
11c10 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57  ct_end;.  }.  pW
11c20 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
11c30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
11c40 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
11c50 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
11c60 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
11c70 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
11c80 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
11c90 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
11ca0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
11cb0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
11cc0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
11cd0 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
11ce0 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
11cf0 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
11d00 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
11d10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11d20 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
11d30 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
11d40 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
11d50 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
11d60 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
11d70 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ssion");.    got
11d80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11d90 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  }..  /* ORDER BY
11da0 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
11db0 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
11dc0 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
11dd0 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
11de0 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20  ase SRT_Union:. 
11df0 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
11e00 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  pt:.    case SRT
11e10 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 63 61  _Discard:.    ca
11e20 73 65 20 53 52 54 5f 53 65 74 3a 0a 20 20 20 20  se SRT_Set:.    
11e30 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
11e40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11e50 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
11e60 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11e70 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
11e80 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  we should have a
11e90 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65  llocated all the
11ea0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
11eb0 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61  .  ** need to ha
11ec0 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73 20 61  ndle subquerys a
11ed0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  nd temporary tab
11ee0 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  les.  .  **.  **
11ef0 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c   Resolve the col
11f00 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f  umn names and do
11f10 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65   a semantics che
11f20 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78  ck on all the ex
11f30 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
11f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
11f50 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11f60 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
11f70 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
11f80 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11f90 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , 0, pEList->a[i
11fa0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
11fb0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11fc0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11fd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
11fe0 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  k(pParse, pEList
11ff0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c  ->a[i].pExpr, 1,
12000 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20   &isAgg) ){.    
12010 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12020 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  d;.    }.  }.  i
12030 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20  f( pWhere ){.   
12040 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12050 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
12060 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
12070 69 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a  ist, pWhere) ){.
12080 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12090 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
120a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
120b0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57  Check(pParse, pW
120c0 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20  here, 0, 0) ){. 
120d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
120e0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
120f0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
12100 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
12110 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
12120 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12130 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
12140 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
12150 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
12160 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NG");.      goto
12170 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12180 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
12190 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
121a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
121b0 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69  t, pEList, pHavi
121c0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
121d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
121e0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
121f0 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
12200 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c  rse, pHaving, 1,
12210 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20   &isAgg) ){.    
12220 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12230 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  d;.    }.  }.  i
12240 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
12250 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
12260 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
12270 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
12280 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
12290 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
122a0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
122b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
122c0 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
122d0 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20  iCol) && iCol>0 
122e0 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d  && iCol<=pEList-
122f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
12300 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
12310 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20  ete(pE);.       
12320 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e   pE = pOrderBy->
12330 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
12340 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
12350 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
12360 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
12370 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12380 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
12390 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
123a0 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
123b0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
123c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
123d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
123e0 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
123f0 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
12400 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
12410 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12420 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
12430 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
12440 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
12450 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12460 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
12470 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20   &iCol)==0 ){.  
12480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12490 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52               "OR
124b0 44 45 52 20 42 59 20 74 65 72 6d 73 20 6d 75 73  DER BY terms mus
124c0 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74  t not be non-int
124d0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29  eger constants")
124e0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
124f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
12510 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
12520 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
12530 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12540 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12550 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12560 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e  "ORDER BY column
12570 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
12580 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
12590 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
125a0 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
125b0 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c  d %d", iCol, pEL
125c0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
125d0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
125e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
125f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12600 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70    }.  if( pGroup
12610 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
12620 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
12630 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12640 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
12650 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47 72    Expr *pE = pGr
12660 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
12670 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  r;.      if( sql
12680 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12690 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20  r(pE, &iCol) && 
126a0 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
126b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
126c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
126d0 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
126e0 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 47 72          pE = pGr
126f0 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
12700 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
12710 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
12720 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
12730 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
12740 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
12750 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
12760 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
12770 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
12780 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
127a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
127b0 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
127c0 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
127d0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
127e0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
127f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12800 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
12810 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
12820 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
12830 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d  ger(pE, &iCol)==
12840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
12850 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12860 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12870 20 20 20 22 47 52 4f 55 50 20 42 59 20 74 65 72     "GROUP BY ter
12880 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
12890 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
128a0 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ants");.        
128b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
128c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
128d0 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
128e0 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
128f0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
12900 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12910 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12920 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63       "GROUP BY c
12930 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
12940 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
12950 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
12960 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
12970 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c   1 and %d", iCol
12980 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
12990 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
129a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
129b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
129c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
129d0 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
129e0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
129f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12a00 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
12a10 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
12a20 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65  t_end;..  /* Ide
12a30 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
12a40 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
12a50 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
12a60 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
12a70 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
12a80 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
12a90 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
12aa0 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
12ab0 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
12ac0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
12ad0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
12ae0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
12af0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
12b00 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
12b10 0a 0a 23 69 66 20 31 20 20 2f 2a 20 49 20 64 6f  ..#if 1  /* I do
12b20 20 6e 6f 74 20 74 68 69 6e 6b 20 77 65 20 6e 65   not think we ne
12b30 65 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ed the following
12b40 20 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 2e 2e   code any more..
12b50 2e 2e 20 2a 2f 0a 20 20 2f 2a 20 49 66 20 74 68  .. */.  /* If th
12b60 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
12b70 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 6e   SRT_Union, then
12b80 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   set the number 
12b90 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  of columns in.  
12ba0 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 73 20 74  ** the records t
12bb0 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
12bc0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74 65  rted into the te
12bd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 54  mporary table. T
12be0 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 63  he caller.  ** c
12bf0 6f 75 6c 64 6e 27 74 20 64 6f 20 74 68 69 73 2c  ouldn't do this,
12c00 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 6c   in case the sel
12c10 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ect statement is
12c20 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20   of the form .  
12c30 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
12c40 4d 20 2e 2e 2e 2e 22 2e 20 0a 20 20 2a 2a 0a 20  M ....". .  **. 
12c50 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 64   ** We need to d
12c60 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 77 65  o this before we
12c70 20 73 74 61 72 74 20 69 6e 73 65 72 74 69 6e 67   start inserting
12c80 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
12c90 65 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  e .  ** temporar
12ca0 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 68  y table (which h
12cb0 61 73 20 68 61 64 20 4f 50 5f 4b 65 79 41 73 44  as had OP_KeyAsD
12cc0 61 74 61 20 65 78 65 63 75 74 65 64 20 6f 6e 20  ata executed on 
12cd0 69 74 29 2c 20 62 65 63 61 75 73 65 0a 20 20 2a  it), because.  *
12ce0 2a 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  * it is required
12cf0 20 62 79 20 74 68 65 20 6b 65 79 20 63 6f 6d 70   by the key comp
12d00 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
12d10 20 53 6f 20 64 6f 20 69 74 20 6e 6f 77 2c 20 65   So do it now, e
12d20 76 65 6e 0a 20 20 2a 2a 20 74 68 6f 75 67 68 20  ven.  ** though 
12d30 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
12d40 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
12d50 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
12d60 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 20 20 2a   on the same.  *
12d70 2a 20 63 75 72 73 6f 72 20 6d 6f 72 65 20 74 68  * cursor more th
12d80 61 6e 20 6f 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  an once..  */.  
12d90 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
12da0 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  nion ){.    sqli
12db0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12dc0 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
12dd0 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
12de0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e  >nExpr);.  }.#en
12df0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
12e00 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
12e10 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
12e20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
12e30 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
12e40 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
12e50 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
12e60 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
12e70 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e  hContext;.    in
12e80 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  t needRestoreCon
12e90 74 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70  text;..    if( p
12ea0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
12eb0 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
12ec0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61  nue;.    if( pTa
12ed0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
12ee0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  e!=0 ){.      zS
12ef0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
12f00 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
12f10 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50  ontext;.      pP
12f20 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
12f30 78 74 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  xt = pTabList->a
12f40 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
12f50 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
12f60 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ext = 1;.    }el
12f70 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  se{.      needRe
12f80 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30  storeContext = 0
12f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12fa0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12fb0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
12fc0 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65  .pSelect, SRT_Te
12fd0 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20 20 20 20  mpTable, .      
12fe0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
12ff0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
13000 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c  r, p, i, &isAgg,
13010 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65   0);.    if( nee
13020 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
13030 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
13040 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
13050 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
13060 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
13070 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
13080 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
13090 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
130a0 20 65 44 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f   eDest!=SRT_Unio
130b0 6e 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  n && eDest!=SRT_
130c0 45 78 63 65 70 74 20 26 26 20 65 44 65 73 74 21  Except && eDest!
130d0 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a  =SRT_Discard ){.
130e0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
130f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
13100 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
13110 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
13120 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
13130 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
13140 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
13150 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20  Distinct;.  }.. 
13160 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
13170 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
13180 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
13190 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
131a0 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
131b0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
131c0 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
131d0 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
131e0 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
131f0 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
13200 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
13210 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
13220 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13230 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
13240 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
13250 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
13260 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
13270 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
13280 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
13290 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
132a0 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
132b0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61   .  */.  if( pPa
132c0 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41  rent && pParentA
132d0 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74  gg &&.      flat
132e0 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
132f0 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72  se, pParent, par
13300 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74  entTab, *pParent
13310 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  Agg, isAgg) ){. 
13320 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a     if( isAgg ) *
13330 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a  pParentAgg = 1;.
13340 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13350 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
13360 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
13370 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
13380 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
13390 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
133a0 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
133b0 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
133c0 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
133d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
133e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
133f0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
13400 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
13410 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a  pOrderBy->a[i].z
13420 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
13430 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
13440 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20  Expr->pColl = . 
13450 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13460 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
13470 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
13480 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31  ->a[i].zName, -1
13490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
134a0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
134b0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
134c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
134d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
134e0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
134f0 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
13500 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
13510 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
13520 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
13530 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
13540 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
13550 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
13560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
13570 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
13580 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13590 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
135a0 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
135b0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
135c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
135d0 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
135e0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
135f0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
13600 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
13610 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  f aggregate expr
13620 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
13630 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
13640 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
13650 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c  ;.  if( isAgg ||
13660 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
13670 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13680 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20  >nAgg==0 );.    
13690 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66  isAgg = 1;.    f
136a0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
136b0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
136c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
136d0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
136e0 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
136f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
13710 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
13720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13730 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
13740 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13750 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
13760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13770 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
13780 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
13790 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
137a0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
137b0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
137c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
137d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
137e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
137f0 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
13800 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
13810 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
13820 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
13830 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
13840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
13850 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
13860 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
13870 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
13880 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
13890 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
138a0 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
138b0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
138c0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
138d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
138e0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
138f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13900 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74   }..  /* Reset t
13910 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20  he aggregator.  
13920 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
13930 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d  {.    int addr =
13940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13950 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74  p(v, OP_AggReset
13960 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67  , 0, pParse->nAg
13970 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  g);.    for(i=0;
13980 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
13990 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e   i++){.      Fun
139a0 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20  cDef *pFunc;.   
139b0 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20     if( (pFunc = 
139c0 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
139d0 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75  pFunc)!=0 && pFu
139e0 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  nc->xFinalize!=0
139f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13a00 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
13a10 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20  _AggInit, 0, i, 
13a20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33  (char*)pFunc, P3
13a30 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
13a40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13a50 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
13a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a70 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
13a80 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
13a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13aa0 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63  dOp(v, OP_AggFoc
13ab0 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  us, 0, 0);.    }
13ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13ad0 73 7a 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49  sz = sizeof(KeyI
13ae0 6e 66 6f 29 20 2b 20 70 47 72 6f 75 70 42 79 2d  nfo) + pGroupBy-
13af0 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f  >nExpr*sizeof(Co
13b00 6c 6c 53 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b  llSeq*);.      K
13b10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28  eyInfo *pKey = (
13b20 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65  KeyInfo *)sqlite
13b30 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20  Malloc(sz);.    
13b40 20 20 69 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b    if( 0==pKey ){
13b50 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
13b60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13b70 7d 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e  }.      pKey->en
13b80 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
13b90 65 6e 63 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  enc;.      pKey-
13ba0 3e 6e 46 69 65 6c 64 20 3d 20 70 47 72 6f 75 70  >nField = pGroup
13bb0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
13bc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
13bd0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
13be0 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d  ){.        pKey-
13bf0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
13c00 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
13c10 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
13c20 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
13c30 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79 2d        if( !pKey-
13c40 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
13c50 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f         pKey->aCo
13c60 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  ll[i] = pParse->
13c70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
13c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13ca0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
13cb0 64 72 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  dr, (char *)pKey
13cc0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
13cd0 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  DOFF);.    }.  }
13ce0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
13cf0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  e the memory cel
13d00 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20  l to NULL.  */. 
13d10 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
13d20 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Mem ){.    sqlit
13d30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13d40 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
13d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13d60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
13d70 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
13d80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
13d90 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
13da0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
13db0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
13dc0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73    */.  if( isDis
13dd0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73  tinct ){.    dis
13de0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
13df0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e  nTab++;.    open
13e00 54 65 6d 70 49 6e 64 65 78 28 70 50 61 72 73 65  TempIndex(pParse
13e10 2c 20 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  , p, distinct, 0
13e20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13e30 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
13e40 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74   }..  /* Begin t
13e50 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
13e60 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d  .  */.  pWInfo =
13e70 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
13e80 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
13e90 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  ist, pWhere, 0, 
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 47 72               pGr
13ec0 6f 75 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72  oupBy ? 0 : &pOr
13ed0 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 57  derBy);.  if( pW
13ee0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
13ef0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
13f00 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
13f10 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
13f20 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
13f30 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
13f40 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
13f50 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
13f60 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
13f70 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
13f80 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
13f90 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
13fa0 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
13fc0 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
13fd0 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
13fe0 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20  Break, aff) ){. 
13ff0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
14000 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
14010 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
14020 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67   dealing with ag
14030 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64  gregates, then d
14040 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67  o the special ag
14050 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f  gregate.  ** pro
14060 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a  cessing.  .  */.
14070 20 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45    else{.    AggE
14080 78 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69  xpr *pAgg;.    i
14090 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
140a0 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20       int lbl1;. 
140b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
140c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
140d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
140e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
140f0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
14100 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
14110 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e      }.      /* N
14120 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
14130 67 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  g is attached to
14140 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f   the following O
14150 50 5f 4d 61 6b 65 4b 65 79 20 0a 20 20 20 20 20  P_MakeKey .     
14160 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 64   ** because we d
14170 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f  o not need to do
14180 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66   any coercion of
14190 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20   datatypes. */. 
141a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
141b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
141c0 4b 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Key, pGroupBy->n
141d0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
141e0 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64  lbl1 = sqlite3Vd
141f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14210 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
14220 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b  Focus, 0, lbl1);
14230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
14240 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67  pAgg=pParse->aAg
14250 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  g; i<pParse->nAg
14260 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b  g; i++, pAgg++){
14270 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67  .        if( pAg
14280 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  g->isAgg ) conti
14290 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
142a0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
142b0 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72  rse, pAgg->pExpr
142c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
142d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
142e0 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b  P_AggSet, 0, i);
142f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14300 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14310 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b  eLabel(v, lbl1);
14320 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
14330 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d  =0, pAgg=pParse-
14340 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d  >aAgg; i<pParse-
14350 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67  >nAgg; i++, pAgg
14360 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
14370 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  *pE;.      int n
14380 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e 63  Expr;.      Func
14390 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
143a0 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41 67   if( !pAgg->isAg
143b0 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
143c0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
143d0 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20  ->pFunc!=0 );.  
143e0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
143f0 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d  ->pFunc->xStep!=
14400 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  0 );.      pDef 
14410 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20  = pAgg->pFunc;. 
14420 20 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d 3e       pE = pAgg->
14430 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
14440 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
14450 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
14460 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
14470 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  ION );.      nEx
14480 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
14490 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
144a0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b  rse, pE->pList);
144b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
144c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
144d0 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
144e0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
144f0 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
14500 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
14510 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oll = 0;.       
14520 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
14530 66 6f 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20  for(j=0; !pColl 
14540 26 26 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  && j<nExpr; j++)
14550 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
14560 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
14570 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14580 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
14590 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
145a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
145b0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
145c0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
145d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  oll;.        sql
145e0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
145f0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
14600 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
14610 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
14620 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14630 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
14640 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70  AggFunc, 0, nExp
14650 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
14660 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
14670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64   }.  }..  /* End
14680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
14690 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
146a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
146b0 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
146c0 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73  f we are process
146d0 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20  ing aggregates, 
146e0 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75  we need to set u
146f0 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a  p a second loop.
14700 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
14710 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76   the aggregate v
14720 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73  alues and proces
14730 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  s them..  */.  i
14740 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
14750 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c  int endagg = sql
14760 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14770 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  l(v);.    int st
14780 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72  artagg;.    star
14790 74 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64  tagg = sqlite3Vd
147a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
147b0 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67  gNext, 0, endagg
147c0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75  );.    pParse->u
147d0 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69  seAgg = 1;.    i
147e0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
147f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
14800 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
14810 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67  Having, startagg
14820 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
14830 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
14840 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
14850 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
14860 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
14870 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
14880 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
14890 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64  m, startagg, end
148a0 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  agg, aff) ){.   
148b0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
148c0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
148d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
148e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
148f0 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
14900 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14910 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b  abel(v, endagg);
14920 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14930 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
14940 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
14950 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b  rse->useAgg = 0;
14960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14970 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
14980 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
14990 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
149a0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
149b0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
149c0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
149d0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
149e0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
149f0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
14a00 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
14a10 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
14a20 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
14a30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
14a40 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
14a50 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
14a60 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
14a70 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
14a80 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
14a90 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20  ble.  So delete 
14aa0 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72  the subquery str
14ab0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
14ac0 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70  parent.  ** to p
14ad0 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71  revent this subq
14ae0 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
14af0 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
14b00 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
14b10 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
14b20 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14b30 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
14b40 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
14b50 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
14b60 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
14b70 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
14b80 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
14b90 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
14ba0 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
14bb0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
14bc0 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70  Delete(p);.    p
14bd0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
14be0 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
14bf0 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
14c00 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
14c10 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
14c20 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
14c30 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
14c40 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
14c50 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
14c60 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
14c70 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
14c80 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
14c90 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
14ca0 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
14cb0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
14cc0 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
14cd0 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
14ce0 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  ct_end:.  sqlite
14cf0 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73  AggregateInfoRes
14d00 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  et(pParse);.  re
14d10 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.